我正在做一个小游戏,我想从我的主要一个再拍窗口内。
我有一个主窗口中的主要游戏,我想打开一个新的窗口,当用户做一些事情做一个小动画。
在下面我示例代码,当用户按下“是”我希望它打开一个新窗口和位图传送到那里。
在这里我设置了两个窗口:(我知道这不工作,它就是我要问怎么办)
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
成为一个单独的窗口,所以,当我按“一”,它会弹出,做它的事,然后关闭或主屏幕后面至少去。
这该怎么做? 它甚至有可能?
你真的需要多窗口? 我的意思是,你真的需要吗?
如果是,那么你或许应该使用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()
这是一种简单的方法来清洁单独游戏逻辑和允许上下文切换。
======================================编辑=========== ==============================
其实这是行不通的。 Apperantly pygame的只支持一个显示屏幕,当你初始化另一个,它会关闭第一。 您将逗留两个可变因素,这实际上是同一表面。 你可以有,而不是游戏增加窗口大小和播放战斗场景在它的侧面,要做到这一点,你可以用不同的值再次调用pygame.display.set_mode()。 它引用在显示屏幕的varible将仍然是可用的,因为它改变到新的一个其参考。 之后现场结束后,您可以减少窗口回以同样的方式。
================================================== ================================
这些操作的基本是你运行一个循环,而它每次迭代渲染和显示一个新的框架。 当你调用一个循环内的函数,它不会继续运行,直到完成运行的功能。
要解决这个一点改进只是保持通话,在主循环更新战斗场景功能的一种方法。 另一种方法是使用线程。 线程基本上是在同时运行多个脚本(“线程”)。
幸运的是,蟒蛇已经与线程模块来实现这个我们。 这太长时间,我在这里解释的模块,但你可以了解它在这里 。 这可能是一个有点复杂,如果你以前没有使用线程,但一段时间后它会更容易。 如果你想了解更多关于线程你可以去这里 。
Specificly在这里,你可以有两个线程,每一个循环/窗口,并在同一时间运行它们。
希望我帮助你!