gpt4 book ai didi

python - Pygame: key.get_pressed() 与事件队列不一致

转载 作者:太空狗 更新时间:2023-10-30 01:49:17 25 4
gpt4 key购买 nike

我正在尝试使用 Python 中的 pygame 为应用程序制定简单的控件。我已经掌握了基础知识,但我遇到了奇怪的墙:我正在使用箭头键来控制我的角色。如果我按住一个箭头键,然后按住另一个箭头键(沿对角线移动),角色会按预期移动。但是,如果我释放我按下的 second 键(同时仍然按住 first 键),即使我仍然按住第一个键,角色也会停止移动.这是我的简单移动代码:

for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == KEYDOWN:
if pygame.key.get_pressed()[K_LEFT]:
player.pos = (player.pos[0] - 2, player.pos[1])
if pygame.key.get_pressed()[K_RIGHT]:
player.pos = (player.pos[0] + 2, player.pos[1])
if pygame.key.get_pressed()[K_UP]:
player.pos = (player.pos[0], player.pos[1] - 2)
if pygame.key.get_pressed()[K_DOWN]:
player.pos = (player.pos[0], player.pos[1] + 2)

现在,我自然对此感到很困惑。所以我试着打印一些行来调试。在主控制循环的顶部,我写道:

print (pygame.key.get_pressed()[K_DOWN], pygame.key.get_pressed()[K_RIGHT])
print pygame.event.get()

...输出一个显示向下和向右箭头键状态的元组,然后显示pygame事件队列。结果让我更加困惑。如果我沿对角线向下和向右移动角色,先按下下键,然后按右键,然后释放右键使其简单地向下移动,角色像以前一样停止移动......但是这是打印到外壳上的:

(1, 0)
[]

也就是说,当我释放右箭头键并仍然按住向下箭头键时,pygame.key.get_pressed() 知道向下箭头键仍然被按住,但是事件队列中没有任何内容。

此外,在代码的前面(在控制循环之前)我正在调用

pygame.key.set_repeat(1, 2)

让角色在按住键的同时继续移动。

任何帮助将不胜感激!谢谢 :)

最佳答案

对于像移动这样的事情,你不应该检查事件(比如 KEYDOWNKEYUP),但是如果你的移动键被按下(使用get_pressed ).

在您的代码中,仅当还有 KEYDOWN 事件时才检查按下的键。


还有一些其他的事情需要考虑:

  • 您应该将键映射和播放器的速度分开,这样以后更改其中任何一个都会更容易。

  • 您应该先确定一个运动矢量并对其进行归一化,否则,如果您的垂直和水平运动速度为 10,您的对角线运动速度将为 ~14.

工作示例:

import pygame

pygame.init()

screen = pygame.display.set_mode((200, 200))
run = True
pos = pygame.Vector2(100, 100)
clock = pygame.time.Clock()

# speed of your player
speed = 2

# key bindings
move_map = {pygame.K_LEFT: pygame.Vector2(-1, 0),
pygame.K_RIGHT: pygame.Vector2(1, 0),
pygame.K_UP: pygame.Vector2(0, -1),
pygame.K_DOWN: pygame.Vector2(0, 1)}

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

screen.fill((30, 30, 30))
# draw player, but convert position to integers first
pygame.draw.circle(screen, pygame.Color('dodgerblue'), [int(x) for x in pos], 10)
pygame.display.flip()

# determine movement vector
pressed = pygame.key.get_pressed()
move_vector = pygame.Vector2(0, 0)
for m in (move_map[key] for key in move_map if pressed[key]):
move_vector += m

# normalize movement vector if necessary
if move_vector.length() > 0:
move_vector.normalize_ip()

# apply speed to movement vector
move_vector *= speed

# update position of player
pos += move_vector

clock.tick(60)

关于python - Pygame: key.get_pressed() 与事件队列不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11910410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com