首页 > 解决方案 > Python:在 pygame 中创建多个循环的更好方法是什么?

问题描述

我会知道在我的 pygame 项目中创建多个循环的最佳方法是什么。这是我将拥有的所有循环:

load loop
game loop
main loop
setting loop
pause loop

但这是最好的方法吗?

这就是我的代码的样子

run = True
while run :
   # do load loop

def main():
   run = True
   while run :
      if loop == 'main' :
         run2 = True
         while run2 :
             # pygame loop

      if loop == 'pause' :
         run2 = True
         while run2 :
            # other loop
...

if __name__ == '__main__' :
   main()

标签: pythonpython-3.xloopswhile-looppygame

解决方案


为什么需要多个嵌套循环?一个存储游戏当前状态的变量就足够了:

def main():
    gamestate = 'load'
    run = True
    while run:

        if gamestate == 'load':
            # [...]

        elif gamestate == 'game':
            # [...]

        # [...]
            # [...]

        pygame.display.flip()

if __name__ == '__main__' :
    main()

如果你想切换游戏的状态,那么你所要做的就是改变变量gamestate
您只需要一个运行游戏的主循环。循环中发生的事情可能会有所不同,具体取决于游戏的当前状态。但它始终是同一个循环,它处理事件、清除显示、绘制场景并最终更新显示。

请注意,您甚至可以定义执行游戏不同部分的函数,但您不需要函数中的循环:

def load(events):
    # [...]

def game(events):
    # [...]

def main():
    gamestate = 'load'
    run = True
    while run:

        events = pygame.event.get()
        for event in events:
            if event.type == pygame.QUIT:
                run = False

        # [...]

        if gamestate == 'load':
            load(events)

        elif gamestate == 'game':
            game(events)

        # [...]
            # [...]

        pygame.display.flip()

if __name__ == '__main__' :
    main()

甚至在课堂上:

class MyGame:
    def __init__(self):
        self.gamestate = 'load'
        self.run = True
        self.events = []

    def load(self):
        # [...]

    def game(self):
        # [...]

    def main(self):
        while self.run:

            self.events = pygame.event.get()
            for event in self.events:
                if event.type == pygame.QUIT:
                    self.run = False

            # [...]

            if self.gamestate == 'load':
                self.load()
            elif self.gamestate == 'game':
                self.game()
            # [...]
                # [...]

            pygame.display.flip()

if __name__ == '__main__' :
    app = MyGame()
    app.main()

推荐阅读