Движение спрайтов pygame

#python #pygame #logic

#python #pygame #Логические

Вопрос:

Ниже я определил игровой цикл pygame. Я могу перемещать спрайт в 8 направлениях.

     #player position
    def player(x,y):
        screen.blit(playerImg, (x, y))
    
    #enemy position
    def enemy(x,y):
        screen.blit(enemyImg, (x, y))
    
    def fire_bullet(x,y):
        global bullet_state
        bullet_state = "fire"
        screen.blit(bulletImg, (x   16, y   10))

    # Game Loop
    running = True
    while running:
        #fill values RGB - Red, Green, Blue
        screen.fill(bc.goodblue)
        #background immage
        screen.blit(background, (0,0))
    
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False        
            #if keystroke is pressed
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT or event.key == ord('a'):
                    playerx_change = -movespeed
                if event.key == pygame.K_RIGHT or event.key == ord('d'):
                    playerx_change = movespeed
                if event.key == pygame.K_UP or event.key == ord('w'):
                    playery_change = -movespeed
                if event.key == pygame.K_DOWN or event.key == ord('s'):
                    playery_change = movespeed
                if event.key == pygame.K_SPACE and bullet_state == "ready":
                    bulletx = playerx
                    fire_bullet(bulletx, bullety)
            if event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT or event.key == ord('a') or event.key == ord('d'):
                    playerx_change = 0
                if event.key == pygame.K_UP or event.key == pygame.K_DOWN or event.key == ord('s') or event.key == ord('w'):
                    playery_change = 0


        #player movement
        playery  = playery_change
        playerx  = playerx_change

        if playerx <= 0:
            playerx = 0
        if playerx >= width - PImgWidth:
            playerx = width - PImgWidth
        if playery <=0:
            playery = 0
        if playery >=height - PImgHeight:
            playery = height - PImgHeight
    
        #enemy movement
        enemyx  = enemyx_change
   
        if enemyx <= 0:
            enemyx_change = enemyspeed
            enemyy  = enemyy_change
        if enemyx >= width - EImgWidth:
            enemyx_change = -enemyspeed
            enemyy  = enemyy_change
    
        player(playerx, playery)
        enemy(enemyx, enemyy)
        pygame.display.update()
    
    pygame.quit()
  

Однако есть одна небольшая проблема.

Если я нажимаю клавишу со стрелкой влево, спрайт перемещается влево. Если я затем также нажму клавишу со стрелкой вправо, спрайт начнет перемещаться вправо.

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

Я не знаю эффективного способа настроить это.

Ответ №1:

Если вы отпуститеLEFT, RIGHT, aили dвам нужно проверить, нажата ли одна из этих клавиш, прежде чем вы сможете установить playerx_change = 0: . Используется pygame.key.get_pressed() для оценки состояния ключей:

 if event.type == pygame.KEYUP:
    if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT or event.key == ord('a') or event.key == ord('d'):

        keys = pygame.key.get_pressed()
        if not keys[pygame.K_LEFT] and not keys[pygame.K_RIGHT] and not keys[pygame.K_a] and not keys[pygame.K_d]:
            playerx_change = 0
  

Сделайте то же самое для UP, DOWN, sсоответственно w

 while running:
    # [...]

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

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT or event.key == ord('a'):
                playerx_change = -movespeed
            if event.key == pygame.K_RIGHT or event.key == ord('d'):
                playerx_change = movespeed
            if event.key == pygame.K_UP or event.key == ord('w'):
                playery_change = -movespeed
            if event.key == pygame.K_DOWN or event.key == ord('s'):
                playery_change = movespeed
            if event.key == pygame.K_SPACE and bullet_state == "ready":
                    bulletx = playerx
                    fire_bullet(bulletx, bullety)        
                
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT or event.key == pygame.K_a or event.key == pygame.K_d:
                keys = pygame.key.get_pressed()
                if not keys[pygame.K_LEFT] and not keys[pygame.K_RIGHT] and not keys[pygame.K_a] and not keys[pygame.K_d]:
                    playerx_change = 0
            
            if event.key == pygame.K_UP or event.key == pygame.K_DOWN or event.key == pygame.K_s or event.key == pygame.K_w:
                keys = pygame.key.get_pressed()
                if not keys[pygame.K_UP] and not keys[pygame.K_DOWN] and not keys[pygame.K_s] and not keys[pygame.K_w]:
                    playery_change = 0
  

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

1. Отлично! Спасибо.