Pygame 跳过按键检查
Posted
技术标签:
【中文标题】Pygame 跳过按键检查【英文标题】:Pygame skips checking for keypress 【发布时间】:2018-06-11 01:59:26 【问题描述】:我正在编写一个游戏,它会随机选择一个问题供玩家回答。我有一个随机选择问题并显示它的功能,效果很好。这是函数中的第一个问题:
topicList = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]
def random_topic_generator():
global RNG
RNG = random.choice(topicList)
if RNG == 0:
screen.fill((255, 255, 255))
draw_text("Question 1", questionFont, screen, 10, 0)
draw_text("What color is the sky", questionFont, screen, 10, 100)
draw_text("A: Green", answerFont, screen, 10,400)
draw_text("B: Blue", answerFont, screen, 700, 400)
draw_text("C: Orange", answerFont, screen, 10,600)
draw_text("D: Yellow", answerFont, screen, 700, 600)
topicList.remove(0)
这是While循环的对应部分:
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == KEYDOWN:
if event.key == K_RETURN:
random_topic_generator()
if RNG == 0:
if event.key == K_b:
right_answer()
else:
wrong_answer()
right_answer() 和 wrong_answer():
def right_answer():
screen.fill((255, 255, 255))
draw_text("You got the question right!", right_wrongFont, screen, 500, 450)
def wrong_answer():
screen.fill((255, 255, 255))
draw_text("You got the question wrong.", right_wrongFont, screen, 500, 450)
按回车键进入下一个问题,这很好。但是,每当 RNG == 0 时,无论我何时在游戏中遇到问题,error_answer() 总是在没有按键的情况下运行。如果我摆脱 else 并遇到那个问题,按 b 不会做任何事情。
【问题讨论】:
【参考方案1】:您已经在第二个 sn-p 的第 7 行检查了事件密钥。当您到达最里面的 if 语句时,它总是采用 else,因为只有当按下的键是 return
时,您才能到达该代码。
这个逻辑错误的原因可能是您的输入处理程序过于复杂,这使得出错变得更加容易。从长远来看,您可能希望重构此代码,因为您的游戏将具有许多不同的状态(菜单、问题、问题完成)和不同的输入处理。如果您编写单独的输入处理函数,您可以在开始处理事件之前检查游戏状态,并将代码交给正确的处理程序。这可以防止单一的巨型处理程序使您的代码难以更新。
while True:
state = handle_events(state)
def handle_events(state):
if state == 1:
return handle_menu_events(state)
elif state == 2:
return handle_question_events(state)
elif state == 3:
return handle_question_over_events(state)
def handle_question_events(state):
for event in pygame.event.get():
if event.type == KEYDOWN:
if RNG == 0:
if event.key == K_b:
right_answer()
else:
wrong_answer()
[...]
def handle_question_over_events(state):
for event in pygame.event.get():
if event.type == KEYDOWN:
if event.key == K_RETURN:
random_topic_generator()
现在您的逻辑已经足够分离,以至于意外混合不同状态的事件处理变得更加困难,例如您最初的问题。
【讨论】:
欢迎来到 Stack Overflow!使用格式化工具使您的帖子更具可读性。代码块应类似于code block
。如果需要,请使用 粗体 斜体。用代码解释而不是理论描述
添加了一个例子。谢谢你的建议。以上是关于Pygame 跳过按键检查的主要内容,如果未能解决你的问题,请参考以下文章