衝突判定の導入


前期の最後の課題まで終わっていない人や,参考にしたい人のために正解例を示す。今回の衝突判は,この構成を基本に進めていくので,
前期の最後の課題まで終わっていない人はよく理解しておくこと。


■ 以下の手順で,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のサブクラス。
円の中心を基準点(x, y)とし,半径rを持つ。



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( ) メソッドによって描写されたコライダー図形
が緑色の枠で,衝突時には赤枠で表示されていることがわかる。

本日は,この動作確認まで行うこと。