微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Pygame 跳跃动画问题

如何解决Pygame 跳跃动画问题

所以我正在用 pygame 制作一个 2d 平台游戏,我让玩家精灵能够左右移动、跳跃和攻击(使用动画)

所以我想让玩家在跳跃时能够进行攻击,因为在跳跃动画中必须停止并且攻击动画必须出现但玩家仍然应该向上跳跃和向下坠落,

当我尝试实现这一点时,我遇到了一个问题,即直到玩家落地时才会出现攻击动画,

我尝试在跳跃动画循环中添加一个 if 循环:'if self.slash == True: interrupt_jump = True' 当我运行它时会中断跳跃动画,但斜线(攻击)动画在玩家击中后开始地面,

   # player update function
    def update(self):

        dx = 0
        dy = 0
        walk_cooldown = 5
        down = False
        attac = False

        self.isidle = 0
        self.framedelay = 0.12
        #self.slash = False

        key = pygame.key.get_pressed()
        if key[pygame.K_UP] and self.times_jumped <= 25 and not self.jumped:
            self.jump_ini = True
            self.vel_y = - 17
            self.jumpll = 0
            self.times_jumped += 1
            self.jumped = True

        if not key[pygame.K_UP]:
            self.times_jumped = 0
            self.j_pressed += 1
            if self.j_pressed > 40:
                self.jumped = False
                self.j_pressed = 0
        # self.jumped = False

        if key[pygame.K_LEFT]:
            dx -= 10
            self.counter += 1
            self.direction = -1

        if key[pygame.K_RIGHT]:
            dx += 10
            self.counter += 1
            self.direction = 1
            self.isidle = False
        # self.image = self.run_animation[self.idle]
        if key[pygame.K_LEFT] == False and key[pygame.K_RIGHT] == False:
            self.counter = 0

            if self.direction == 1:
                self.image = self.run_animation[self.run]

            if self.direction == -1:
                self.image = self.run_animation[self.run]

            self.isidle = True

        if key[pygame.K_DOWN]:
            down = True
        if key[pygame.K_z]:
            attac = True
            self.slash = True

        if self.isidle:
            global idle_frame_start

            if time.time() - idle_frame_start > self.framedelay:
                if self.idle < 3:
                    self.idle += 1
                else:
                    self.idle = -1

                idle_frame_start = time.time()
        elif not self.isidle:
            if time.time() - run_frame_start > self.framedelay:
                if self.run < 3:
                    self.run += 1
                else:
                    self.run = 0
                idle_frame_start = time.time()
        if self.slash:
            self.isidle = False

            global at_frame_start
            if time.time() - at_frame_start > self.framedelay:
                if self.at < 3:
                    self.at += 1
                else:
                    self.slash = False
                    self.at = -1
                at_frame_start = time.time()


                # add gravity
                #self.vel_y += 1
                #if self.vel_y > 10:
                #    self.vel_y = 10
                #dy += self.vel_y

                # add gravity

        # JUMP animation
        interrupt_jump = 0

        if self.jump_ini:
            if self.slash == True:
                interrupt_jump = True
            else:
                interrupt_jump = False
            if down and self.vel_y > 0:
                dy += 10
            if time.time() - jump_frame_start > 0.12:
                if self.jumpp < 7:
                    if self.jumpp == 4:
                        self.jumpp = 4
                        self.chg_j_animation = False
                    if self.chg_j_animation:
                        time.sleep(0.05)
                        self.jumpp += 1
                    if self.vel_y == 11:
                        self.jumpp = 5
                    if self.jumpp > 5:
                        dx += 15
                    else:
                        self.chg_j_animation = True
                else:
                    self.jumpp = -1
                    self.jump_ini = False

                at_frame_start = time.time()

        self.vel_y += 1
        if self.vel_y > 15:
            self.vel_y = 15
        dy += self.vel_y

        # handle animation
        if self.counter > walk_cooldown:
            self.counter = 0
            self.run += 1
        if self.run >= len(self.run_animation):
            self.run = 0
        if self.direction == 1:
            self.image = self.run_animation[self.run]
        if self.direction == -1:
            self.image = self.run_animation[self.run]

        self.vel_y += 1

        dy += self.vel_y


        self.rect.x += dx
        self.rect.y += dy

        if self.rect.bottom > screen_height:
            self.rect.bottom = screen_height
            dy = 0

        if self.jump_ini and not interrupt_jump:
            time.sleep(0.05)
            screen.blit(self.jump_animation[self.jumpp],(self.rect))

        if self.slash:
            time.sleep(0.05)
            self.slimg = self.at_animation[self.at]
            screen.blit(self.slimg,self.rect)

游戏循环:

player = Player1(100,250)

idle_frame_start = time.time()
run_frame_start = time.time()
at_frame_start = time.time()

jump_frame_start = time.time()

enemy_idle_frame = time.time()


enemy1 = Enemy(250,100)

while run:

    screen.blit(bg_img,(0,0))

    enemy1.update()

    world.draw()

    player.update()

    draw_grid()

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    pygame.display.update()

pygame.quit()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。