Javaにおける2Dゲーム描画設計 (ビットマップファイルの読み込み)
用意したビットマップファイルをImageクラスへ設定する方法はJDKのバージョンにより方法が色々とあるのですが、基本的にアッパーコンパチ(上位互換)の方法を取ると、多くのプラットフォームで対応できるため、ここではToolkitクラスを用いた方法を説明します。
また、このビットマップ読み込みの際、「どのような形式のビットマップファイルにするか」から始まり、「アプリケーションやアプレットによる実現」、「ディスクのパスからの読み込みやJARファイルからの読み込み」等、設計により色々なアプローチがありますが、ゲームを一つのパッケージファイルとした考えとして以下の仕様と考えて説明したいと思います。
【プログラム実行方式】
アプリケーション
【ビットマップファイル読み込み方式】
JARファイルからの読み込み
※ここでJARファイルについての説明はJARに関して知識があることを前提に説明させていただきます。
【ビットマップファイル形式】
PNG
ビットマップファイル形式を「PNG」にしているのは、"JPEGのようにビットイメージが劣化しない"、"ビットマップを圧縮する"という理由で、劣化さえしないでToolkitクラスが読み込んでくれるのであれば、特にどの形式でも構わないと思います。
よくみかけるフリーのゲームには透過属性やアニメーション属性があるGIFなどが好まれていますが、色数の問題や2000年頭まで存在した著作権問題などがあったため、好みが分れていた感があります。(そのためPNGが開発されたという経緯が生れた訳ですが...)
これらの仕様を決定したところで、ビットマップファイルの読み込み処理を考えて行きます。
まずは適当なサンプルのソースコードを挙げてから順序だてて説明行きましょう。
【単純なコーディング例】
/** /** /** /** |
ここではGlobalクラスとImageManagerクラスという2つのクラスを挙げています。
概念的なポリシーは以下の通りとなります。
Globalクラス:
プログラム実行時に生成されるシステム唯一の情報を持つクラス。
このクラスはプログラムが実行された際に、最初に生成します。
そして、画面(パネル)を生成した際、このクラスのm_componentにこの画面を設定します。
ImageToolクラス:
Imageクラスを扱うツールとなるクラス。
Imageの生成等を引き受けます。
これらは共にstatic関数を持つ汎用的なクラスとなり、プログラム上、どのクラス(タスク等)からもアクセスができます。
さて、これらのサンプルを元にビットマップの読み込みについて説明します。
◇ ◇ ◇
【JAR内にあるビットマップファイルパスの取得】
Global.getURLにてJARファイル内のファイルパスを取得します。この関数はGlobalクラスのインスタンスが生成される際に設定される、Javaのクラスローダーを元にJAR内のファイルパス(URL)を取得します。
【ビットマップファイルを読み込んだImageクラスの取得】
ImageTool.loadImageを用いて指定のパスから読み込んだImageクラスを取得します。
呼び出し例)
Image playerImage = ImageTool.loadImage("/images/player.png");
次にImageクラスのビットマップファイル読み込み処理の手順を説明します。
【実現処理の説明】
Imageクラスがビットマップを読み込むには、Toolkit, Component, MediaTrackerの3つのクラスを用いて実現します。
これらは以下フローにより実現します。
1.ToolkitによるImageクラスの生成
Imageクラスの読み込み先を設定します。Toolkit.getDefaultToolkitにてインスタンスを取得し、このインスタンスよりgetImageを用いてImageクラスを生成します(この時点ではビットマップは読み込まれていません)。
2.MediaTrackerによるImageクラスのビットマップの読み込み
MediaTrackerにComponentクラスを設定し、MediaTracker.addImageにて指定のImageクラスにビットマップを読み込んで設定します。
MediaTrackerはComponentクラスのディスプレイ情報(色数等)を元に登録されたImageクラスの読み込み先からビットマップを読み込みます。
MediaTrackerは非同期にビットマップを読み込む為、MediaTracker.waitForIDを用いてビットマップが読み込まれるまで待ちます。
(今回の設計では待つように説明していますが、一括で読み込み処理を実現する場合等では、この待ちはここで行わないように設計が可能です)
このフローにて、Imageクラスにビットマップファイルが読み込まれた状態になります。
このImageクラスを描画処理にて描画を行うと、イメージでは以下のようになります。
このままだと、描画したくないもの(この例の場合は緑の部分)まで描画されてしまいます。
これではゲームとしては問題となるので、この後は「この部分の抜き処理(マスク処理)」とその応用による「パレット処理」について順に説明しようと思います。
« Sample Action Gameの紹介 [ステージ6] l Home l 昔のゲームの想い出 [0011] 「ピットフォールII」 [セガ] [1984] [アーケード] »