在pygame中使乒乓球正确弹跳的方法

3
我的代码似乎有时可以工作,但大部分时间球似乎只是随意移动。我为球类分配了一个角度,它会根据屏幕顶部和底部以及玩家挡板的碰撞而改变,但有时球似乎会忽略逻辑和“if”语句。我确定我只是缺少一些简单的东西,但任何帮助都将不胜感激。
注意:“T_RECT”和“B_RECT”分别代表屏幕顶部和底部。
 if (gameBall.rect.colliderect(T_RECT) or gameBall.rect.colliderect(B_RECT)) and bounce == 0:
        gameBall.angle = 545 - gameBall.angle
        bounce = 1
    if (gameBall.rect.colliderect(redPlayer.rect) or gameBall.rect.colliderect(bluePlayer.rect)) and bounce == 0:
        gameBall.angle =  365 - gameBall.angle
    else: bounce = 0

1
当逻辑和if语句被忽略时,具体会出现哪些症状? - ouflak
从您的代码来看,我怀疑您假设每个条件都被检查,然后基于此决定是否继续执行语句。但是,对于大多数编译器来说,这几乎肯定不是这种情况。它们将优化这些条件检查,并且只要满足一个真实条件,代码就会继续执行,而不会检查条件中的其他内容。 - ouflak
1
什么东西确切地无法运行?发生了什么?应该发生什么? - pts
你的球的速度是否足够快,以至于在反弹后仍然处于碰撞状态?这可能会导致它保持在反弹循环中,使球基本上卡在矩形上。或者可能只是类似的边缘情况。 - woot
换句话说,为了扩展woot的解释,您应该独立检查它是否命中T_RECT或B_RECT。在第一种情况下,只有当前“向上”时才应更改角度;在第二种情况下,只有当前“向下”时才应更改角度。 - Armin Rigo
1个回答

0

在进行这种球/弹跳碰撞时,我遇到了很多麻烦。

我找到的最简单的解决方案是:

- 在X轴上移动球

- 检查碰撞,如果发生碰撞,则修复它并对其做出反应(在大多数情况下,反转x方向)

- 在Y轴上执行相同的操作。

我曾经因此而抓狂。现在我单独更新/检查轴。效果非常好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接