2012-06-19 54 views
6

私はちょっとした試合をしています。私はメインのものとは別に別のウィンドウを作りたいと思っています。Pygameの複数のディスプレイ

メインウィンドウにメインゲームがあり、ユーザーが何か操作をしたときに新しいウィンドウを開き、少しアニメーションを行いたいと思います。

私の例のコードでは、ユーザーが "a"を押すと、新しいウィンドウを開き、そこでblitしたいと思います。

ここで私は2つのウィンドウを設定します(私はこのdoesntの仕事を知っている、その私は何をどのように求めている)

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にブリッティングすると、メイン画面の上隅に作成された領域(240x160)にブリットしてしまうので、これを行うと確信しています。

しかし、BATTLE_SCENEは別のウィンドウにしたいので、 'a'を押すとポップアップし、そのことを行い、その後閉じるか、少なくともメイン画面の後ろに移動します。これを行うにはどのように

?それも可能ですか?

+0

とにかく –

+0

これを行うべきではないことは、私はそれを行うべき方法があることを意味していますか?もう少し説明するといいだろう:) – hammythepig

+0

アニメーションのための既存のウィンドウ内の領域を作る。 –

答えて

8

本当に複数のウィンドウが必要ですか?本当に必要なの?

この場合は、おそらくpyglet/cocos2dを代わりに使用する必要があります。

pygameに複数のウィンドウを表示するには、複数のプロセス(各ウィンドウに1つ)が必要です。これは実行可能ですが、それは楽器の価値がありません。ウィンドウ間でデータを交換するにはIPCが必要です。あなたのコードはエラーが発生しやすく、醜いものになるでしょう。

複数のウィンドウが必要な場合は、pygletを実行してください。

もっと良い解決策は、おそらくゲームをシーンに分割することです。 MenuScene、MainScene、BattleScene、GameOverScene、OptionSceneなどのゲームの1つのステージを表すように複数のシーンを作成します。

これらのシーンのそれぞれは、ゲームのその部分の入力/描画を処理します。

  • MenuSceneは、ゲームのメニュー
  • MainSceneの描画や入力などを扱う扱うなど、あなたがrun_ani
で行うどんなの走行
  • BattleScene描画ハンドルゲームと入力等を描くと入力

    メインループでは、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() 
    

    これはきれいにゲームロジックを区切ると、コンテキストの切り替えをできるようにする簡単な方法ですが。

  • +0

    ああ、いくつかのクラスを参照してください。私は授業が好きではなかったので、とても混乱していましたが、あなたがそこに書いたことを理解しています。私はもっ​​とクラスを見て、もっと多くのものを学ぶだろうと思う。今のところ私はあなたの答えを取っています、これは、私が欲しいものをするためのシンプルで効果的な方法のように思える、ありがとう! :) – hammythepig

    +0

    thatsスマートなアイデアは、そのようなものの知識を共有するthats。私はこのすべてのものを学ぶのが好きで、同時に面白いと楽しいです。 – hammythepig

    1

    ======================================編集======= ==================================

    実際には動作しません。 apperantly pygameは1つの表示画面しかサポートしておらず、別の画面を初期化すると、最初の画面が閉じます。あなたは、実際には同じ表面である2つの変動柄を持っています。代わりに、ゲームのウィンドウサイズを増やし、その横にある戦闘シーンをプレイすることができます。これを行うには、pygame.display.set_mode()を別の値でもう一度呼び出すことができます。表示画面を参照する変数は、新しいものへの参照を変更するので、使用可能になります。シーンが終了したら、同じ方法でウィンドウを戻すことができます。

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

    何基本的に起こるあなたがループを実行しており、それを繰り返すごとに新しいフレームがレンダリングされて表示されます。 ループ内で関数を呼び出すと、関数の実行が終了するまで関数は実行されません。このproblenを解決する

    一つの方法は、ちょうどメインループに戦闘シーンを更新関数を呼び出しておくです。 別の方法はスレッドを使用することです。スレッディングは基本的に複数のスクリプト(「スレッド」)を同時に実行しています。

    幸いにも、Pythonはすでにthreadingモジュールとの私達のためにこれを実装しました。 ここでモジュールを説明するには余りにも時間がかかりますが、それはhereを学ぶことができます。前にスレッドを使用していないのであれば少し複雑かもしれませんが、しばらくすると簡単になります。 スレッディングの詳細についてはhereをご覧ください。

    Specificlyここでは、次の2つのスレッド、各ループ/ウィンドウのための1つを持っているし、同じ時間でそれらを実行することができます。

    は、私はあなたを助け願っています!

    関連する問題