每当玩家与墙壁碰撞时,他们只会卡在墙壁中而无法移动。这是代码:
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
答案 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像素远。