例如,如果我按住w然后按住一个,有没有办法让pygame告诉我我先把哪个键固定下来?
我需要知道这一点,因为对于我试图使用pygame的游戏,角色没有平滑的动作。移动的示例代码如下。
我首先检测并设置方向,然后为每个方向设置xchange和y更改。
然后我将它添加到播放器的x和y,然后将其添加到屏幕上。
问题是,如果我按住(s)然后按住(d),我希望角色向下移动然后移动,但我必须释放向下按钮才能实现。这是因为在我的代码中,if键[k_s]位于四个方向的底部并最后进行评估,这将把方向值替换为down。如果我按下右(d)然后向下(s)以改变方向,则运动是平滑的。
感谢您的帮助!
keys = pygame.key.get_pressed()
if keys[K_a] or keys[K_d] or keys[K_w] or keys[K_s]:
if keys[K_d] and keys[K_a]:
direction = "none"
if keys[K_w] and keys[K_s]:
direction = "none"
else:
#if direction == "none":
if keys[K_a]:
direction = "left"
if keys[K_d]:
direction = "right"
if keys[K_w]:
direction = "up"
if keys[K_s]:
direction = "down"
else:
direction = "none"
currentarea.putbackground()
currentarea.putdoor()
if direction == "none":
ychange = 0
xchange = 0
elif direction == "up":
xchange = 0
ychange = -3
elif direction == "down":
xchange = 0
ychange = 3
elif direction == "left":
xchange = -3
ychange = 0
elif direction == "right":
xchange = 3
ychange = 0
答案 0 :(得分:1)
如果循环遍历事件循环,您将按照创建顺序接收事件。然后你可以做的是创建一个列表,对你按下的键进行排队,并在你释放它们时删除它们。列表中的第一个元素将始终是您按下但尚未发布的第一个键。
pressed_keys = []
while True:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_a:
pressed_keys.append("left")
elif event.key == pygame.K_d:
pressed_keys.append("right")
elif event.key == pygame.K_w:
pressed_keys.append("up")
elif event.key == pygame.K_s:
pressed_keys.append("down")
if event.type == pygame.KEYUP:
if event.key == pygame.K_a:
pressed_keys.remove("left")
elif event.key == pygame.K_d:
pressed_keys.remove("right")
elif event.key == pygame.K_w:
pressed_keys.remove("up")
elif event.key == pygame.K_s:
pressed_keys.remove("down")
try:
print(pressed_keys[0]) # Will give IndexError if list is empty
# print(pressed_keys) # Uncomment to see it in action
except IndexError:
pass