【问题标题】:Python : What is the better way to make multiple loops in pygame?Python:在 pygame 中创建多个循环的更好方法是什么?
【发布时间】:2020-01-14 10:11:12
【问题描述】:

我会知道在我的 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()

【问题讨论】:

    标签: python python-3.x loops while-loop pygame


    【解决方案1】:

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

    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()
    

    【讨论】:

    • 没有if __name__ == '__main__' : main() 还是在里面?
    • @Edhyjox 我更喜欢使用main 函数。请注意,您甚至可以使用 run 或 main 方法创建应用程序类。
    • 最好在课堂上做吗?
    • @Edhyjox 我会使用一个类。注意,您可以将数据存储到实例属性中(如self.gamestate 或self.events),并且您不需要在类的方法中添加很多通用参数,因为您可以访问其他方法中的属性。
    • @Edhyjox 你可以把循环放在构造函数中(__init__)。
    猜你喜欢
    • 2019-04-14
    • 1970-01-01
    • 2021-08-18
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    相关资源
    最近更新 更多