y轴上的碰撞检测不起作用(pygame)

时间:2018-02-08 21:23:09

标签: python python-3.x pygame

我正试图让我的代码中的碰撞检测工作。我正在使用向量,我希望玩家精灵在与名为walls的精灵组发生碰撞时发生碰撞并停止。问题是玩家可以穿过底壁。

我在这个例子中关闭了重力。

x碰撞是可以的,但它有点滑稽,只有y方向才能使用相同的代码正常工作。

我已经尝试使用调试器调试代码无济于事。

我主要想知道垂直碰撞检测为什么不起作用,但我也很欣赏有关水平碰撞检测的建议。

LINKS: Github:Complete code

当前碰撞检测代码:

def collide_with_walls(self, dir):
    if dir == 'x':
        hits = pg.sprite.spritecollide(self, self.game.walls, False)
        if hits:
            if self.pos.x > 0:
                self.pos.x = hits[0].rect.left - self.rect.width
            if self.pos.x < 0:
                self.pos.x = hits[0].rect.right
            self.rect.x = self.pos.x
    if dir == 'y':
        hits = pg.sprite.spritecollide(self, self.game.walls, False)
        if hits:
            if self.pos.y >= 0:
                self.pos.y = Wall.rect.top - self.rect.height / 2
            if self.pos.y < 0:
                self.pos.y = hits[0].rect.bottom
            self.rect.y = self.pos.y

1 个答案:

答案 0 :(得分:1)

据我所知,您的水平移动和碰撞检测工作正常。我再次启用了垂直运动,只需修复一些东西。 Wall必须更改为hits[0],触摸墙后必须将y速度设置为0

def collide_with_walls(self, dir):
    if dir == 'x':
        hits = pg.sprite.spritecollide(self, self.game.walls, False)
        if hits:
            if self.pos.x > 0:
                self.pos.x = hits[0].rect.left - self.rect.width
            if self.pos.x < 0:
                self.pos.x = hits[0].rect.right
            self.rect.x = self.pos.x
    if dir == 'y':
        hits = pg.sprite.spritecollide(self, self.game.walls, False)
        if hits:
            if self.pos.y >= 0:
                # `Wall` had to be changed to `hits[0]`.
                self.pos.y = hits[0].rect.top - self.rect.height
            if self.pos.y < 0:
                self.pos.y = hits[0].rect.bottom
            self.rect.y = self.pos.y
            self.vel.y = 0  # Stop the player, otherwise he'll keep accelerating.

还有一个问题:如果玩家精灵下降得太长,它会加速并向下移动得如此之快,以至于它可以跳过与墙壁的碰撞检测并且只会通过它。确保精灵不能跳过碰撞检测,通过限制它可以下降的距离,给它一个最大速度或简单地通过使墙壁更厚。您也可以使用光线投射,但实现起来会有点复杂。