当前位置: 首页 > 知识库问答 >
问题:

PyGame一次升级组织和运行功能

冀弘厚
2023-03-14

我做了一个游戏,但我有两个屏幕显示,菜单页面和游戏页面。在菜单页面上,当我点击播放按钮时,它显示游戏没有任何问题,但当我关闭运行的游戏时,它会回到菜单屏幕,但我希望两个屏幕都退出。

请任何帮助将不胜感激。

示例代码:

菜单屏幕

def menu():
    running = True

    while running:
        screen.blit(intros, (0,0))
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False

        GUI.button("Play game", 24,300, 128,50, violet, blue, screen, MAIN)
        necessary things here!

def MAIN():
    running = True

    while running:
        screen.blit(intros, (0,0))
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False

        all action starts here

请任何人给我一个关于如何运行菜单游戏的建议,这样当点击播放按钮并且主代码正在运行时,当我点击关闭时,游戏停止并且不返回菜单代码。

我读了几个论坛上关于使用if__name__ = "__main__但我发现它没有用也许我不知道如何正确地实现它

共有3个答案

柳威
2023-03-14

代码中变化不大的一个简单解决方案是,只需使用peek查找QUIT事件,而无需将其从事件队列中删除:

def MAIN():
    while True:
        screen.blit(intros, (0,0))
        if pygame.event.peek(pygame.QUIT):
            # since we're in a function, we can simply use return
            return
        for event in pygame.event.get():
            # handle other events

        #all action starts here

另一种方法是使用pygame再次发布QUIT事件。事件post

def MAIN():
    while True:
        screen.blit(intros, (0,0))
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.event.post(pygame.QUIT)
                # since we're in a function, we can simply use return
                return 

        #all action starts here

但是这有点难看,尽管它可以确保事件进入菜单循环。

IMHO需要重写大量代码的最佳解决方案是使用单个主循环和状态来决定当前实际处理的场景(菜单或游戏)。

看看这些问题/答案,从中获得灵感:

  • Pygame级别/菜单状态
薛弘济
2023-03-14

现在是拆分代码的好时机。我建议您只使用一个循环。查看状态模式。

您需要的是一个单独的类,它将在适当的时候调用屏幕中的函数。我在这里起草一份草稿,然后你可以继续。

class Window:
    def __init__(self):
        self.state = Menu()
        self.screen = initPygame()
    def run():
        self.state.draw(self.screen)
        self.state.update()
        for event in pygame.event.get():
            self.state.handleEvent(event) 
            if event.type == pygame.QUIT:
                running = False

class Menu:
    def __init__(self):
        pass
        #initialize all menu things (images etc)
    def handleEvent(self, event):
        #change state caused by event
        pass
    def draw(self, screen):
        pass
    def update(self):
        #called once per frame
        pass
蒙光华
2023-03-14

这是因为你有两个同时循环。设置run=False仅退出当前的同时循环,因此您将MAIN留在您调用它的菜单中。

如果您想设置run=False退出两个循环,请将其设置为全局变量(并且只有一个)。

running = True
def menu():
    ...
def MAIN():
    ...

您还可以使用import syssys。退出()如果要完全退出程序。但是我推荐第一个。

 类似资料:
  • 问题内容: 我正在使用Node,并且需要使此功能每天在午夜运行,这可能吗? 问题答案: 我相信节点计划包将满足您的需求。通常,您希望所谓的cron安排和运行服务器任务。 使用 节点计划 :

  • 在阅读了一些关于如何将xampp升级到新版本的php的问题后。我开始升级我的版本7因为我想学习 严格类型提示 我从官方网站下载了PHP7。我将这个下载文件夹的内容复制到xampp的php文件夹中。但它不起作用。我重新命名了php。ini开发到php。伊尼。有没有更好的方法来做到这一点,因为它不起作用。 请帮忙。

  • 主管可以管理员工、进行用车审批等,出行管理更高效。 一、员工属性升级 【优化】去掉所属管理员,通过部门、项目、角色进行员工管理 【优化】优化角色,一个员工可以拥有多个角色 【新增】增加所在项目,方便按照项目进行用车管理 【新增】增加离职状态,已过离职日期或无法删除的员工,无法使用企业支付用车 二、部门成本中心升级为部门 【新增】增加部门主管,支持快速审批、按部门进行管理(主要是订单查询) 【新增】

  • 所以,如果我们只想在Liferay startup上运行一些东西,我们可以使用其他一些答案中描述的技术,比如下面。然而,为了使用OS管理表达式来表达自己,它提供了“自动运行”功能。每次启动Liferay时,此代码都会运行。这对于portlet初始化和其他工作非常有用,每次启动Liferay时都需要执行这些操作。 但是,我想知道的是,Liferay中是否有“运行一次”功能?那么,有没有一种方法可以指

  • 我正在使用Maven SureFire,TestNG(扩展AbstractTestNGCucumber测试)和Cucumber,并且有几个功能文件,每个文件都有几个场景。我希望能够在一个功能文件中并行运行每个场景,但一次只能运行一个功能文件。这有可能吗? 举个例子: 我希望场景1a、1b和1c在功能文件1中并行运行。一旦这些完成,运行场景2a和功能2等的2b。 这是当前一次从所有功能文件运行所有方

  • Windows 请按照下列步骤在 Windows 上升级 Navicat Monitor: 在通知区域中,右击 并选择“检查更新”。 如果有新版本,点击“安装”。 升级完成后,Navicat Monitor 会自动启动。 macOS 请按照下列步骤在 macOS 上升级 Navicat Monitor: 在菜单栏,点击 并选择“检查更新”。 如果有新版本,点击“安装更新”。 下载完成后,点击“安装