[[目次へもどる>PuyoPuyo]] * GameMain [#n376831e] #contents シーンができたので今度はシーンを管理する機構,すなわちゲームの処理のメインとなる部分を作る. ** シーンの追加考察 [#d737411b] まずシーンについてだが, シーンの切り替えについてはいくつかのパターンがある. + change + push + jump changeは「タイトル画面→ゲーム画面」のように単純にシーンが切り替わる. pushは「マップ画面→メニュー画面→マップ画面」のようにもとのシーンを保持したままシーンを切り替え,また戻ってくるような切り替え. jumpは「リセットボタン」のようにとにかくそのシーンへぶっ飛ぶ切り替え. これらを実現するデータ構造としてはスタックが適切である. changeならスタックトップのシーンをポップして新たなシーンをプッシュすればよい. pushなら単純にシーンをプッシュして,戻るときはポップする. jumpはスタックを全部捨てれば良い. 今回はこれらの実装はおいおいやればどうにでもなるのでpushだけ作っといた. どうせ当分ScenePuyoPuyoしかないので問題ない. ** GameMainの定義 [#u2ae0639] ゲームのメイン処理は複数存在しないので,クラスではなくモジュールで実装する. #sh(ruby){{ module GameMain @scene = [] def self.main scene_push(ScenePuyoPuyo) StarRuby::Game.run(320, 240, :title => "PuyoPuyo", :fps => 60) do |game| break if @scene.empty? @scene.last.main end end def self.game StarRuby::Game.current end def self.screen StarRuby::Game.current.screen end def self.scene_push(scene) @scene.push scene.new @scene.last.start end def self.scene_pop @scene.pop.terminate end end if __FILE__ == "game_main.rb" require "./require.rb" GameMain.main end }} 上記の説明のとおりシーンはスタックで管理すれば良いので@sceneに配列を作っておく. 「main」メソッドではStarRubyを使ってゲームウインドウを作成し,メインループを作っている. このループ内でスタックトップのシーンのmainメソッドを呼びまくる. シーンスタックが空になればゲームが終了する仕組みになっている. 以後,テストプレイはgame_main.rbをトップレベルで実行することで行う. $ ruby game_main.rb