在python中导入/线程化

时间:2013-02-20 19:42:51

标签: python multithreading import pygame

我的项目:

  • pygame中的GUI,其中包含一个按钮网格
  • 游戏装载机
  • 许多需要使用GUI的游戏

所有单独的.py文件

应用程序加载器应启动GUI,用户单击GUI上的按钮,使游戏加载器加载特定游戏,然后用户通过单击GUI上的其他按钮与游戏逻辑交互,游戏状态也是显示在GUI上。

我不确定如何在python中构建这个,因为游戏加载器应该导入GUI,但GUI是否需要导入游戏加载器来调用加载特定游戏的方法?和游戏文件类似的交互?

GUI是一个可以选择的选项,因为我有可以执行相同功能的硬件,它们也可以相互协作。

类似于所有三个组件都需要能够相互调用函数,但import只允许这是一种方式。有没有办法使导入行为像不同的文件都是同一个文件的一部分?而不是他们互相导入?

我已经尝试了很多不同的东西,导入,线程等,但无法获得任何工作,任何帮助都非常感激

对于措辞不好的问题感到抱歉。

1 个答案:

答案 0 :(得分:0)

任何游戏都与事件循环有关。

所以要构建你的游戏:

  1. 有一个代表游戏加载器循环的模块,它呈现这些按钮的GUI。一个好的做法是在事件循环之外和之前进行大多数(甚至是所有)真正的GUI渲染,然后使用事件循环+一堆if-else语句来监听按钮点击。
  2. 让每个按钮单击代表一个特定事件,并委派在单击每个按钮以分隔功能后会发生什么,这些功能负责导入和加载特定游戏模块(其他.py)。
  3. 您可以替换主窗口的行为,以便游戏加载器GUI消失,特定游戏将重新使用它,或者只是为特定游戏生成另一个窗口。
  4. [Alt to 2]您可以将实际游戏逻辑放在单个模块中的不同线程中,该模块也承载游戏加载器循环。正确使用这种方式可以带来更具响应性的整体游戏体验(例如,切换出游戏将返回到运行游戏加载器循环的另一个线程,而内存仍然很热)
  5. 很难说明如何做到这一点:

    import pygame
    import game_module_one  # your game logic
    # two, three, four...
    
    # Your game loader
    def main():
        # Initialise window
        pygame.init()
        window = pygame.display.set_mode((1024, 768))
        # Bunch of rendering jobs, set fonts, draw buttons, etc.
    
        # Event loop
        while 1:
            for event in pygame.event.get():
                if event.type == QUIT:
                    return
                elif event.type == "start_game_one":
                    do_game_one(window)
                #...
    
    # Game one loading function
    def do_game_one(window):
        # do something to that window if you intend to
        pygame.display.flip()
        game_one_module.start()
    

    考虑鼠标,事件,显示和表面上的reference

    希望这有帮助。