使用PyGame,我想创建一个移动的方块,它在网格中移动,由键盘按下箭头控制。因此,按“向上”键将方块直接向上移动到单元格,按“右”键将方块直接移动到右边的单元格等。
在我的循环中,我使用pygame.time.wait(x)
暂停x
毫秒。但是,选择x
的正确值证明是困难的。如果x
太大(例如1000),则广场不会立即响应,我实际上必须按住键才能让它移动。但是如果x
太小(例如10),那么只要按一个键,方块就会连续移动几次。但我只想让广场在每次按键时移动一次。我怎样才能做到这一点?谢谢!
以下是我的代码的重要部分:
x = 100
current_pos = [0, 0]
while True:
pygame.event.pump() # process event queue
is_key_pressed = pygame.key.get_pressed()
if is_key_pressed[pygame.K_UP]:
current_pos[1] -= 1
elif is_key_pressed[pygame.K_RIGHT]:
current_pos[0] += 1
elif is_key_pressed[pygame.K_DOWN]:
current_pos[1] += 1
elif is_key_pressed[pygame.K_LEFT]:
current_pos[0] -= 1
show_map(current_pos)
pygame.time.wait(x)
答案 0 :(得分:2)
不是检查密钥的状态(是否保持密钥),而是检查按下或重新按下的时间。可以通过保存密钥先前状态并检查其状态是否已更改,或使用事件循环来完成。
使用关键状态:
was_pressed = pygame.key.get_pressed()
while True:
pygame.event.pump() # process event queue
key_is_pressed = pygame.key.get_pressed()
if key_is_pressed[pygame.K_UP] and not was_pressed[pygame.K_UP]:
current_pos[1] -= 1
elif key_is_pressed[pygame.K_RIGHT] and not was_pressed[pygame.K_RIGHT]:
current_pos[0] += 1
elif key_is_pressed[pygame.K_DOWN] and not was_pressed[pygame.K_DOWN]:
current_pos[1] += 1
elif key_is_pressed[pygame.K_LEFT] and not was_pressed[pygame.K_LEFT]:
current_pos[0] -= 1
was_pressed = key_is_pressed
使用事件循环:
while True:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
current_pos[1] -= 1
elif event.key == pygame.K_UP:
current_pos[0] += 1
elif event.key == pygame.K_DOWN:
current_pos[1] += 1
elif event.key == pygame.K_LEFT:
current_pos[0] -= 1