【问题标题】:Make Character Keep Moving While Key Held Down按住键使角色保持移动
【发布时间】:2020-06-06 03:16:11
【问题描述】:

我正在尝试制作一个快速动画,如果按住某个键,角色将继续移动,但我的代码似乎没有这样做。我按了键并移动了一次,但没有进一步移动。任何帮助解决这个问题。任何其他建议都表示赞赏,请记住,这并不接近最终产品形式。

import pygame
import os
import sys
from pygame.locals import *


pygame.init()
WIN = pygame.display.set_mode(display)
pygame.display.set_caption('The Game')
width = 500
height = 500
display = (width, height)
WHITE = (255, 255, 255)

left = [
pygame.image.load(os.path.join('assets', 'main', 'left_walk1.png')),
pygame.image.load(os.path.join('assets', 'main', 'left_walk2.png'))
]

right = [
pygame.image.load(os.path.join('assets', 'main', 'right_walk1.png')),
pygame.image.load(os.path.join('assets', 'main', 'right_walk2.png'))
]

up = [
pygame.image.load(os.path.join('assets', 'main', 'up_walk1.png')),
pygame.image.load(os.path.join('assets', 'main', 'up_walk2.png'))
]

down = [
pygame.image.load(os.path.join('assets', 'main', 'down_walk1.png')),
pygame.image.load(os.path.join('assets', 'main', 'down_walk2.png'))
]

standing_left = (os.path.join('assets', 'main', 'down_walk2.png'))
standing_right = (os.path.join('assets', 'main', 'down_walk2.png'))
standing_up = (os.path.join('assets', 'main', 'down_walk2.png'))
standing_down = (os.path.join('assets', 'main', 'down_walk2.png'))




class Player:
  def __init__(self, x, y):

      self.x = x
      self.y = y
      self.health = 100
      self.inv = []
      self.left = False
      self.right = False
      self.up = False
      self.down = False
      self.walking_count = 0

      self.facing = 'down'

  def draw_player(self, win):

      if self.walking_count == 3:
          self.walking_count = 1

      if self.left:
          WIN.blit(left[self.walking_count // 2], (self.x, self.y))

      elif self.right:
          WIN.blit(right[self.walking_count // 2], (self.x, self.y))

player = Player(100, 100)

FPS = 40
fpsClock = pygame.time.Clock()

while True:
  fpsClock.tick(FPS)
  WIN.fill(WHITE)
  player.draw_player(WIN)

  for event in pygame.event.get():
      if event.type == QUIT:
          pygame.quit()
          sys.exit()
      elif event.type == KEYDOWN:
          if event.key == K_UP and player.y <= 0:
              player.up = True
          elif event.key == K_DOWN:
              player.down = True
          elif event.key == K_LEFT:
              player.left = True
          elif event.key == K_RIGHT:
              player.right = True
      elif event.type == KEYUP:
          if event.key == K_UP:
              player.up = False
          if event.key == K_DOWN:
              player.down = False
          if event.key == K_LEFT:
              player.left = False
          if event.key == K_RIGHT:
              player.right = False

      if player.left:
          player.x -= 5
          player.walking_count += 1
      if player.right:
          player.x += 5
          player.walking_count += 1
      if player.up:
          player.y -= 5
          player.walking_count += 1
      if player.down:
          player.y += 5
          player.walking_count += 1


  pygame.display.update()

【问题讨论】:

    标签: python python-3.x pygame


    【解决方案1】:

    这是Indentation 的问题。您必须在应用程序循环而不是事件循环中应用移动:

    while True:
        fpsClock.tick(FPS)
        WIN.fill(WHITE)
        player.draw_player(WIN)
    
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == KEYDOWN:
                if event.key == K_UP and player.y <= 0:
                    player.up = True
                elif event.key == K_DOWN:
                    player.down = True
                elif event.key == K_LEFT:
                    player.left = True
                elif event.key == K_RIGHT:
                    player.right = True
            elif event.type == KEYUP:
                if event.key == K_UP:
                    player.up = False
                if event.key == K_DOWN:
                    player.down = False
                if event.key == K_LEFT:
                    player.left = False
                if event.key == K_RIGHT:
                    player.right = False
    
        #<--| INDENTATION
        if player.left:
            player.x -= 5
        if player.right:
            player.x += 5
        if player.up:
            player.y -= 5
        if player.down:
            player.y += 5
    
        pygame.display.update()
    

    您也可以使用pygame.key.get_pressed() 而不是KEYDOWNKEYUP 事件:

    while True:
        fpsClock.tick(FPS)
        WIN.fill(WHITE)
        player.draw_player(WIN)
    
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
    
        keys = pygame.key.get_pressed()
        player.left, player.right, player.up, player.down = False, False, False, False
        if keys[K_LEFT]:
            player.x -= 5
            player.left = True
        if keys[K_RIGHT]:
            player.x += 5
            player.right = True
        if keys[K_UP]:
            player.y -= 5
            player.up = True
        if keys[K_DOWN]:
            player.y += 5
            player.down = True
    
        pygame.display.update()
    

    要控制动画速度,请添加属性self.animation_frames = 10。此属性控制动画的每个图像显示多少帧。根据属性计算图像索引。
    walking_count 必须在 Player.draw_player 中递增,而不是在应用程序循环中递增。
    为确保显示正确的“站立”图像,您必须添加属性self.standing。在draw_player 中设置依赖于当前方向的属性。如果玩家没有移动,则显示当前站立的图像:

    class Player:
        def __init__(self, x, y):
            # [...]
    
            self.animation_frames = 10
            self.standing = standing_left
    
        def draw_player(self, win):
    
            # get image list
            if self.left:
                image_list = left
                self.standing = standing_left
            else self.right:
                image_list = right
                self.standing = standing_right
            else:
                image_list = [self.standing]
    
            # increment walk count and get image list
            image_index = self.walking_count // self.animation_frames
            if image_index >= len(image_list):
                image_index = 0
                self.walking_count = 0
            self.walking_count += 1
    
            WIN.blit(image_list[image_index], (self.x, self.y))
    

    【讨论】:

    • 刚刚修好了。最后一个问题,然后我就完成了。当动画开始时,即使我没有移动,动画也会继续播放。我该如何阻止它。
    • @Botonian 我已经扩展了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    相关资源
    最近更新 更多