Javaによるゲーム解説 −8−





8.オープニングからエンディングまで  〜場面を管理する〜



ゲームというのは、まずタイトル画面があって、ボタンを押すと簡単なストーリーなんかが表示されて、更に進むとメインのゲーム部分が始まるといった形式が一般的だと思います。またRPGのようにメインのゲーム部分でもフィールド画面と戦闘画面がはっきりと分かれているものも多いです。
ここでは、Scene(=シーン、場面)クラスを新たに用意して、それらゲームの各場面を一般的に扱うことを考えます。

各シーンはSceneクラスの派生クラスとして詳細を記述します。各シーンは構成要素となるオブジェクトをSceneObjManagerによって保持、管理します。
そして各シーン自体もSceneManagerにシーンIDと共に格納されて管理されます。
SceneManagerは、シーンが非アクティブになると次のシーンを用意します。その際、次のシーンは何かをWorldInfoに問い合わせます。

Sceneクラスにはsetupメソッドやcleanupメソッドがあり、これらがSceneManagerによって、シーンの開始、終了の際に呼ばれるようになっています。(C++であればシーン丸ごとnewしたりdeleteしたりするわけですが、ここでは特に参照をなくしてガベージコレクションを促すようなことはせず、すべてのシーンの実体を同時に存在させます。)
また、SceneManagerはその時有効なシーンのupdateメソッドを更新のタイミングで毎回呼び出します。
プログラムの各所でif文によって処理を分岐するのではなく、データも処理も完全にシーン毎に分けて、各シーンのupdateメソッド等をSceneManagerが呼び出す仕組みです。

ゲームをシーン単位で設計するこのような方法は、最近のゲームでは割と一般的ではないかと思います。


各ソースは以下です。
./tuto08/

SceneManager.java :シーン管理
Scene.java :シーンの基本クラス
  ├OpeningScene.java :オープニングの実装
  ├StageInfoScene.java :ステージ情報シーンの実装
  ├GameScene.java :ゲームシーン基本実装
  │   └tuto08GameScene.java :このサンプルに特化したゲームシーンの実装
  └EndingScene.java :エンディングの実装

SceneObjManager.java :シーンの要素の管理クラス(各シーンが保持)
SceneObject.java :シーンの要素の基本クラス(SceneObjManagerに登録される)
  ├DispObject.java :表示オブジェクト基本クラス
  │  ├SPanel.java :背景パネル
  │  │   └SScreen.java :ゲーム用スクリーン
  │  └SComponent.java :Panelに乗せる簡易コンポーネント基本クラス
  │       ├SLabel.java :ラベルクラス
  │       └SImage.java :イメージコンポーネントクラス(ここでは未使用)
  └GameObjManager.java :ゲーム本体のオブジェクト管理クラス
      ├PlayerManager.java :プレーヤーキャラ用管理クラス
      ├PlayerShotManager.java :プレーヤー弾用管理クラス
      ├EneCharaManager.java :敵キャラ用管理クラス
      ├EneShotManager.java :敵弾用管理クラス
      ├ScreenLabelManager.java :ゲーム内ラベル管理クラス
      └EffectManager.java :効果オブジェクト管理クラス

GameObject.java :ゲーム本体のオブジェクト基本クラス
  ├ScreenLabel.java :ゲーム内ラベルクラス
  ├PlayerChara.java :プレーヤーキャラクラス
  ├PlayerShot.java :プレーヤー弾クラス
  ├Effect.java :効果クラス
  │ └ExplosionEffect.java :爆発効果クラス
  └EnemyObj.java :敵基本クラス
      ├EneChara.java :敵キャラクラス
      └EneShot.java :敵弾クラス

ResourceManager.java :リソース管理クラス
ImageOwner.java :Imageを持つことを意味するインターフェース
WorldInfo.java :ゲーム全体情報の管理に関するインターフェース
tuto08.java :アプレット本体(WorldInfoを実装している)



実際に見てみる



やや補足しておくと、PlayerManagerクラスあたりがごちゃごちゃと沢山あるのは、ダウンキャストをフレームワーク内のみに収めようとした結果です。


※この章のソースを基本にして作ったゲームがこれです。



次の章は敵や敵弾、表示効果の多様性をデータで表現するための仕組みを考えてみます。
すべての多様性をクラスの派生によって表現すると、そのシーンでの出現数が決まったようなシステム以外ではその都度オブジェクトをnewし直さなければならなくなり、パフォーマンスやリソース管理の面で問題が出ます。もしくは問題が出ないように勘定をしながらゲームを作っていくことになります。
よってある程度オブジェクトの多態に頼らない仕組みを混ぜることが要求されます。
またこれは、「ゲーム製作をプログラマーの個人技からプランナーやデザイナーの側にシフトさせる仕組み」にもなります。(2004.01.03)







目次に戻る