【问题标题】:Pygame - detect collision directionPygame - 检测碰撞方向
【发布时间】:2017-05-22 18:25:11
【问题描述】:

所以我开始了一些大型的 pygame 项目,一切都或多或少地顺利。

但现在我真的很困惑如何检测碰撞的方向。

所以我得到了我的角色(2d sidescroller)和一个精灵组,用于现在所有矩形的障碍物。然而,现在碰撞检测工作正常,但是如果是这样,那么如何检测到障碍物的哪一侧与字符 rect 发生碰撞?


如果有人stumbles upon this question 添加:我最终实施的 janky 解决方案使用了一个“脚手架”,每个障碍物有四个(不可见)线,每侧一个。一旦检测到与特定障碍物的碰撞,我在字典中查找碰撞矩形周围的四条线,然后检查这些线中的哪一条当前正在与玩家精灵发生碰撞。它有点工作,但整个项目还是一团糟。

【问题讨论】:

  • 获取两个对象的坐标并检查它们之间的关系。这取决于你想要的答案有多精细,但如果你只考虑一维,那么如果你知道有碰撞,你可以检查它们的 x 坐标的关系,看看障碍物的哪一侧是角色。
  • 顺便说一句,这是您的第一个问题:您应该阅读一些有关如何提出好问题的信息,即发布相关代码等。如果人们真的知道您需要什么,那么提供帮助会容易得多帮助:)
  • @fbence 感谢您的回复,但是我如何才能获得从组中碰撞出来的特定障碍?
  • @fbence 当然,我想不出任何有用的代码部分
  • 也许你的代码中定义了障碍物,而检测碰撞的部分可能很有用。在 pygame 中有一些方法可以做到这一点。此外,如果您认为 cmets 正在缩小您的实际问题范围(即您真的有兴趣了解发生碰撞的对象等),您可以编辑您的问题。

标签: python pygame


【解决方案1】:

有许多包含碰撞检测的 2D 物理库,通常像您所说的大型项目需要其他物理,例如约束、射线投射和物体。一个很棒的 python 库是 pyBox2D 并且在他们的github 上有很好的文档。 pyBox2D 还将为您完全处理碰撞,但您也可以设置自定义碰撞处理程序。
对于您询问如何检查矩形碰撞的位置的问题,您可以使用这样给出的 pygame.Rect 变量来做到这一点

import pygame


def determineSide(rect1, rect2):
    if rect1.midtop[1] > rect2.midtop[1]:
        return "top"
    elif rect1.midleft[0] > rect2.midleft[0]:
        return "left"
    elif rect1.midright[0] < rect2.midright[0]:
        return "right"
    else:
        return "bottom"

rect1 = pygame.Rect(100, 100, 20, 20)
rect2 = pygame.Rect(100, 90, 20, 20)
print(determineSide(rect1, rect2))  

请注意,这不会检查碰撞,而只是检查 rect2 相对于 rect1 的位置。

【讨论】:

    【解决方案2】:

    也许您可以检查一个Rect 的四个角中的哪一个或两个在另一个内部。但是,有一个问题 - 如果Rects 与角落接触,那么接下来该做什么取决于程序的其余部分。我自己还没有为此编写代码 sn-p,但我也在开发平台游戏并计划创建一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多