Анимация Pygame не работает для левых движений, работают только правые движения

#python #animation #pygame #blit

Вопрос:

У меня есть программа pygame, в которой я анимирую движение персонажа, каждый раз, когда я нажимаю A или D, меняется координата x, и персонаж создает изображение самого себя, движущегося.

Анимация правого движения, прыжка и стояния работает, но не левого движения.

Я проверил изображения для изображений, обращенных влево, и они обращены влево. Так что я почти уверен, что проблема не в переменной

ссылка на видео для более легкой визуализации -> >https://www.youtube.com/watch?v=kHnyJqwPUqE вот переменные ->

 c_scale_width=80
c_scale_height= 90
c_scale_stand_width=90
c_scale_stand_height= 105
c_s_y= 290
cx = 250
cy = 300
move_left = False
move_right = False

standing_1 = pygame.image.load(os.path.join('','P1(stand).png'))
standing=pygame.transform.scale(standing_1,(c_scale_stand_width,c_scale_stand_height))

P2_right_11=pygame.image.load(os.path.join('','P1(1).png'))
P2_right_1=pygame.transform.scale(P2_right_11,(c_scale_width,c_scale_height))
P2_right_12=pygame.image.load(os.path.join('','P1(2).png'))
P2_right_2=pygame.transform.scale(P2_right_12,(c_scale_width,c_scale_height))
P2_right_13=pygame.image.load(os.path.join('','P1(3).png'))
P2_right_3=pygame.transform.scale(P2_right_13,(c_scale_width,c_scale_height))
P2_right_14=pygame.image.load(os.path.join('','P1(4).png'))
P2_right_4=pygame.transform.scale(P2_right_14,(c_scale_width,c_scale_height))
P2_right= [P2_right_1,
           P2_right_2,
           P2_right_3,
           P2_right_4]

P2_left_1= pygame.transform.flip(P2_right_1,True,False)
P2_left_2= pygame.transform.flip(P2_right_2,True,False)
P2_left_3= pygame.transform.flip(P2_right_3,True,False)
P2_left_4= pygame.transform.flip(P2_right_4,True,False)

P2_left= [P2_left_1,
          P2_left_2,
          P2_left_3,
          P2_left_4]
step_index=0
 

теперь вот программа —>

 def c_move(keys_pressed):
    global move_left
    global move_right
    global jump
    global cx
    global cy
    global jump_vel_y
    global  step_index
    if keys_pressed[pygame.K_a]:  # left
        cx -= Velocity
        move_left = True
        move_right = False
    if keys_pressed[pygame.K_d]:  # right
        cx  = Velocity
        move_left = False
        move_right = True
    else:
        move_left = False
        move_right = False
        step_index = 0

    if jump is False and keys_pressed[pygame.K_SPACE]:
        jump = True

def draw():
    global jump
    global jump_vel_y
    global cx
    global cy
    WIN.blit(bg,(0,0))
    global step_index
    if step_index >= 4:
        step_index=0

    elif move_left:
        WIN.blit(P2_left[step_index//2], (cx,cy))
        step_index =1

    if jump:

        cy -= jump_vel_y
        WIN.blit(standing, (cx, cy))
        jump_vel_y -= 1
        if jump_vel_y < -15:
            jump = False
            jump_vel_y = 15
    elif move_right:
        WIN.blit(P2_right[step_index//2], (cx, cy))
        step_index =1


    else:
        WIN.blit(standing,(cx,c_s_y))


    pygame.display.update()

def main():


    clock = pygame.time.Clock()
    run = True
    while run:
        clock.tick_busy_loop(FPS)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
                pygame.quit()
                sys.exit()

        keys_pressed = pygame.key.get_pressed()
        c_move(keys_pressed)
        draw()

main()
 

Заранее спасибо всем, кто это прочтет!

Комментарии:

1. Нет, я пытался переписать код, но он все тот же

Ответ №1:

Вам нужно использовать один if elif elif оператор — вместо 2 if elif оператора:

 def draw():
    global jump, jump_vel_y
    global cx, cy
    global step_index
    
    if step_index >= 4:
        step_index=0
    current_image = standing

    if jump:
        cy -= jump_vel_y
        jump_vel_y -= 1
        if jump_vel_y < -15:
            jump = False
            jump_vel_y = 15

    elif move_right:
        current_image = P2_right[step_index//2]
        step_index  = 1
    
    elif move_left:
        current_image = P2_left[step_index//2]
        step_index  = 1

    WIN.blit(bg,(0,0))
    WIN.blit(current_image, (cx, cy))
 

Комментарии:

1. Левое движение по-прежнему не работает, все остальное по-прежнему то же самое

2. @captainchungus, Значит, ты сделал это неправильно. Код в ответе правильный и решает проблему.

3. о, хорошо, я попытаюсь переписать весь код, в любом случае, спасибо за помощь