如何解决运动代码在 pygame 2.0.1 中不起作用
我正在 pygame 中制作一个简单的游戏。一切似乎都在正确运行并且没有错误,但是移动精灵的代码似乎不起作用。如果我将精灵设置为自动移动它工作正常,所以我认为这是按键检测系统的问题。这是主要的游戏循环:
running = True
while running:
# basic game function checks
pygame.display.flip()
clock.tick(60)
movementtest(testX,testY)
# checking if the game has been closed
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
running = False
# movement code
if movingleft:
testX -= testX
if movingright:
testX += testX
if movingup:
testY += testY
if movingdown:
testY -= testY
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_a:
if not movingright:
movingleft = True
if event.key == pygame.K_d:
if not movingleft:
movingright = True
if event.key == pygame.K_w:
if not movingdown:
movingup = True
if event.key == pygame.K_s:
if not movingup:
movingdown = True
if event.type == pygame.KEYUP:
if event.key == pygame.K_a:
movingleft = False
if event.key == pygame.K_d:
movingright = False
if event.key == pygame.K_w:
movingup = False
if event.key == pygame.K_s:
movingdown = False
为什么它没有检测到我的按键输入?如果需要,我会发布预循环代码。
解决方法
pygame.event.get()
获取所有消息并将它们从队列中删除。请参阅文档:
这将获取所有消息并将它们从队列中删除。 [...]
如果在多个事件循环中调用 pygame.event.get()
,则只有一个循环接收事件,但不会所有循环都接收所有事件。因此,似乎错过了一些事件。
要么实现单个事件循环,要么每帧获取一次事件并在多个循环中使用它们:
running = True
while running:
# [...]
event_list = pygame.event.get():
# checking if the game has been closed
for event in event_list :
if event.type == pygame.QUIT:
running = False
# [...]
# [...]
for event in event_list:
# [...]
另外,你需要通过常量来改变玩家的位置,而不是位置本身:
running = True
while running:
# [...]
if movingleft:
testX -= 1
if movingright:
testX += 1
if movingup:
testY -= 1
if movingdown:
testY += 1
但是,可以通过使用 pygame.key.get_pressed()
代替键盘事件来简化代码。
键盘事件(参见 pygame.event 模块)仅在键的状态改变时发生一次。 KEYDOWN
事件在每次按下键时发生一次。 KEYUP
每次释放键时出现一次。将键盘事件用于单个操作或逐步移动。
pygame.key.get_pressed()
返回一个包含每个键状态的列表。如果某个键被按下,则该键的状态为 True
,否则为 False
。使用 pygame.key.get_pressed()
评估按钮的当前状态并获得连续移动:
running = True
while running:
# basic game function checks
pygame.display.flip()
clock.tick(60)
movementtest(testX,testY)
# checking if the game has been closed
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
running = False
# movement code
keys = pygame.key.get_pressed()
if key[pygae.K_a]:
testX -= 1
if key[pygae.K_d]:
testX += 1
if key[pygae.K_w]:
testY -= 1
if key[pygae.K_s]:
testY += 1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。