Sprite 衝突判定 (searchメソッド例) 

前ページで追加したSpriteBasicライブラリの探索searchメソッドを利用する例です。
SpriteBasicを継承したStripeShipをキーで操作します。
操作で使うキーコードと動作は、次の3つです。

KeyEvent.VK_LEFT 船を左に移動する。
KeyEvent.VK_RIGHT 船を右に移動する。
KeyEvent.VK_DOWN 船の移動を停止する。
KeyEvent.VK_SPACE 銛を発射する。

以下の アプレットをクリックして、フォーカスを移動してから上記キーで動作確信ください。
銛の発射の後は、銛のクラスであるSpriteHarpoonクラスのアクション内で、 searchメソッドが使われます。
サーチで見つかった配列内で、魚を削除して銛を、「魚が刺さった銛」に変更しています。
新たに利用した画像を示します。
ship.gif 
harpoon.png 
sanma02.gif 
これらを使った実行例を示します。

package fishgame;
import java.awt.*;
import java.awt.event.KeyEvent;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import javax.swing.*;

import sprite.Sprite;//ライブラリ利用
import sprite.SpriteBasic;
import sprite.SpriteFrame;
import sprite.SpriteThread;

class SpriteFishA extends SpriteBasic {//右から左に移動するクラス
	double speed_x; // 移動速度(1回のactionで変更する横移動量)

	SpriteFishA(Image img,int px, int py, int speed){//コンストラクタ
		super(img);
		this.x = px;//初期位置
		this.y = py;
		this.speed_x = speed; //速度
	}
	public void action(){//移動処理(SpriteThreadのanimationIntervalミリ秒ごとに実行される)
		super.action();//スーパクラス:SpriteBasicのactionを実行
		this.x += this.speed_x;//移動
		if(this.x < -100) {//左に隠れたか?
			this.x = 680;	//右の見えない所に出現させる。
			this.y = rand.nextInt(450)+30;;//出現させるY座標は乱数を使う
			this.speed_x = -( rand.nextInt(8)+4 );//速度も乱数
		}
	}
}

class Ship extends SpriteBasic{//船のクラス(銛を積んで、銛を発射できる。)
	int speed = 0;
	class Harpoon extends SpriteBasic{
		double speedY = 0;
		Harpoon(double px, double py){//コンストラクタ
			super(TestSplitePanel1.hp1);
			this.x = px;//初期位置
			this.y = py;
		}
		@Override
		public void action(){
			if(speedY == 0) return;
			this.y += speedY;
			if(this.y > 600) this.parent.delete(this);//削除
			int ix = (int) this.x;
			int iy = (int) this.y;
			Sprite[] sprites = ((SpriteThread)this.parent).search(ix, iy);//探す
			for(Sprite s : sprites){
				if(s instanceof SpriteFishA) {//魚のSprite
					SpriteFishA fish = (SpriteFishA)s;
					this.parent.delete(fish);
					this.speedY = 0;//止める
					this.image = TestSplitePanel1.hp2;//画像変更
				}
			}
		}
	}

	Harpoon harpoon = new Harpoon(0,0);

	Ship(){
		super( new BufferedImage(200, 50, BufferedImage.TYPE_4BYTE_ABGR) );
		this.add( new SpriteBasic(TestSplitePanel1.hp0) );
		this.add(harpoon);
		harpoon.x = 30;
		harpoon.y = -20;
	}
	@Override
	public void action(){//スレッドで繰り返される
		super.action();//スーパクラス:SpriteBasicのactionを実行
		this.x += this.speed;
	}

	public void shoot(){//銛を放つ
		Harpoon harpoon = new Harpoon(0,0);
		harpoon.x = this.harpoon.x + this.x;
		harpoon.y = this.harpoon.y + this.y;
		this.parent.add(harpoon);
		harpoon.speedY = 3;
	}
}

public class TestSplitePanel1 extends JPanel {
	static Image bg;//背景素材イメージ
	static Image ch,hp0,hp1,hp2;//素材イメージ
	static {
		try{
			bg = ImageIO.read(TestSplitePanel1.class.getResource("aqua00.jpg"));//背景素材イメージ
			ch = ImageIO.read(TestSplitePanel1.class.getResource("sanma00.gif"));//素材1イメージ
			hp0 = ImageIO.read(TestSplitePanel1.class.getResource("ship.gif"));//素材1イメージ
			hp1 = ImageIO.read(TestSplitePanel1.class.getResource("harpoon.png"));//素材1イメージ
			hp2 = ImageIO.read(TestSplitePanel1.class.getResource("sanma02.gif"));//素材1イメージ
		}
		catch(Exception e){
			e.printStackTrace();
		}
	}

	SpriteThread spriteThread;	// 描画、アニメーションスレッド
	SpriteBasic back = new SpriteBasic(bg);
	Ship ship = new Ship();
	SpriteFishA fish2 = new SpriteFishA(ch, 100, 200, -1);

	public TestSplitePanel1() throws Exception {
		int w = bg.getWidth(this);//背景画像サイズ取得
		int h = bg.getHeight(this);
		this.setPreferredSize(new Dimension(w,h));
		spriteThread = new SpriteThread(w, h, this);

		spriteThread.add( back );//背景を追加
		spriteThread.add( ship );//船追加
		spriteThread.add( fish2 );//魚追加
		for(int n = 0; n < 10; n++){
			spriteThread.add( new SpriteFishA(ch, -100, 0, -1) );//見えない箇所に出現
		}

		spriteThread.start(10);//0.01秒のアクションスレッド スタート

		this.enableEvents(AWTEvent.KEY_EVENT_MASK); //Keyイベントを可能にする
		this.setFocusable(true);//JPanelのデフォルトを変更して、キーボードイベントを可能しなければなりません。
		this.requestFocus(); //初期フォーカスを、このパネルにする。
	}
	public void paintComponent(Graphics g){//間隔(0.01秒)で呼び出される。
		super.paintComponent(g);
		if (spriteThread != null) spriteThread.paintTo(g);
	}

	public static void main(String[] arg) throws Exception{
		new SpriteFrame(new TestSplitePanel1());//フレーム作品実行
	}
	public void processKeyEvent(KeyEvent e) {
	    if (e.getID() == KeyEvent.KEY_PRESSED){
			int keyCode = e.getKeyCode();
			if(keyCode == KeyEvent.VK_LEFT){
				this.ship.speed = -2;
			} else if (keyCode == KeyEvent.VK_RIGHT){
				this.ship.speed = 2;
			} else if (keyCode == KeyEvent.VK_DOWN){
				this.ship.speed = 0;
			} else if (keyCode == KeyEvent.VK_SPACE){
				this.ship.shoot();//銛を放つ
			}
			//System.out.println("KEY_PRESSED:" + keyCode);
	    }
	}
}