如何设置只要按住 PyGame 中的任意键我的角色就会移动?
How to set my character to move as long as I am holding any key in PyGame?
我正在 PyGame 中创建一个简单的游戏。但问题是,每当我按住一个键时,我的角色在一步后停止移动,直到我松开键并再次按下它才移动。代码如下。
pygame.init()
screen_width = 800
screen_height = 800
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("SPACE INVADER")
icon = pygame.image.load("game-controller.png")
pygame.display.set_icon(icon)
player_img = pygame.image.load("Webp.net-resizeimage.png")
playerX = 400
playerY = 700
playerX_change = 0
def player(x, y):
screen.blit(player_img, (x, y))
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
playerX_change = -5
if event.key == pygame.K_RIGHT:
playerX_change = 5
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
playerX_change = 0
playerX += playerX_change
screen.fill((0, 0, 0))
player(playerX, playerY)
pygame.display.update()
这是Indentation的事情。您必须在应用程序循环而不是事件循环中移动对象并更新场景:
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
playerX_change = -5
if event.key == pygame.K_RIGHT:
playerX_change = 5
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
playerX_change = 0
# INDENTATION
#<--|
playerX += playerX_change
screen.fill((0, 0, 0))
player(playerX, playerY)
pygame.display.update()
但是,使用 pygame.key.get_pressed()
而不是键盘事件。
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
playerX -= 5
if keys[pygame.K_RIGHT]:
playerX += 5
playerX += playerX_change
screen.fill((0, 0, 0))
player(playerX, playerY)
pygame.display.update()
解释:
键盘事件(参见 pygame.event 模块)仅在键状态改变时发生一次。 KEYDOWN
事件在每次按下一个键时发生一次。 KEYUP
每松开一个键就会出现一次。使用键盘事件进行单个操作或逐步移动。
pygame.key.get_pressed()
returns 包含每个键状态的列表。如果按住某个键,则该键的状态为 True
,否则为 False
。使用 pygame.key.get_pressed()
评估按钮的当前状态并获得连续移动。
我正在 PyGame 中创建一个简单的游戏。但问题是,每当我按住一个键时,我的角色在一步后停止移动,直到我松开键并再次按下它才移动。代码如下。
pygame.init()
screen_width = 800
screen_height = 800
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("SPACE INVADER")
icon = pygame.image.load("game-controller.png")
pygame.display.set_icon(icon)
player_img = pygame.image.load("Webp.net-resizeimage.png")
playerX = 400
playerY = 700
playerX_change = 0
def player(x, y):
screen.blit(player_img, (x, y))
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
playerX_change = -5
if event.key == pygame.K_RIGHT:
playerX_change = 5
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
playerX_change = 0
playerX += playerX_change
screen.fill((0, 0, 0))
player(playerX, playerY)
pygame.display.update()
这是Indentation的事情。您必须在应用程序循环而不是事件循环中移动对象并更新场景:
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
playerX_change = -5
if event.key == pygame.K_RIGHT:
playerX_change = 5
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
playerX_change = 0
# INDENTATION
#<--|
playerX += playerX_change
screen.fill((0, 0, 0))
player(playerX, playerY)
pygame.display.update()
但是,使用 pygame.key.get_pressed()
而不是键盘事件。
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
playerX -= 5
if keys[pygame.K_RIGHT]:
playerX += 5
playerX += playerX_change
screen.fill((0, 0, 0))
player(playerX, playerY)
pygame.display.update()
解释:
键盘事件(参见 pygame.event 模块)仅在键状态改变时发生一次。 KEYDOWN
事件在每次按下一个键时发生一次。 KEYUP
每松开一个键就会出现一次。使用键盘事件进行单个操作或逐步移动。
pygame.key.get_pressed()
returns 包含每个键状态的列表。如果按住某个键,则该键的状态为 True
,否则为 False
。使用 pygame.key.get_pressed()
评估按钮的当前状态并获得连续移动。