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



3.4.ゲームメイン処理

 ゲームメイン処理はプログラムのインスタンス生成後にゲーム本体の処理としてプログラム終了まで実行される処理となります。
主にキーボード入力、ゲーム全体の計算処理、描画処理がゲームメイン処理となります。
これらのうち、キーボード入力の情報収集をプログラムインスタンスクラス(ActionGame)が行い、残りは全て中核クラス(God)が行います。
 ゲームメイン処理はプログラム終了まで行われ、これを「メインループ処理」と呼び、中核クラスが担当します。
メインループ処理は本節の「3.4.1.中核 (Godクラス)」の「メインループ処理」にて説明を行います。




3.4.1.中核 (Godクラス)

 参考ソース(適当): God.java

 中核はプログラム内のデータを全てを管理、且つフレームワークにおけるプログラム全体の流れを 実行するものとなります。
管理している情報は多彩で、主なものは以下のとおりとなります。

カテゴリ 情報(主となるもの) 説明
システム情報 バージョン プログラムのバージョン。
コンポーネント 描画コンポーネント
(メインスクリーン)
ActionGameクラスにて生成されたメインスクリーン。ActionGameクラスよりアタッチされます。
描画情報 スクリーン解像度幅/高さ ゲーム画面の大きさ。これはウィンドウのサイズではなく、内部で描画する画面の大きさとなります。
テキストスクリーンフォント幅/高さ 画面に表示する文字列の1文字の大きさ。現在は幅8ピクセル、高さ8ピクセルとなります。
BGスクリーンセルサイズ 画面に表示する背景要素(セル)の1要素の大きさ。現在は幅8ピクセル、高さ8ピクセルとなります。
バックバッファ画像 描画が行われるゲーム画面イメージとそれを操作するグラフィックオブジェクトとなります。
バックバッファグラフィック
バックバッファ画像(PAUSE用) PAUSE時に描画が行われるゲーム画面イメージとなります。
透過用のイメージフィルタ 画像読み込み時に使用されるクロマキー(抜き色)用イメージフィルタとなります。
画面エフェクト 画面合成の際に画面効果として処理するタスクとなります。
描画オブジェクト スプライトスクリーン 擬似スプライトプレーンを実現するオブジェクトとなります。
テキストスクリーン 擬似テキストプレーンを実現するオブジェクトとなります。
BGスクリーン 擬似BGプレーンを実現するオブジェクトとなります。
スクリーン管理 スプライト、テキスト、BGのスクリーン状態の管理を行うオブジェクトとなります。
プログラム管理 ステージ管理 ステージ管理オブジェクトとなります。このステージ管理オブジェクト内に各キャラクター管理が入ります。
フレームレート ゲーム全体のフレームレート処理に使用するフレームレートとなります。
音声管理 サウンド管理 SE, BGM管理を行うオブジェクトとなります。
ユーティリティ ランダム ゲーム中に使用するランダムオブジェクトとなります。
Table.中核クラスが管理する情報

 かなりの情報が中核クラスに集約されていますが、実際にこれらを用いるのは、本クラスの管理下にある、各タスククラス(Task)が 使用することになります。
(あくまで中核クラスはマネージメントに徹することが主となり、その管理下にある部下達に様々情報を提供することになります)



・初期化と必要オブジェクトの生成

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

 中核クラスの初期化はプログラムインスタンス生成時に行われ、上述にて一覧したデータの生成/初期化を行います。



・メインループ処理

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

 メインループ処理はプログラムのインスタンス生成後にゲーム本体の処理としてプログラム終了まで無限に実行される処理となります。
メインループ処理は中核クラスにて実現しており、ActionGame.main関数よりGod.start関数が呼び出されます。
処理をイメージにするとおおまか以下ようになります。

メインループ
Figure.メインループ

 God.start関数処理の流れは、

 1.メイン処理か停止(PAUSE)処理の判断
  [プレー中]
  ・メイン処理 [God.mainProcess関数]
  [停止中]
  ・停止(PAUSE)処理 [God.startPauseProcess, God.pauseProcess関数]
 2.ウェイト(処理の休憩時間)
 3.スクリーンショット依頼の確認 [God.screenShotProcess関数]
 4.「1.」に戻る

という順番になり、これがプログラム終了まで無限に繰り返されます。
このループが終了する条件は、メイン処理(mainProcess関数)内で「終了状態(戻り値0)」を検出した場合にのみ となります。これはタイトル画面にて"PROGRAM END"を選択するとこの状態になります。

 キーの入力の確認処理は、プログラムインスタンスクラス(ActionGame)が本処理とは別に非同期で行い (このキー入力イベントの呼び出しはJavaが行い、ActionGame.processKeyEvent関数にて処理を行います)、 そのキーの情報を元に処理を行うのは、メイン処理内に存在する任意のタスク (例えばプレイヤー処理のタスク等)が行います。

 以降に各処理をある程度ブレークダウンして説明します。



・メイン処理

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

 メイン処理はゲームの本質となる部分の処理となり、プログラムが停止(PAUSE)していない場合は常に本処理が実行されます。
メイン処理はステージ管理クラス(StageScheduler)に現在のステージの実行を依頼し、その処理後に合成スクリーンに描画、 特殊処理を実行、画面効果処理を実行、メインスクリーンクラス(MainScreen)に合成スクリーン情報の転写依頼といった処理を 順番に行います。
これらのうち、特殊処理はファンクションキーに割り当てられた「システムの情報を変更する処理」、画面効果処理は フェードイン/アウトクラス(EffectFadeInOutTask)、地震クラス(EffectQuakeTask)、伸縮クラス(EffectStretchScreenTask)といった、 「システムで共通に使用する合成スクリーンを直接操作する処理」といったことを行います。

メイン処理
Figure.メイン処理

1.ステージ演算処理はステージ管理クラスに現在のステージに関する処理を実行させます。
  詳しくは「3.5.4.ステージ管理 (StageManagerクラス)」にてブレークダウンして説明を行います。

2.合成スクリーンに描画はステージ演算処理結果におけるキャラクターの情報を元に背景、
  キャラクターの描画を行います。
  本節の「スクリーン合成(ダブルバッファ)」にて説明を行います。

3.特殊処理(God.specialProcessメソッド)は、ファンクションキーに当てられた、
   ・フレームレートの変更 [God.m_framerate]
   ・詳細表示レベル設定 [God.m_drawDetailLevel]
   ・BGMオン/オフ [サウンド管理(SoundManager)]
   ・音声オン/オフ [サウンド管理(SoundManager)]
  といった、中核クラス内で管理しているシステム情報の変更を行う処理となります。

4.画面効果処理は合成スクリーン作成後、画面に効果をつけるための処理として、
   ・フェード/インアウト [フェードイン/アウトクラス(EffectFadeInOutTask)]
   ・地震 [地震クラス(EffectQuakeTask)]
   ・伸縮 [伸縮クラス(EffectStretchScreenTask)]
  といった、メインスクリーンに投影される前の画面効果をつける処理となります。

5.合成スクリーンに全ての情報が描画されたら、この情報をメインスクリーンに
  転写するための処理をメインスクリーンクラス(MainScreen)に依頼します。
  この依頼によって、メインスクリーンクラスはJava(正確にはOSにおけるウィンドウ)の
  ウィンドウ描画イベントが発生した際に、この合成スクリーン画像を再描画して、
  ユーザーが可視的に画面を見ることができるようになります。
  この依頼方法は、Javaコンポーネント(SwingなのでJComponentクラス)における
  repaint, paintImmediatelyメソッドを用いて、再描画イベントを発行して実現を
  行います。どちらのAPIを用いるかは起動パラメーターにて指定します。
  この処理はOSのグラフィック状況に大きく依存するので、任意に指定できるように
  なっています。



・停止(PAUSE)処理

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

 停止処理はゲームの中断及び中断中の処理を行うものとなり、二段階の処理にて実現しています。

 1段階目(startPauseProcessメソッド)
  [停止開始時]
   デモプレー実行時の中止、音声の中断、停止画面の生成を行い、停止モードになります。
   停止画面については本節の「スクリーン合成(ダブルバッファ)」にて説明を行います。
  [停止解除時]
   音声の再開を行い、停止モードを解除します。

 2段階目(pasuseProcessメソッド)
  停止中に呼び出される処理となり、1段階目で作成された停止画面を常に描画します。

 1段階目で作成する停止画面は、メイン処理にて作成されるスクリーン画像を停止用スクリーン画像に 転写して、その画像を暗くします。暗くした画像を作成したら、その画像の上に停止中のテキストや ステージ5にて入手したアイテムの描画を行います。ステージ5にて入手したアイテムの描画は TreasureLookingGlassTaskクラスにて実現します。



・ウェイト処理

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

 ウェイト処理はゲームタイミングを調整する処理となり、メトロノームのような働きを行います。
これは処理が短時間に完了してしまっても、即座に次の処理に行かないようにタイミングを取るために行います。
(※本ゲームは基本的に1秒間中に約60コマ数(約17ミリ秒程度)の処理が間に合うことを前提としています。 そのため処理が間に合わない場合は待ち時間無しの全力で処理を行い続けることが発生し、CPU使用状況が100%状態となります。 この状態は一般に「処理落ち」と呼ばれる状態となり、スローモーションのような状態になります)
このウェイトの時間処理は、

 1.現在時間を取得。
 2.メイン/停止処理を実行。
 3.現在時間を取得して、「1.」の時間との差分を求めてどの程度経過したかを判断。
   もしもこの時間が指定の時間(フレーム)レート未満の場合は、処理が間に合っているので、
   その時間が経過するまでプログラムを眠らせる。(Thread.sleepメソッド)

としています。



・スクリーンショット (ScreenshotManagerクラス)

 参考ソース(適当): God.java screenShotProcessメソッド, ScreenshotManager.java createScreenShotメソッド

 スクリーンショットはプレー中、F12キーを押下した際に実行されます。
スクリーンショットの画面はスクリーン合成画面をjavax.imageio.ImageIOに 渡してPNGファイル形式にて出力します。
(この処理の担当はScreenshotManagerクラスが実現します)



・スクリーン合成(ダブルバッファリング)

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

 スクリーン合成はゲーム中の背景やキャラクターの画像を合成して一枚の画像に仕上げるための 処理となります。
合成された画像はウィンドウに一括転送され、プレイヤーが初めて視覚として見ることができます。
このような処理を行っている理由は、プレイヤーが見るウィンドウ上でこのような描画処理を行うと、 画面がチラついたり、描画を行っている最中の状態が画面に表示されてしまい、プレイ画面と実際の処理の 同期が取れなくなる場合があるためです。(このような処理を一般的にダブルバッファリング処理といいます)

 スクリーン合成用の画像は2種類あり、メイン画像(バッファ)とPAUSE画面(バッファ)があります。
これらそれぞれは、ゲームの実行/停止により使い分けが行われ、ゲーム実行中 (これはタイトル画面等のプレーに直接関わらないような画面も含まれます)はメイン画面、 停止中(これはPAUSE中)は、PAUSE画面が表示されます。
PAUSE画面はゲーム停止直後に、メイン画面をコピーし、その上に停止情報(ステージ名や宝物出現のヒント等) を描画します。

合成処理概要
Figure.合成処理概要

 スクリーン合成が行われる画面を構成するものは以下のとおりとなります。

画面構成物 説明
テキスト 文字を表示する画面。(TextScreenクラス)
スプライト キャラクターを表示する画面。キャラクター描画には背景への描画優先順位と、キャラクターの描画優先順位があります。(SpriteScreenクラス)
背景 一番手前の背景 背景画面1。主なキャラクターを覆う位置づけ。(BGScreenクラス)
二番目に手前の背景 背景画面2。主なキャラクターのすぐ後ろの位置づけ。(BGScreenクラス)
一番奥の背景 背景画面3。遠くの背景の位置づけ。(BGScreenクラス)
Table.スクリーン合成される画面構成物

 これらの画面構成物は、God.drawメソッド内で、以下の順序で重ね合わせられていきます。

   1.スプライト描画(キャラクター一番奥)
   2.背景画面3描画(背景の一番奥)
   3.スプライト描画(キャラクター少し奥)
   4.背景画面2描画(キャラクターメイン位置手前の背景)
   5.スプライト描画(キャラクターメイン位置)
   6.背景画面1描画(一番手前の背景)
   7.スプライト描画(キャラクター一番手前)
   8.テキスト描画(画面の一番手前)

 一番奥のものが最初に描画され、その上に上書きする形で次々と手前のものを描画していきます。
合成処理イメージ
Figure.合成処理イメージ

 また、God.drawメソッドは合成が完了するとEffectFadeInOutTaskを実行し、フェードイン/アウト処理 実行中の場合、この合成画像に対してフェードイン/アウト状態を作り出します。





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


inserted by FC2 system