对象与窗口窗体的冲突检测逻辑无法正常工作



我正在尝试检测表单中的对象何时大于表单本身。执行此操作时,应显示一个消息框,其中包含文本"游戏结束"。

这是我所做的:

对于 x 轴

  private void CollisionXForward()
    {
        int x = this.Width; //the width of the form is 493
        //if the position of x-axis of the rectangle goes over the limit of the form...
        if (rc.PositionX  >= x )
        {
           //...game over
            MessageBox.Show("Game over");
        }
        else
        {
              //move the object +5 every time i press right arrow
            rc.MoveXForward();
        }

问题是矩形消失了,因为它比框架本身更进一步。我已经通过以下语句"解决"了问题:

if (rc.PositionX  >= x - (rc.Width * 2))

而不是您在代码中看到的正常代码。但是当我对 y 轴执行相同的操作或更改矩形的大小时,它不起作用。

尝试:

if (rc.PositionX + rc.Width >= ClientRectangle.Width)

if (rc.PositionY + rc.Height >= ClientRectangle.Height)

编辑:

private void CollisionXForward()
{
    rc.MoveXForward();
    //if the position of x-axis of the rectangle goes over the limit of the form...
    if (rc.PositionX + rc.Width >= ClientRectangle.Width )
    {
       //...game over
        MessageBox.Show("Game over");
    }
}

private void CollisionXForward()
{
    //if the position of x-axis of the rectangle goes over the limit of the form...
    if (rc.PositionX + step + rc.Width >= ClientRectangle.Width ) //step is 5 in your case
    {
       //...game over
        MessageBox.Show("Game over");
    }
    else
    {
        //move the object +5 every time i press right arrow
        rc.MoveXForward();
    }
}

瓦尔特

给你的rc对象一个返回RectangleBoundingBox属性。然后测试变得容易

if (this.ClientRectangle.Contains(rc.BoundingBox)) {
    rc.MoveXForward();
} else {
    MessageBox.Show("Game over");
}

如果您需要为步骤留出空间,请像这样测试:

if (this.ClientRectangle.Contains(rc.BoundingBox.Inflate(step, step))) {
    rc.MoveXForward();
} else {
    MessageBox.Show("Game over");
}

public class MyRcClass
{
   ...
   public Rectangle BoundingBox
   {
       get { return new Rectangle(PositionX, PositionY, Width, Height); }
   }
}

相关内容

  • 没有找到相关文章

最新更新