Проблема в том, что вам нужно проверить наличие столкновений до того, как игрок застрянет на объекте. Когда игрок находится в состоянии столкновения, тест:
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 пикселя.