在pygame的多台显示器(Multiple Displays in Pygame)

2019-06-25 14:33发布

我正在做一个小游戏,我想从我的主要一个再拍窗口内。

我有一个主窗口中的主要游戏,我想打开一个新的窗口,当用户做一些事情做一个小动画。

在下面我示例代码,当用户按下“是”我希望它打开一个新窗口和位图传送到那里。

在这里我设置了两个窗口:(我知道这不工作,它就是我要问怎么办)

SCREEN_X = 400
SCREEN_Y = 400
BSCREEN_X = 240
BSCREEN_Y = 160

BATTLE_SCENE = pygame.display.set_mode((BSCREEN_X, BSCREEN_Y))
SCREEN = pygame.display.set_mode((SCREEN_X, SCREEN_Y))

然后程序:

def run_ani ():
    #Do animation, blitting to BATTLE_SCENE
    return

def main_game():
    ending=False
    while ending==False:
        clock.tick(30)
        for event in pygame.event.get():
            if event.type == pygame.QUIT: ending=True
            if event.type == KEYDOWN: # key down or up?
                if event.key == K_ESCAPE:
                    ending=True # Time to leave
                    print("Stopped Early by user")
                elif event.key == K_a:
                    run_ani()
        #Normal screen motion, blitting to SCREEN
        if ending: pygame.quit()
    return

到目前为止,这样做是绘制主屏幕,则当按下A,它停止绘制主屏幕动画,但仍然吸引了主屏幕上的其他动画,并在左上角绘制。

我敢肯定它这样做是因为我设置BATTLE_SCENE块传输的时候会比主屏幕小,从而BATTLE_SCENE它的blit在主屏幕的右上角,我创建的区域(240x160)。

不过,我想BATTLE_SCENE成为一个单独的窗口,所以,当我按“一”,它会弹出,做它的事,然后关闭或主屏幕后面至少去。

这该怎么做? 它甚至有可能?

Answer 1:

你真的需要多窗口? 我的意思是,你真的需要吗?

如果是,那么你或许应该使用pyglet / cocos2d的来代替。

要在pygame的多个窗口,则需要多个进程(每个窗口)。 虽然这是可行的,这是不值得的efford。 你需要IPC的窗口之间交换数据,我想你的代码会变得容易出错和丑陋。

与pyglet去的时候,你需要一个以上的窗口。

更好的解决方案可能是你的游戏分为场景。 创建多个场景让每一位代表游戏的一个阶段,像MenuScene,MainScene,BattleScene,GameOverScene,OptionScene等。

然后,请每个场景的游戏手柄的那部分很输入/图。

  • MenuScene处理游戏的菜单的绘图和输入等。
  • MainScene处理运行游戏的绘图和输入等。
  • BattleScene处理绘图和输入等任何你在做run_ani

在你的主循环,只是通过实施方法传递控制到当前场景draw() handle_event()update()

一些示例代码的想法:

scenes = {'Main': MainScene(),
          'Battle': BattleScene()} #etc

scene = scenes['Main']

class MainScene():
  ...
  def handle_event(self, event):
    if event.type == KEYUP:
      if event.key == K_a:
        scene = scenes['Battle']
  ...

class BattleScene():
  ...
  def draw(self):
    # draw your animation

  def update(self):
    # if animation is over:
    scene = scenes['Main']

...

def main_game():
  ending=False
  While Not ending:
      clock.tick(30)
      for event in pygame.event.get():
        scene.handle_event(event)
        scene.update()
        scene.draw()

这是一种简单的方法来清洁单独游戏逻辑和允许上下文切换。



Answer 2:

======================================编辑=========== ==============================

其实这是行不通的。 Apperantly pygame的只支持一个显示屏幕,当你初始化另一个,它会关闭第一。 您将逗留两个可变因素,这实际上是同一表面。 你可以有,而不是游戏增加窗口大小和播放战斗场景在它的侧面,要做到这一点,你可以用不同的值再次调用pygame.display.set_mode()。 它引用在显示屏幕的varible将仍然是可用的,因为它改变到新的一个其参考。 之后现场结束后,您可以减少窗口回以同样的方式。

================================================== ================================

这些操作的基本是你运行一个循环,而它每次迭代渲染和显示一个新的框架。 当你调用一个循环内的函数,它不会继续运行,直到完成运行的功能。

要解决这个一点改进只是保持通话,在主循环更新战斗场景功能的一种方法。 另一种方法是使用线程。 线程基本上是在同时运行多个脚本(“线程”)。

幸运的是,蟒蛇已经与线程模块来实现这个我们。 这太长时间,我在这里解释的模块,但你可以了解它在这里 。 这可能是一个有点复杂,如果你以前没有使用线程,但一段时间后它会更容易。 如果你想了解更多关于线程你可以去这里 。

Specificly在这里,你可以有两个线程,每一个循环/窗口,并在同一时间运行它们。

希望我帮助你!



文章来源: Multiple Displays in Pygame