我正在尝试检测表单中的对象何时大于表单本身。执行此操作时,应显示一个消息框,其中包含文本"游戏结束"。
这是我所做的:
对于 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
对象一个返回Rectangle
的BoundingBox
属性。然后测试变得容易
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); }
}
}