虽然我想要一个简单的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行),但其余代码不存在问题。
答案 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
test2
为false
,因为矩形从x = 10到x = 29!
我无法测试早期的操作系统atm,但我怀疑这种情况有所不同......但也许球的移动方式不同?