碰撞检测在乒乓球比赛的角落案件引起的问题



我制作了一款乒乓球游戏,到目前为止一切都很好。我对球的球拍进行了碰撞,除非球碰到角落,否则它可以正确地将球拍弹开。

这是一段当球碰到其中一个球拍的角落时会发生什么的视频。

https://drive.google.com/file/d/1nyRzsp5tn5Qvst7kVjtlr_rDNH98avbA/view?usp=sharing

从本质上讲,你可以在视频中看到的是,球击中了左侧角落的球拍,它没有反弹,只是向下穿过球拍,然后继续前进,他们得到了一分。这是我的碰撞测试代码

public void collision() {
this.width = (float) getBounds().width;
this.height = (float) getBounds().height;
for (int i = 0; i < handler.objects.size(); i++) {
if (handler.objects.get(i).getId() == ID.ball) {
GameObject current = handler.objects.get(i);
if (getBounds().intersects(current.getBounds())) {
current.setVx(current.getVx() * -1);
}
}
}
}

getBounds是一个重写的方法,它只为球(一个圆(和球拍返回一个矩形

如果需要,我很乐意提供更多的代码。

这方面的任何帮助都将是伟大的,谢谢!

每次击打球拍时,即使在下一帧中仍在触摸球拍,也会交换速度方向。解决方案是仅当球朝向球拍时,而不是当(已经(离开时,才切换速度方向。伪代码可以看起来像这样:

if (GeometryUtil.isDirectionGoingDown(direction)) {
if (GeometryUtil.isBallHittingHorizontalLine(
newPosition,
Ball.RADIUS,
paddleTopLeft,
paddleTopRight)) {
direction = calculateNewDirectionAfterHittingPaddle(
direction,
paddlePosition,
newPosition);
ball.setDirection(direction);
}
}

这里的GeometryUtil.isDirectionGoingDown()方法是检查球是否真的在下降。这样,只有当该条件返回true时,才设置新的方向。当在一帧中交换了方向时,下一帧将不会再次交换方向,因为此时GeometryUtil.isDirectionGoingDown()将返回false

最新更新