我正试图让我的代码中的碰撞检测工作。我正在使用向量,我希望玩家精灵在与名为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
答案 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.
还有一个问题:如果玩家精灵下降得太长,它会加速并向下移动得如此之快,以至于它可以跳过与墙壁的碰撞检测并且只会通过它。确保精灵不能跳过碰撞检测,通过限制它可以下降的距离,给它一个最大速度或简单地通过使墙壁更厚。您也可以使用光线投射,但实现起来会有点复杂。