Javaプログラミング/サーバサイド&ケータイJava

スプライトでキャラクタを操作しよう(4ページ目)

iアプリでゲームのキャラクタなどを操作するのに必須な「スプライト」を使ってみましょう。

執筆者:掌田 津耶乃

中央のキャラクタを動かし、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つを覚えるだけでも、衝突判定の基本は使えるようになります。実際にスプライトを使ってキャラクタを動かしてみましょう。実に簡単に、たくさんのキャラクタを操作できることがわかりますよ!
【編集部おすすめの購入サイト】
楽天市場で Java 関連の書籍を見るAmazon で Java 関連の書籍を見る
  • 前のページへ
  • 1
  • 2
  • 3
  • 4
※記事内容は執筆時点のものです。最新の内容をご確認ください。
※OSやアプリ、ソフトのバージョンによっては画面表示、操作方法が異なる可能性があります。

あわせて読みたい

あなたにオススメ

    表示について

    カテゴリー一覧

    All Aboutサービス・メディア

    All About公式SNS
    日々の生活や仕事を楽しむための情報を毎日お届けします。
    公式SNS一覧
    © All About, Inc. All rights reserved. 掲載の記事・写真・イラストなど、すべてのコンテンツの無断複写・転載・公衆送信等を禁じます