次のページへ >>  << 前のページへ  目次へ



3.3.プログラムインスタンスと初期化

 プログラムインスタンスとは、「プログラム起動時に最初にメモリに読み込まれ実行されるインスタンス…」 のような考えとなり(Javaの言語仕様としては意味合いが異なります)、本ゲームフレームワークでは mainメソッドを持つクラスをこのような位置づけとします。
このクラス(ActionGame)はゲーム内容よりもユーザーの入力したパラメータの解析、プログラムとしての初期化、 ゲーム内容に必要なクラス(メインスクリーンクラス(MainScreen), 中核クラス(God))の生成、 生成したメインスクリーンクラスの設定、中核クラスのメインループ呼び出しを担当します。

プログラム起動からの流れ
Figure.プログラム起動からの流れ


 ここで幾つかのクラスの紹介が行われたので、以降に各々の説明をしていきます。



3.3.1.プログラムインスタンス (ActionGameクラス)

 参考ソース(適当):ActionGame.java mainメソッド

 プログラムインスタンスはJavaのmainメソッドを持つプログラムのエントリポイント (プログラムの実行時の一番最初に実行されるメソッド)となるものです。
クラスはActionGameとなり、JFrameクラスより派生を行います。 このため、ActionGameクラスはアプリケーションウィンドウクラスとなります。
このウィンドウにより、キーボード入力の受付や、ウィンドウを閉じることによって、 プログラムの強制終了が行えるようになります。

ウィンドウ
Figure.JFrameのウィンドウ

 ActionGameクラスはmainメソッドより以下の処理を行います。

処理
起動パラメータの解析
使用方法の表示
バージョン情報の表示
フルスクリーンの診断
メインスクリーンブジェクトの生成と初期化
中核オブジェクトの初期化
中核オブジェクトのメインループの呼び出し

 また、メインループの呼び出し完了後には以下の処理を行います。

処理
キーボード入力のイベント処理



・起動パラメータの解析 (ArgsAnalyzerクラス)

 参考ソース(適当): ActionGame.java mainメソッド, ArgsAnalyzer.java analyzeメソッド

 起動パラメータの解析はプログラムの引数より渡される文字列を解析して、 ゲーム内部の変更可能パラメータのデータを求める処理となります。
この処理の実現にはArgsAnalyzerクラスを用いて実現を行います。
このクラスはパラメータ(キーワード=データ)の文字列集合を受け取り、解析結果を 自クラス内に持つメンバに設定します。
解析後はActionGameクラスがこの情報を元に、他のクラスにデータを設定します。



・使用方法の表示

 起動パラメータの解析が完了し、この際 "help", "--help", "-h", "/?" が 指定されていた場合はヘルプを標準出力に出力します。
ヘルプを表示した場合は本プログラムを終了します。

[Start parameter usage]
> java -jar ActionGame.jar [options...]

[options]
version
window_xy=x,y (default=0,0)
window_mag=magnification (default=2.0)
window_wh=width,height (default=256,240)
window_fullscreen=width,height,RefreshRate,ColorBitDepth (input "diagnose=2" result)
framerate=rate (1-100 : default=17)
sound_enable=mode (0:off 1:on : default=1)
bgm_external=mode (0:off 1:on : default=1)
draw_mode=mode (0:repaint 1:paintImmediately : default:1)
draw_detail_level=mode (0:high 1:middle 2:low : default:0)
diagnose=level (2:display diagnose)
Figure.ヘルプの標準出力



・バージョン情報の表示

 起動パラメータの解析が完了し、この際 "version", "--version", "-version", "-v" が 指定されていた場合はバージョン情報を標準出力に出力します。
バージョンを表示した場合は本プログラムを終了します。

[Progaram version] Ver.01.01
Figure.バージョンの標準出力



・フルスクリーンの診断

 起動パラメータの解析が完了し、この際 "diagnose=2" が 指定されていた場合はフルスクリーン画面の診断を行い、これを標準出力に出力します。
この診断はGraphicsEnvironmentクラスよりGraphicsDeviceクラス、DisplayModeクラスを取得し、 DisplayMode.getDisplayModesメソッドの結果が32bitカラー以上のものを標準出力します。
これは24bitカラー以下の色深度の場合、アフィン変換処理後のピクセルイメージが想定外に なってしまう現象が発生したための仕様となります(良い対処法があれば16bitカラー以上の サポートにしたいところです)。 診断を行った場合は本プログラムを終了します。

Diagnose[2]
[Start diagnose] mode:2
------------------
Display diagnose
------------------
device[0]
window_fullscreen=640,400,40,32
window_fullscreen=640,400,60,32
window_fullscreen=640,480,40,32
window_fullscreen=640,480,60,32
window_fullscreen=800,600,40,32
window_fullscreen=800,600,60,32
window_fullscreen=1024,768,40,32
window_fullscreen=1024,768,60,32
Figure.フルスクリーン診断の標準出力



・メインスクリーンブジェクトの生成と初期化 (MainScreenクラス)

 参考ソース(適当): ActionGame.java mainメソッド, MainScreen.java

 起動パラメータの解析が完了し、パラメータの解析が完了したら、ゲームに必要なスクリーン(MainScreenクラス)を生成します。
MainScreenクラスはJPanelクラスより派生を行っており、これがゲームのメインスクリーンとなります。
MainScreenクラスは生成後にActionGameクラスのウィンドウ内に登録されます。

パネル
Figure.ActionGame内に配置されるMainScreen

 この時点でウィンドウとパネルの関係が成立し、もしもフルスクリーンの場合は、 GraphicsEnvironmentクラス, GraphicsDeviceクラス, DisplayModeクラスを用いて フルスクリーン化を行います。
(これによりMainScreen(JPanel)クラスも自動的にフルスクリーンサイズに合わせられます)

 MainScreenクラスの内部処理は「3.6.6.ウィンドウ管理 (MainScreenクラス)」にて説明します。



・中核オブジェクトの初期化 (Godクラス)

 参考ソース(適当): ActionGame.java mainメソッド, God.java

 プログラムインスタンスとメインスクリーンが生成されたら、いよいよゲーム上の構成情報を 初期化します。
 Godクラスはフレームワーク上唯一に存在(ActionGameクラスにstaticクラスとして存在)し、 ゲーム上の中核となる情報を保持します。(保持する詳細情報は「3.4.中核 (Godクラス)」 の「初期化と必要オブジェクトの生成」を参照してください)

 現時点で行われる初期化は前項のメインスクリーン情報に始まり、 描画に関する情報、フレームレート情報、音声情報、デモ情報、デバッグ情報と、多岐に渡ります。
これら情報は起動パラメータによりチューニングできる制御情報のため、本格的な初期化の前処理として 初期化を行われます。

初期化情報 説明
ウィンドウサイズ Godクラスがメインスクリーンに描画を行うサイズ。
ウィンドウ再描画サイズ
メインスクリーンアタッチ 生成したメインスクリーンをGodクラスのメンバに設定します。
フレームレート ゲームのフレームレートとなります。
音のオン/オフ ゲーム中の音声(SE, BGM)のON/OFFとなります。
BGMの外部使用 ゲーム中のBGMの外部ファイル読み込みのON/OFFとなります。
描画モード Godクラスが再描画を行うための仕様となります。
描画詳細表示レベル Godクラスの背景描画の仕様となります。
クロマキー(開発用) 画像をロードする時に半透明にする色となります。
デモ記録モード(開発用) デモを作成するモードとなります。
デバッグ情報(開発用) その他デバッグ情報となります。
Table.Godクラスに設定する初期化情報

 これらの情報を一通り設定したら、God.initializeメソッドにて中核オブジェクトの 本格的な初期化を行います。
本節で説明している初期化はあくまでも、プログラムインスタンスとして初期化となり、
中核オブジェクトの初期化は「3.4.中核 (Godクラス)」の
「初期化と必要オブジェクトの生成」にて具体的に説明を行います。
とりあえずここでは中核オブジェクトの一部が初期化されるということを押さえていれば問題ありません。



・中核オブジェクトのメインループの呼び出し

 参考ソース(適当): ActionGame.java mainメソッド

 中核オブジェクトの初期化を行ったら、ゲームフレームワークのループ処理に制御を移します。
このループ処理というのは、「ユーザーの入力確認 → ゲームの演算 → ゲーム画面の描画」をゲームが 終了するまで繰り返す処理を示します。
このループ処理はGodクラスのstartメソッドが行っており、このループの開始をActionGameクラスが依頼します。
この関数が呼び出されると、ゲーム上のプログラム終了処理が終了するまで無限に処理を行います。
「Sample Action Game」ではタイトル画面にて"PROGRAM END"を実行する以外は、このループが繰り返されます。

ただし、Java上におけるプログラムの 終了イベントが発生し、プログラムの強制終了が発生した場合には、ループよりも上位のレベル (Javaの仕様として)でプログラムの終了が行われます。
(Windowsの場合はAlt+F4キーとなります。X Window Systemの場合はウィンドウマネージャにより 異なります)

 メインループ処理に関しては「3.4.中核 (Godクラス)」の「メインループ処理」にて具体的に説明を行います。



・キーボード入力のイベント処理と情報保持 (Controller, SpecialKeyクラス)

 参考ソース(適当): ActionGame.java processKeyEventメソッド, Controller.java, SpecialKey.java

 キーボード入力のイベント処理はプレイヤーが入力したキーボードの入力情報を Javaの仮想マシンがActionGameクラス(JFrameクラス)に対して通知を行い、 これをフレームワーク内のコントローラー情報に設定するイベントとなります。
 このイベントはActionGame.processKeyEventにて実現し、引数で渡ってくるKeyEventクラスの 情報を読み取り、このキー情報を解析し、コントロール情報及び特殊キー情報を それぞれ担当するコントロールクラス(Controller)と特殊キークラス(SpecialKey)に 設定します。

キーボードイベント
Figure.プレイヤーのキーボード入力から情報設定

 キーボード入力判定の際、キーボードのオートリピートにより連続したキー入力が発生すると、 ボタンを連射した状態になってしまうので、一度そのキーが離されるまで、または対となるキーの入力 (例えば右のキー入力の場合は左のキーのようなゲーム上、動作の対になっているキー) が行われるまでその状態を記録しておき、キーリピートが行われても連射が行われないように します。これは「本ゲームがジョイスティックのようなレバー入力のゲーム」を考えているので、 このような考慮を行います。

 キーボード入力により解析された情報はプレイヤーのコントロール情報と、 特殊キー情報に分けられ保持されます。このうち特殊キーはゲームフレームワークの設定情報となります。
これらの情報は以下のキーマップとなります。

情報 クラス キー 情報
プレイヤー
コントロール
Controller ↑(上) プレイヤー上
↓(下) プレイヤー下
→(右) プレイヤー右
←(左) プレイヤー左
Z ボタン1
X ボタン2
C ボタン3
W SELECT
Q START/PAUSE
Enter
特殊キー SpecialKey F2 詳細表示レベルダウン1
F3 詳細表示レベルダウン2
F4 BGM オン/オフ
F5 音声オン/オフ
F7 フレームレート上げ
F8 フレームレート下げ
F12 スクリーンショット
Table.キーボードマップと対応クラス

 コントロール情報となるControllerクラスとSkepcialKeyクラスはstaticクラスとなり、 ゲームフレームワーク上唯一のクラスとなります。 (Controllerクラスは現在一人用のみと設計しています)
 保持されたコントロール情報や特殊キー情報は、中核クラスやゲーム上の任意のクラスが参照を行い 各々がゲームに合った処理を行います。


 以上がActionGameクラスが行う処理のポリシーとなります。


次のページへ >>  << 前のページへ  目次へ


inserted by FC2 system