Лестница в Pygame не работает из-за гравитации и столкновений - PullRequest
0 голосов
/ 27 апреля 2019

Я пытаюсь добавить в свою игру столкновение, чтобы после столкновения игрока с лестницей скорость вращения оси y (которая контролируется силой тяжести) была больше 0 (что означает, что используется сила тяжести). Но проблема, с которой я сталкиваюсь, заключается в том, что, как только я пытаюсь использовать лестницу, столкновение никогда не происходит, и если это иногда случается, гравитация мешает и тянет вниз. Другая проблема заключается в том, что я не могу понять, где бы я добавил столкновение, чтобы проверить, не больше ли игрок сталкивается с лестницей, что означает, что вы находитесь на одной из платформ

Я попытался проверить наличие столкновений, заставив консоль распечатать значение True, если это происходит, но, похоже, это работало только тогда, когда я находился на левой стороне лестницы.

class Ladder(pygame.sprite.Sprite):
    def __init__(self, x, y, pic):
        self.xpos = x
        self.ypos = y
        super().__init__()
        self.picture = pic
        self.picture = pygame.transform.scale(self.picture, (50, 440))
        self.rect = self.picture.get_rect()

class Player:
    def __init__(self, x, y, pic_one):
        self.xpos = x
        self.ypos = y
        self.speed_y = 0
        self.speed_x = 0 
        self.GRAVITY = 0.9
        self.picture = pic_one
        self.permission_to_jump = True
        self.on_ground = True
        self.picture = pygame.transform.scale(self.picture, (100, 100))
        self.rect = self.picture.get_rect()
        self.rect.x = self.xpos
        self.rect.y = self.ypos

    def update(self):
        if self.on_ground == False:
            if self.picture == self.picture_one:
                self.GRAVITY = 0.9

            self.xpos += self.speed_x 
            self.ypos += self.speed_y
            self.speed_y += self.GRAVITY  # Accelerate downwards.
            self.rect.x = self.xpos
            self.rect.y = self.ypos

            if self.ypos >= 620:
                self.ypos = 620
                self.speed_y = 0
                self.on_ground = True



        if self.on_ground == True:
            self.speed_y = 0
            self.xpos += self.speed_x 
            self.ypos += self.speed_y




    def jump(self):
        if self.permission_to_jump == True:
            if self.on_ground:
                #pygame.mixer.Channel(1).play(pygame.mixer.Sound("C:/sounds/Jump Sound Effect.wav"))
                self.on_ground = False
                self.speed_y = -25#Makes you move upwards






    def draw(self):
        screen.blit(self.picture, (self.xpos, self.ypos))

    def is_collided_with(self, sprite):
        return self.rect.colliderect(sprite.rect)


player_one = Player(400, 200, player_one_first_pic)
ladder = Ladder(120, 130, ladder_picture)
while True:
    [...]



if joystick.get_button(0) and player_one.is_collided_with(ladder) and player_one.speed_y >= 0:
                    player_one.on_ground = False
                    player_one.speed_y = -4

player_one.update()

player_one.draw()

В результате сила тяжести игрока останавливает подъем по лестнице и что игрок может лишь слегка подняться по лестнице, когда она касается левой части лестницы, а игрок не может даже подняться по лестнице

Вот диаграмма, если вы не до конца понимаете мой код (извините, если он немного запутался, мне было трудно вставить диаграмму) diagram

1 Ответ

1 голос
/ 27 апреля 2019

Из того, что я вижу из вашего кода, вы добавляете гравитацию всякий раз, когда вашего персонажа нет на земле. Что правильно, но не завершено.
Вам следует добавить дополнительные проверки и избегать добавления гравитации, например, когда вы находитесь на лестнице.

Вот простой пример, чтобы дать вам идею, а не рабочее обновление вашего кода.

def update(self):
    if self.on_ground == False:
        if self.picture == self.picture_one:
            self.GRAVITY = 0.9

        self.xpos += self.speed_x 
        self.ypos += self.speed_y
        if not self.on_ladder:
            self.speed_y += self.GRAVITY  # Accelerate downwards.
        self.rect.x = self.xpos
        self.rect.y = self.ypos

Таким образом, вы можете добавить к игроку атрибут on_ladder и переключить его с True на False в основном цикле.

player_one.on_ladder = player_one.is_collided_with(ladder)

Аналогичные рассуждения должны быть сделаны, когда игрок находится на плавающей платформе.

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