如何在Pygame中防止精灵穿过物体?

3

我一直在开发一款游戏,到目前为止最大的问题是我们无法让玩家与场上的任何物体碰撞。相反,他们会穿过树木。有人知道原因吗?这是我用于碰撞检测的代码:

for tree in treelist:


    if self.player.rect.x == tree.rect.x:
        self.player.rect.x == self.player.rect.x - 2
    if self.player.rect.x == tree.rect.x + tree.rect.width:
        self.player.rect.x == self.player.rect.x + 2

    if self.player.rect.y == tree.rect.y:
        self.player.rect.y == self.player.rect.y - 2
    if self.player.rect.y == tree.rect.y + tree.rect.height:
        self.player.rect.y == self.player.rect.y + 2

这个理论听起来靠谱吗?还是我做错了什么?

这里有一个完整的自上而下视角示例和一个基本的平台游戏。自上而下视角示例基本平台游戏 - skrx
2个回答

3
你是否在使用pygame?如果是,那么有内置的colliderect函数(文档在这里)。
如果没有:
  • 这里是一个相对深入的讨论,专门针对平台游戏。
  • 这个只是基本的2D轴对齐(即未旋转)矩形碰撞检测。
请记住,物体移动得非常快会使碰撞检测变得非常困难,因为它们在一帧的时间内就“穿过”了物体!有更高级的技术来解决这个问题,但现在,请尝试使你的碰撞框相对较大,并且物体移动相对较慢。
编辑:哎呀,我的第一句话听起来很粗鲁。我不知道这篇文章的标题是什么...

谢谢!我们在尝试使用collidedetect时遇到的主要问题是,我们无法使玩家做出适当的反应。由于游戏是俯视视角,我们永远无法让玩家正确地后退移动。 - Logan Henry
移动回去 = 在屏幕上向下移动?还是在碰撞后移动? - nchen24
这是一款俯视视角的游戏。当玩家撞到树上时,玩家会直接穿过树。我们可以检测到碰撞,但是当我们这样做时,我们不能让玩家从树上“弹回来”。 - Logan Henry
最好有多个碰撞箱。这对于平台游戏几乎总是必要的,因为你希望玩家在与墙壁碰撞时停止水平移动,但当他们的“脚”触地时不会停止。当你说"bounce"(反弹)时,你真的意思是他应该反弹吗?这种行为有点棘手,因为你需要建立一些“反弹回来”的帧数,仅测试一个碰撞帧是不够的。 - nchen24

2
几乎是正确的理论。你只检查了player矩形位置是否与tree矩形位置的边界完全相同。这种情况很少发生。你还需要检查玩家是否在树的边界之间,代码应该更像这样:
# check if player is overlapping the tree
if tree.rect.x <= self.player.rect.x <= tree.rect.x + tree.rect.width:
    # decide on how to move player away from the tree depending on previous frame
    # if player is moving forward, send them backwards from tree
    if self.player.rect.prev_x < self.player.rect.x:
        self.player.rect.x -= 2
    # otherwise send them forwards from tree
    else:
        self.player.rect.x += 2

重叠检查的确切逻辑以及如果发生重叠时的反应完全由您决定,但这种方法应该有效。请注意,您需要跟踪玩家在上一帧中的位置,否则您将不知道他们从哪个方向撞击了树。您可以像这样进行:

self.player.rect.prev_x = self.player.rect.x
self.player.rect.x += player_velocity

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