我正在制作这个快速乒乓球游戏并使用 hitTestObject 检查碰撞。应该不是问题,因为无论如何一切都是矩形的。向量中的每个球都在检查它是否每帧都与桨发生碰撞。为什么每个球直到它通过它大约一半才触发碰撞?我不能比 enter_frame 更频繁地调用函数,或者我可以吗?我只是似乎它的更新速度不够快或其他什么。
if (ball[i].hitTestObject(paddle)){
// Flip
ball[i] *= -1;
}
快速图片:
我正在制作这个快速乒乓球游戏并使用 hitTestObject 检查碰撞。应该不是问题,因为无论如何一切都是矩形的。向量中的每个球都在检查它是否每帧都与桨发生碰撞。为什么每个球直到它通过它大约一半才触发碰撞?我不能比 enter_frame 更频繁地调用函数,或者我可以吗?我只是似乎它的更新速度不够快或其他什么。
if (ball[i].hitTestObject(paddle)){
// Flip
ball[i] *= -1;
}
快速图片:
我认为这是因为当您进行击球测试时,球就在那儿,因为它只检查瞬时位置而不是平滑的运动线。换句话说,如果在一帧上球的边缘距离球拍 5px,那么击球测试将是错误的。如果球在下一帧移动了 8px,命中测试将为真,但球边缘将在球拍内 3px。
当我有一个像这样的简单平坦边缘要测试时,我倾向于按照这些思路做一些事情(给定一个带有speedY
和radius
变量的球,并且paddle.y
== 桨的前缘):
if (ball.y + ball.radius > paddle.y) {
// Mirror the ball's speed
ball.speedY *= -1;
// Mirror the ball's location as if it had bounced on the edge
// by moving it back by the same distance it went past.
ball.y -= (ball.y + ball.radius - paddle.y) * 2;
}
你需要在这里做的是更新球的位置,这样一旦发生碰撞,它就会靠在桨的边缘。
您目前遇到的问题是,如果您的球以每帧 12 像素的速度行进并且距离球棒 2 像素,那么球将在下一帧绕过球棒边缘 10 像素并为您提供视觉效果你看到的结果。
if( /* your hit detection */ )
{
// Move the ball so that it's sitting against the paddle here.
//
}