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 跳过按键检查的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中运行另一个程序的python中模拟按键事件

如何在 Pygame 中检查变量是不是包含矩形? [复制]

检查圆圈是否在窗口边缘

将按键发送到嵌入式 Pygame

结对-结对编项目作业名称-设计文档

Pygame - 声音延迟