C#Rectangle.Contains Win10错误

时间:2016-08-12 19:23:35

标签: c# winforms

虽然我想要一个简单的Pong游戏的代码,我有一个我的学生写,我们遇到了一个我无法重现或弄清楚的错误。

违规代码如下:

if (this.ball.X <= this.p1.paddle.Right)
{
    this.newball = !this.p1.paddle.Contains(this.ball.Location); // bug here????
    if (!this.newball) { lasthit = this.p1; }
}

注意:球没有可变速度(每帧+/- 10 px),每个球拍宽度为20像素,球拍和球都是Rectangle类型。

这很简单:如果球小于球拍的右边缘,请检查球是否包含在球拍中。如果球拍包含球,那么球被球拍“击中”,因此新球不需要产生。

问题:即使球直接位于球拍中间,也会设置newball标志(通过逐步调试并确认X,Y值确认)每个都确认ball确实包含在paddle中。

警告:此代码完全按照预期在我的Windows 7计算机和我的其他Windows VM上运行,我可以对此进行测试,而代码每次都会在我的学生的Windows 10计算机上生成错误

我从他的机器上复制了项目/解决方案并直接在我的机器上运行(两者都运行VS2012 .NET 4),并且桨叶位于相同的位置(中心屏幕),因此球应该“反弹”,然后打开我的预期“按照预期”反弹,而他的“新球”则被催生了。更有趣的是播放器2桨在两台机器上都按预期响应。

我们重新启动了他的Visual Studio实例,并在他的机器上直接运行可执行文件(在调试和发布中),每次都会导致错误。

我从未见过像这样的问题(特别是使用C#),我们没有使用任何高级语言功能,因为它只是一个教学练习来理解语义,范围等等,所以我不确定为什么!this.p1.paddle.Contains(this.ball.Location)可以在任何机器上以不同的方式工作?

之前有没有人见过这样的问题?是否有任何其他环境设置我可以在他的机器上查看,看看为什么会导致错误?

我可以根据要求发布剩余的学生代码(仅约200行),但其余代码不存在问题。

1 个答案:

答案 0 :(得分:1)

这是错误的(第142行):

   if (dx < 0) {
                if (this.ball.X <= this.p1.paddle.Right)

更改为

   if (dx < 0) {
                if (this.ball.X < this.p1.paddle.Right)

左桨也按预期工作。

请注意

Rectangle r = new Rectangle(10, 10, 20, 100);
Point p1 = new Point(10, 30);
Point p2 = new Point(30, 30);
bool test1 = r.Contains(p1);   // true
bool test2 = r.Contains(p2);   // false

test2false,因为矩形从x = 10到x = 29!

我无法测试早期的操作系统atm,但我怀疑这种情况有所不同......但也许球的移动方式不同?