pygame中的爬梯由于重力和碰撞而无法工作

时间:2019-04-27 11:43:15

标签: python pygame

我正尝试在游戏中添加一个碰撞,以便一旦玩家与梯子碰撞,并且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 个答案:

答案 0 :(得分:1)

从代码中可以看到,只要角色不在地面上,就可以添加重力。正确但不完整。
例如,当您在梯子上时,您应该添加更多的检查并避免增加重力。

这里仅是一个示例,可以给您带来想法,而不是对代码进行有效的更新。

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)

当播放器位于浮动平台上时,也应进行类似的推理。