碰撞时,2D矩形应停止移动

时间:2014-10-17 14:59:53

标签: c# collision detection rectangles

我创建了两个矩形,你可以用其中一个移动和跳跃,另一个在Form上静止不动。 我希望障碍物能够作为一个障碍物(或者如果你愿意的话就是一堵墙),基本上我希望可移动的矩形在其右侧与障碍物的左侧碰撞时停止(等等)。

我发现这段代码如何 NOT 检测文章中两个矩形之间的碰撞(因为它显然更容易检测不到碰撞):

OutsideBottom = Rect1.Bottom < Rect2.Top
OutsideTop = Rect1.Top > Rect2.Bottom
OutsideLeft = Rect1.Left > Rect2.Right
OutsideRight = Rect1.Right < Rect2.Left
//or
return NOT (
(Rect1.Bottom < Rect2.Top) OR
(Rect1.Top > Rect2.Bottom) OR
(Rect1.Left > Rect2.Right) OR
(Rect1.Right < Rect2.Left) )

但我不确定如何实现它。我有一个名为“player1.left”的bool,当我按下键盘上的'A'('D'向右移动,'W'跳转)时,它变为真,当为true时,将矩形移动10个像素到left(在Timer_Tick事件中)。

修改

“rect1.IntersectsWith(rect2)”用于检测碰撞。但是如果我想让可移动的矩形停止向右移动(但仍然能够跳跃并向左移动),如果它的右侧与障碍物的左侧碰撞,我将如何使用它(if-statement内应该是什么)一边(等等)?

1 个答案:

答案 0 :(得分:1)

// UPDATE 假设你有一个继承自Rectangle的类PlayableCharacter。

public class PlayableCharacter:Rectangle {

  //position in a cartesian space
  private  int _cartesianPositionX;
  private  int _cartesianPositionY;

  //attributes of a rectangle
  private  int _characterWidth;
  private  int _characterHeight;

  private bool _stopMoving=false;


    public PlayableCharacter(int x, int y, int width, int height)
    {
       this._cartesianPositionX=x;
       this._cartesianPositionY=y;
       this._chacterWidth=width;
       this._characterHeight=height;
    }

    public bool DetectCollision(PlayableCharacter pc, PlayableCharacter obstacle)
    {

     // this a test in your method
        int x=10;
        if (pc.IntersectsWith(obstacle)){
            Console.Writeline("The rectangles touched");
            _stopMoving=true;
            ChangeMovingDirection(x);
            StopMoving(x);
        }

    }

   private void ChangeMovingDirection(int x)
   {
     x*=-1;
     cartesianPositionX+=x;
   }


  private void StopMoving(int x)
  {

     x=0;
     cartesianPositionX+=x;
  }

}

在我给你的代码中,在角色向右的情况下,x值为正,角色将面向另一个方向。如果他向左移动,如果他与障碍物碰撞,他将面向另一个方向。

使用StopMoving,即使你创建了一个在循环中随时间运行的脚本,它也永远不会让角色移动。

我认为这应该为你的工作奠定基础。如果有任何问题,请评论我写的解决方案,如果我能够达到目标,我会尽力帮助你。