玩家陷入墙式pygame

时间:2020-01-30 14:47:11

标签: python pygame

每当玩家与墙壁碰撞时,他们只会卡在墙壁中而无法移动。这是代码:

collide = pg.sprite.collide_mask(self, self.game.map)

        if keys[pg.K_w]:
            self.pos.y -= playerSpeed
            if collide:
                self.pos.y += playerSpeed
        if keys[pg.K_a]:
            self.pos.x -= playerSpeed
            if collide:
                self.pos.x += playerSpeed
        if keys[pg.K_s]:
            self.pos.y += playerSpeed
            if collide:
                self.pos.y -= playerSpeed
        if keys[pg.K_d]:
            self.pos.x += playerSpeed
            if collide:
                self.pos.x -= playerSpeed

2 个答案:

答案 0 :(得分:1)

这正是您的代码所说明的:

collide = pg.sprite.collide_mask(self, self.game.map)

所以当玩家撞到墙壁时,情况就是如此

if keys[pg.K_s]:
    self.pos.y += playerSpeed
    if collide:
        self.pos.y -= playerSpeed

因此,如果碰撞为真,则有效发生的是:

self.pos.y += playerSpeed
self.pos.y -= playerSpeed

所以最终结果是位置没有变化(所有其他方向都相同)。

现在的真正问题是:您想发生什么?也许您应该知道四个方向中的哪个方向被墙遮住,并且仅将该方向上的移动设置为0。

答案 1 :(得分:0)

问题是您需要 检查玩家是否卡在物体上。玩家处于碰撞状态后,测试:

collide = pg.sprite.collide_mask(self, self.game.map)

无论如何,都只会返回True。正如@ChrisMaes指出的那样,一旦发生冲突,该运动将不再影响结果。

解决方案是在完成运动之前 测试碰撞:

if keys[pg.K_w]:
    self.pos.y -= playerSpeed
    if ( pg.sprite.collide_mask( self, self.game.map ) ):
        self.pos.y += playerSpeed                          # Undo the movement
# ... etc, same change for the rest of the movement keys

此方法有问题。如果将playerSpeed设为5的常数,则玩家将无法移动到障碍物上,因为测试是在5像素处完成的,所以他们会停在1-5像素远。如果玩家速度是固定的(且> 1),则有必要确定玩家可以移动到障碍物的高度,并且仅允许该距离的移动。这样一来,玩家就可以紧挨着与其碰撞的东西,而不是1-4像素远。

相关问题