我目前正在创建一个类似于乒乓球的大学作业游戏。为了让您大致了解游戏的工作原理,屏幕底部有一个水平移动的桨。还有一个球将围绕屏幕移动,并且玩家必须通过使用桨来阻止球离开屏幕的底部。每次球击中屏幕顶部时,玩家都会获得一分。
我已经设法让大部分游戏都能正常运行,但我在球和桨之间的碰撞方面遇到了一些问题。目前,如果球以每帧1个像素的速度移动,则碰撞工作正常。然而,对于规范,球速必须是可变的,因此球需要能够在所有速度下与桨叶正确地碰撞。
我目前用于碰撞的代码如下:
if((ball.y+5) == (bat.y))
{
if(ball.x >= bat.x && ball.x <= (bat.x+40))
{
ball.dy = -ball.dy;
game.goingUp = true;
}
}
基本上,这将测试球的坐标是否等于球拍的坐标,如果这是真的,将改变球的方向。然而,由于这具有特定的坐标,球可以以更高的速度完全穿过球棒。
我想要做的是让这次碰撞以每帧10个像素的速度工作,但我真的不知道如何做到这一点,真的很感激任何帮助。
答案 0 :(得分:1)
我认为解决这个问题的方法是他们称之为清扫。取最后一个位置和当前位置,创建一条线(如果你做更复杂的对象,则创建一个更大的矩形),然后用它进行碰撞检查。
应该注意的是,任何大于像素的东西都可以相对简单地表示为矩形或圆形的边界框。
答案 1 :(得分:0)
这是我的第一个丑陋的解决方案(让我的创意果汁流动)。但是我还没有对它进行过测试,我怀疑它的准确性。
使用&gt; = 会告诉您是否会发生碰撞(假设您当时排在x轴上):
if((ball.y+5) >= (bat.y)
然后,只有处理碰撞时左右两侧的问题。如果你跟踪你沿着x轴移动了多远,你可以尝试估计你在什么时候(ball.y + 5)== bat.y.也许是这样的事情:
// Assuming this is how you keep track of your old position:
int x_difference = ball.x - ball.last_x;
int y_difference = ball.y - ball.last_y;
float percent = (bat.y - (ball.last_y+5)) / float(y_difference); // how far through your last move were you when you crossed the bat's y position
int x_at_collision = ball.x + (percent * x_difference);
现在你可以修改你的另一行:
if(x_at_collision >= bat.x && x_at_collision <= (bat.x+40))