中央のキャラクタを動かし、4隅のものと接触するとキャラクタが消えていく。 |
衝突判定の手順
このサンプルでは、5つのスプライトが画面に表示されます。上下左右のキーを動かすと、中央のスプライトが移動します。スプライトを移動していき、他の4つのスプライトと接触すると、そのスプライトが消えます。
衝突判定の処理は、ここでは「checkCollision」というメソッドに切り分けています。どのような手順で作業をしているのか、見てみましょう。
set.setCollisionAll();
まず最初に、SpriteSetの「setCollisionAll」メソッドを呼び出します。これは、SpriteSetに設定されているすべてのSpriteの衝突判定をチェックし、判定に関する情報を更新します。
SpriteSetによる衝突判定は、ただ「これとこれは衝突しているか?」を調べるというようなものではありません。SpriteSetには、各Sprite間の衝突に関する情報が保管されています。この値を元に衝突判定は行われています。
ただし! Spriteは、SetLocationにより簡単に位置を移動できるということを忘れてはいけません。SpriteSetにある衝突判定情報は、リアルタイムに現在の状態をチェックしているわけではありません。手動で判定をチェックするための処理を呼び出してやると、その時点での衝突判定を行う、という形になっているのです。ということは、その後、Spriteを移動しても衝突判定の情報は(移動前の)古い情報を元に判定をしてしまうことになります。
そこで、衝突判定を行うときには、まず最初に、すべてのスプライトの衝突をチェックし、衝突判定の情報を更新してやる必要があります。これを行っているのが「setCollisionAll」なのです。
for(int i = 1;i < 5;i++){
if (set.isCollision(0,i)){
sprites[i] = null;
}
}
その後、中央のスプライト(これはすなわち、sprites[0]のSpriteとなります)と、その他のスプライトとの衝突を、forで1つ1つチェックしていきます。2つのSpriteの衝突に関する情報は、「isCollision」メソッドで得ることができます。ここで、引数に2つのSpriteインスタンスを指定すると、その2つが衝突しているか否かをboolean値で返します。
もし衝突していた場合には、sprites[0]でないほう(つまり動かしているスプライト以外のもの)を消しています。消すのは、実は簡単! SpriteSetに設定されているSprite配列の要素をnullにすればいいだけです。
あるいは、「消した後で、再び再表示する場合もある」というのであれば、Spriteにある「setVisible」で、スプライトを一時的に非表示にすることもできます。非表示にすると、他の(表示されている)スプライトとは衝突していると判断されなくなります。
このsetCollisionAllとisCollisionの2つを覚えるだけでも、衝突判定の基本は使えるようになります。実際にスプライトを使ってキャラクタを動かしてみましょう。実に簡単に、たくさんのキャラクタを操作できることがわかりますよ!