【问题标题】:Initial Collision Detection in PygamePygame 中的初始碰撞检测
【发布时间】:2015-08-05 06:46:33
【问题描述】:

我最近在我的 Pygame 项目中遇到了一个简单的碰撞检测测试问题。我故意不使用 Sprite 类和 Pygame 提供的一些内置碰撞函数用于学习目的。我遇到的问题不是没有检测到碰撞。问题是碰撞持续的时间比它们应该的要长。

如果你运行我的代码,你会看到随机从屏幕上掉下来的Obstacle 对象在一段时间内穿过Player 对象,即使它们已经消失了。 collisions 计算 Obstacle 穿过 Player 的坐标数,它通常介于 -17 到 -21 之间。为什么会这样?既然声明了布尔值obstacle.exists = False,那么Obstacle 对象是否应该在它有时间通过​​Player -17 到-21 相交坐标之前立即销毁?这可能是由fps问题引起的吗? 基本上,我想弄清楚的是如何让Obstacle 在碰撞时立即被销毁,这样collisions 只减去一次。

【问题讨论】:

  • 有些不相关,但您可能希望使用 if variableif not variable 而不是 == True== False 来测试布尔值。
  • @MathiasEttinger 感谢您提供信息。看看我能不能把东西清理干净!
  • 您在碰撞检测中的测试也是不需要的:if obstacles.exists == False 就在obstacles.exists = False 之后。 collided 也一样。

标签: python pygame collision-detection


【解决方案1】:

无论是否存在障碍物,都会进行碰撞检测。您应该添加obstacles.exists 作为碰撞检测的第一个测试:

if (obstacles.exists and 
        obstacles.x < player.x + player.w and
        obstacles.x + obstacles.w > player.x and
        obstacles.y < player.y + player.h and
        obstacles.h + obstacles.y > player.y):
    #do stuff

【讨论】:

  • 再次感谢您的帮助!这正是我需要的。最后一件事......由于obstacles.exists 现在是False,似乎从那时起,obstacles 将无法继续生成,除非他们的obstacle.exists 再次成为True?跨度>
  • 也许这就是使用if variable or if not variable 发挥作用的地方
  • @tear728 一点也不,if variable 语法只是消除了代码中的冗余。可以实现您想要生成多个障碍物的目标 1) 重新实例化一个新障碍物(在碰撞检测结束时 obstacles = Obstacle(new_x, new_y) (例如在 else 之前)或在没有任何障碍物时随机:@987654332 @ 或 2) 通过使用障碍物列表并一次生成多个障碍物。在这种情况下,exists 属性将不再有用,从列表中移除障碍就足够了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多