人工知能に関する断創録スマートフォン用の表示で見るスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。ロボティクス、生物学などに興味を持っています。このブログでは人工知能のさまざまな分野について調査したことをまとめています。Learning、Kerasに関する記事が多いです。2008-07-27ゲーム状態の導入Pygame今回はタイトル画面をつけます。タイトル画面のように別の画面が入ってくると実装がこんがらがってくるため、ゲーム状態によって更新・描画・イベントハンドラを分離するようにスクリプトを修正します。今までmain()に書いていた処理をクラス化します。今回は細かい修正が多いです。タイトル画面では、矢印の上下でメニューを選択し、スペースキーで実行します。STARTを実行すると今までのゲーム画面に移ります。EXITを実行するとプログラムが終了します。CONTINUEは未実装です。今回からフルスクリーンモードにしました。スクリーンショットをよく見るとタイトルバーがないですよね。プログラムはESCキーで終了します。ゲームループの整理まず、今回行った大きな修正は、main()関数を排除してPyRPGというクラスを作成したことです。PyRPGクラスのコンストラクタ__init__()に移っています。main()で使っていたもろもろの関数はPyRPGクラスのメソッドになっています。main()で使っていたいろいろな変数はPyRPGクラスのインスタンス変数(selfがつく変数)になっています。インスタンス変数にするメリットはけっこう大きくてPyRPGクラス内のどのメソッドからもアクセスできるようになります。今までのように引数で渡す必要がなくなったのでプログラムがすっきりします。メソッドだけ並べると下のようになっています。&quot;&quot;&quot;マップチップをロードしてMap.imagesに格納&quot;&quot;&quot;main()に関連のあるグローバル領域にあった関数が全部PyRPGクラスのメソッドになっていることがわかります(見たことないメソッドは後で説明します)。あとメインループ内の更新・描画・イベントハンドラも独立したメソッドにしました。そのおかげでメインループが下のように非常にすっきりした構造になります。PyRPG()PyRPGクラスを動かすにはオブジェクトを作るだけです。あとはかってに__init__()が呼ばれてメインループが起動してゲームが始まります。今回の修正の目玉はゲーム状態を表す変数(game_state)を導入したことです。ゲーム状態というのはその名の通りで今ゲームがどういう状態にあるかを表した変数です。今回は、4つのゲーム状態を定義しています。会話状態(TALK):メッセージウィンドウを表示している状態この4つの状態では、画面に描画するもの、更新するもの、キー入力の意味がまったく異なる点に注意してください。タイトル画面はフィールド画面と描画するものが違います。タイトル画面ではゲームのタイトル、メニュー、クレジットを描画するのに対し、フィールド画面ではプレイヤー、マップを描画します。フィールド状態でスペースキーを押したときと会話状態でスペースキーを押したときでは意味が違います。フィールド状態でスペースキーを押すとコマンドウィンドウが出ますし、会話状態でスペースキーを押すと次ページへ移ります。いう場合は、ゲーム状態を導入するとすっきり整理できます。下のプログラムを見てください。self.talk_handler(event)game_stateがゲーム状態です。game_stateは4つの状態TITLE、FIELD、COMMAND、TALKを取ります。更新(update)、描画(render)、キー入力の処理(check_event)では、ゲーム状態によって処理を分岐しているのがポイントです。キー入力の処理をしているcheck_event()を見てみます。ゲーム状態によって異なるイベントハンドラを呼び出していることがわかります。タイトル状態では、それ専用のtitle_handler()を呼び出してキー入力を処理させます。フィールド状態では、field_handler()を呼び出してキー入力を処理させます。このようにゲーム状態で処理を分岐させるとプログラムの構造がすっきりします。状態遷移もう1つ重要なのが状態遷移です。ゲーム状態がどのように移り変わるかを表す言葉です。タイトル状態でSTARTメニューに合わせてスペースキーを押すとフィールド状態に移って移動できるようになります。フィールド状態でスペースキーを押すとコマンドウィンドウが表示されるコマンド状態に移動します。はなすメニューを実行するとメッセージウィンドウが表示されて会話ウィンドウが表示されます。会話が終了するとメッセージウィンドウが閉じてフィールド状態に移動します。このような状態の移り変わりをわかりやすく示した図を状態遷移図と言います。例としてフィールド画面でスペースキーを押したときにコマンド状態へ移動するコードを見てみます。COMMAND状態へ移動フィールド画面のイベントハンドラでスペースキーを押したときにgame_stateをCOMMANDに変えています。別の例としてコマンド状態ではなすに合わせてスペースキーを押したときに会話状態へ移動するコードを見てみます。別のゲーム状態へ移動することでupdate()やrender()によって別のオブジェクトが更新や描画されるようになります。次にTITLE状態のときに表示されるタイトル画面がどのように実装されているか見てみます。タイトル画面の描画や更新はTitleというクラスにまとまっています。pygame.mixer.music.play(-1)タイトル画面でのキー入力の処理は、PyRPGクラスのtitle_handler()にまとまっています。sys.exit()矢印キーの上下でメニューを選択し、スペースキーで実行しています。STARTメニューではFIELD状態に移動してゲームを開始します。CONTINUEメニューは未実装ですね。EXITメニューはプログラムを終了します。フルスクリーンモード最後になりますが、今回からフルスクリーン表示してみました。書き換える場所は下の1カ所だけです。これだけでフルスクリーンにできるんですからすごいですね!フルスクリーンがやだったら簡単に戻せます。フルスクリーンの方法はフルスクリーンモードに詳しく書いたので参照してください。DOUBLEBUF|HWSURFACE|FULLSCREEN)さあタイトルもついてゲームっぽくなってきました。»プロフィールid:aidiary人工知能とその関連分野に興味があります。Blog|ブログを報告する。