Игрок застревает в стене - PullRequest
1 голос
/ 30 января 2020

Когда игрок сталкивается со стеной, он просто застревает в стене и не может двигаться. Вот код:

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 ]

1 голос
/ 30 января 2020

Ну, это именно то, что говорит ваш код:

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

Таким образом, результат net состоит в том, что позиция не меняется (то же самое для всех других направлений).

Реальный вопрос сейчас: что бы вы хотели, чтобы произошло ? Вероятно, вы должны знать, какое из четырех направлений заблокировано стеной, и установить только движение в этом направлении на 0.

0 голосов
/ 31 января 2020

Проблема в том, что вам нужно проверить наличие столкновений до того, как игрок застрянет на объекте. Когда игрок находится в состоянии столкновения, тест:

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 пикселя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...