衝突判定の導入 |
前期の最後の課題まで終わっていない人や,参考にしたい人のために正解例を示す。今回の衝突判は,この構成を基本に進めていくので,
前期の最後の課題まで終わっていない人はよく理解しておくこと。
■ 以下の手順で,DxJavaをバージョンアップして下さい。Eclipseのパッケージエクスプローラ上で,プロジェクト「DxLibGame」フォルダの
・直下へ,DxJava_64.zip をダウンロードして展開した DxJava_64.dll をコピーして上書き。
・「src」フォルダの「jp.ac.tuis.lib」パッケージへ
DxJava.java をコピーして上書き。
・「src」フォルダの「jp.ac.tuis.lib」パッケージへ DxJavaCleanup.java をコピーして追加。
■衝突判定
ゲームでは,画面上に表示されているキャラクターが衝突(コリジョン, collision)したかどうかを判定する必要が出てくる。
下図で,衝突判定の考え方を説明する。
下図(1)まず,キャラクターを囲む衝突判定用の図形を考える。この衝突判定用の図形をコライダー(collider)と呼ぶ。
コライダーには,よく矩形(くけい。長方形のこと)コライダーと円形コライダーが用いられる。
下図(2)このコライダー図形が画面上で交差したとき,「衝突した」と判定する。通常,衝突時に何かしらの処理(耐久値を下げる等)を行う。
下図(3)通常,ゲーム上のキャラクターは衝突判定システム上でグループにわけられ,同じグループのコライダーどうしは交差しても衝突
しているとはみなされない。今回利用する衝突判定システムでは,衝突判定グループをchar型の文字値で表している。
■重要な確認
具体的な衝突の判定方法(コライダー図形が交差しているか否かを計算する)は,この授業の範囲外なので,取り扱わない。
ここで重要なのは,この衝突判定システムの利用を通じて,実際のクラス,抽象クラス,interfaceを利用したライブラリの使いこなしと,
クラスの再設計(必要に応じて変更すること)を経験することである。
■衝突判定システムの導入準備
ここで利用する衝突判定システムは, jp.ac.tuis.lib パッケージの以下の1個のinterfaceと3個のクラスである。
名称 |
説明 | ファイル (まとめたzipファイル) |
Collidable | 衝突可能なゲームキャラクターであることを表す interface |
Collidable,java |
Collider | コライダー図形一般を表す抽象クラス。衝突判定のための様々な処理も担当する。 |
Collider.java |
RectangleCollider | 矩形のコライダー図形を表す Colliderのサブクラス。 ゲームウィンドウの辺に平行な四辺を持ち,左上の頂点が基準点(x, y)と横幅・高さで形状が決まる。 ![]() |
RectangleCollider.java |
CircleCollider | 円形のコライダー図形を表す Colliderのサブクラス。 |
CircleCollider.java |
この4ファイルをダウンロードフォルダにダウンロードし,ドラッグ&ドロップで「DxLibGame」プロジェクトの所定の場所へコピーする。
・ドラッグ&ドロップ元:Windows上のダウンロードフォルダにダウンロードした上表の4ファイル
・ドラッグ&ドロップ先:Eclipseのパッケージエクスプローラウィンドウにある『DxLibGame』プロジェクトの src フォルダ内にある jp.ac.tuis.lib パッケージの中
ドラッグ&ドロップでコピーした後のダイアログウィンドウでは,「ファイルをコピー」を選ぶ。
うまくファイルの準備ができたら,Eclipseのパッケージエクスプローラウィンドウにある『DxLibGame』プロジェクトの
src フォルダ内にある jp.ac.tuis.lib パッケージの中に,上表の4ファイルが確認できるはずである。
※動画では,jp.ac.tuis.lib パッケージに DxJavaCleanup.java というファイルがあるが無くても問題無い。
●衝突判定システムの考え方。
・まず,衝突判定の対象となるゲームキャラクターを表すクラス(例えば,Heroクラスや Enemyクラス)に, Collidableを実装させる。
Colladableの定義は次の様になっており,2個の抽象メソッドがあるので,これをオーバライドする必要がある。
1個目の抽象メソッド Collider getCollider( ); は,そのキャラクター用のコライダー図形オブジェクトを返すというものである。
2個目の抽象メソッド void onCollided( Collidable [ ] collidedWith ); は,このキャラクターのコライダー図形が他のコライダー図形
と衝突したときに自動的に呼び出されるメソッドで,衝突したときのアクションを定義すればよい。なお,実引数に衝突した相手側が配列に
収められて渡されてくる。
・一方,Colliderは,
・コライダー図形がもつべき性質
・衝突判定に必要な処理
が定義された抽象クラスである。そのサブクラスとして
・矩形のコライダー図形を表すRectangleCollider
・円形のコライダー図形を表すCircleCollider
が用意されている。
以下,実際の使用例でその主要な機能を紹介する。
では,Hero.java,Enemy.java,MyGame.java に変更を加えてみよう。
※Hero, Enemy, MyGame の各クラスに相当するクラスを自作している人は,適宜自分で作成したクラスに読み替えて下さい。
●衝突判定の対象にしたいクラス「Hero」(またはそれに相当する自作クラス)に施す変更。
まず,下図の手順①〜⑥で Heroクラス(Hero.java)に変更を加える。
※正解例として示した Heroクラスは,自身の姿として32ピクセル四方の正方形グラフィックを使っていたので,
ここでは,矩形コライダーを表す RectangleCollider をコライダーとして採用している。
円形コライダーを採用したい場合は 円形コライダーを表す CircleColliderを採用すると良いだろう。
CircleCollider のコンストラクタについては,CicleCollider.java の中身を見て仕様を確認せよ。
●衝突判定の対象にしたいクラス「Enemy」(またはそれに相当する自作クラス)に施す変更。
下図の手順①〜⑥で Enemyクラス(Enemy.java)に変更を加える。
●ゲーム処理本体である「MyGame.java」(またはそれに相当する自作クラス)のmainメソッドの変更
下図の手順①〜④で MyGameクラスのmainメソッドに変更を加える。
●実行してみる
実行構成で,対象プロジェクトを「DxLibGame」,メインクラスを MyGame に指定して実行してみよ。
下の動画のように,自機と敵機のまわりに Collider.drawAll( ) メソッドによって描写されたコライダー図形
が緑色の枠で,衝突時には赤枠で表示されていることがわかる。
本日は,この動作確認まで行うこと。