2017-02-27 9 views
1

これまでにさまざまなシンプルな2次元ゲームを作成していました。シンプルなので、このようなものを作成する必要はありませんでした。しかし、私は今戻って4番目に行く必要があるので、それが必要です。 しかし、私は何らかの方向を必要としています...ステートマシンをPythonで作成する

私は新しいゲームに約200行あり、私は実際のゲームを開始していない、現在はすべてのウィンドウ、イベント、州の

### state machine 

def run: 
    #~setup window 

    # Current state 
    state = menu() 

    running = True 
    while running: 
    #~event handler 

    returns = state.update(events) 
    if returns == "playgame": 
     state = game() 
    state.draw(window) 
#menu state 
class menu: 
    def __init__(self): 
    #~define vars for the menu (buttons, etc...) 
    self.clickables = [] # filled with gui etc.. 
    self.image = image() # image of the menu 

    def update(self, events): 
    for event in events: # go through events 
     for clickable in self.clickables: # go through clickables 
     if clickable.testClicked(event.pos) != False: # Returns if clicked 
      return clickable.testClicked(event.pos) 

    def draw(self, window): 
    self.image.draw(window) 
#game state 
class game(menu): # Exactly the same as menu (just used as example) 
    def __init__(self): 
    super(menu).__init__() 
#gui button 
class button: # Extremely shortened for example use 
    def __init__(self, do): # do is a string 
    self.whenClickedDo = do 

    def testClicked(self, mousePos): 
    if mousePos in self.myRect: # myRect is the area of the button (Example!) 
     return self.whenClickedDo 
    return False 

この上記の例では、完全に駆けつけたが、私は熟考質問がありました...これは何を達成するためのより良い方法があるか、物事を行うにはスマート/実現可能な方法を上回っていますか?

TLDR;関数 "run"は、それ自身を別の状態に変更するために使用される値を返すことができる値 "state"を有する。それは状態マシンを作るための合理的な方法ですか?

+0

(私は遅い日を過ごしています)あなたはゲームの状態に関するアドバイスを受けていますか?例えば。 「メインメニュー」の状態、「ゲームのプレイ」の状態などの情報を含む。 – RichSmith

+0

@RichSmithいいえ...現在の状態から新しい状態を返すかどうか知りたいのですが、コミュニティの大多数が更新機能を優先しています – AUFakie

答えて

0

シンプルなゲームエンジンをC++で作成し、画面ベースのシステムを使用しました。私はあなたのためにPythonで簡単なバージョンを試してみましょう。アイデアは、ゲームの各部分が異なる画面であるということです。メインメニュー、画面、ゲームプレイ画面(すべてのアクションが行われる場所)、ユーザーが設定を変更するためのオプション画面などがあります。これらはすべて画面リストで管理され、各画面リスト内にポジションがあり、ゲームイベントに応じて画面を切り替えることができます。したがって、メインメニュー画面がアクティブな場合、ユーザーが '再生'ボタンをクリックすると、ゲームプレイ画面がロードされます。

私の頭の上を、私がそれをPythonに移植する方法を正確に考えることはできませんが、これは少なくともあなたがどこかで始めるべきです。

ので、画面はこのようなクラスのものになるだろう:

class Screen: 

    # you can have objects in the screen as variables of the class here 
    # e.g self.player = None 

    def onEntry(self): 
     # here you would init the assets for your screen 
     # this could be the interface, sprites etc 
     # e.g self.player = Player() 

    def onExit(self): 
     # do any clean up 
     # maybe save player data if this is a gameplay screen 
     # e.g self.player.save() 

    def update(self): 
     # main loop for this screen 
     # e.g self.player.update() 

あなたのゲームのために各特定の画面は、Screenクラスから継承し、その画面用のカスタム・ロジックでこれらの機能を実装します。次に、スクリーンリストは基本的にこれらのカスタムScreenクラスのリストになります。あなたのゲームは、これらの画面をちょうど切り替えるでしょう。

+0

私はおおよそ同じ考えを持っていると思います。これが最善の方法の一つであることに同意しますか? 「スクリーン」アイデアを使用しますが、テンプレートは使用しません。 – AUFakie

+0

@AUFakieええ私はこのアプローチが本当に好きです、それはゲームの状態とロジックがお互いにかなり離れていることを保ちます、それはまた新しい機能を本当に簡単に追加します – RichSmith

関連する問題