例3-2 ドラック (searchメソッド確認例) 

前ページで追加したSpriteBasicライブラリの探索searchメソッドを利用する確認例です。
以前に作成した例のマウスボタンプレス処理(ラベルも表示)を変更し、 移動するSpriteDragの画像をマウスで ドラックできるように プログラムにしました。
以下でマウスドラックの方法を示す。
この色が追加箇所です。比較ください)
package fishgame;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.imageio.*;
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 SpriteDrag extends SpriteFishA{ //ドラック可能なクラス
	boolean flagDrag = false;//これがTrueならドラック状態
	Point prevPt = null;//ドラック時のSprite内マウス位置
	double cx = 0;
	double cy = 0;

	SpriteDrag(Image img,int px, int py, int speed){//コンストラクタ
		super(img, px,  py,  speed);
	}
	void setDrag(Point pt){
		if(this.prevPt == null && pt != null){//ドラック開始
			this.cx = pt.x-this.x;
			this.cy = pt.y-this.y;
		} else 	if(pt != null && this.prevPt != null){//ドラックによる移動
			this.x += pt.x - this.prevPt.x;
			this.y += pt.y - this.prevPt.y;
		}else 	if(pt == null && this.prevPt != null){//ドラック終了
			this.speed_x = 0;//止める
		}
		this.prevPt = pt;
	}
}
public class TestSplitePanel1 extends JPanel implements MouseListener, MouseMotionListener{

	static Image bg;//背景素材イメージ
	static Image ch;//素材1イメージ
	static Image ch2;//素材2イメージ
	static {
		try{
			bg = ImageIO.read(TestSplitePanel1.class.getResource("aqua00.jpg"));//背景素材イメージ
			ch = ImageIO.read(TestSplitePanel1.class.getResource("sanma00.gif"));//素材1イメージ
			ch2 = ImageIO.read(TestSplitePanel1.class.getResource("jellyfish.gif"));//素材1イメージ
		}
		catch(Exception e){
			e.printStackTrace();
		}
	}
	SpriteThread spriteThread;	// 描画、アニメーションスレッド
	SpriteBasic back = new SpriteBasic(bg);
	SpriteFishA jellyfish = new SpriteFishA(ch2,  10, 100, -1);

	SpriteDrag dragFish = null;//ドラック中にドラック対象を記憶

	JLabel label = new JLabel("匹います。");

	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);

		this.add(label);//ラベル追加
		label.setFont(new Font("Serif", Font.BOLD, 20));
		label.setForeground(Color.white);

		spriteThread.add( back );//背景を追加
		spriteThread.add( jellyfish );//クラゲ追加
		for(int n=0; n < 10; n++){
			spriteThread.add( new SpriteDrag(ch,  -100, 0, -1));//ドラック可能魚追加
		}
		spriteThread.start(20);//0.02秒のアクションスレッド スタート

		this.addMouseListener(this);
		this.addMouseMotionListener(this);
	}
	public void paintComponent(Graphics g){//間隔(0.01秒)で呼び出される。
		super.paintComponent(g);
		if (spriteThread != null) spriteThread.paintTo(g);
		label.setText(spriteThread.subSprite.size()-2 + " 匹います。");
	}

	public static void main(String[] arg) throws Exception{
		new SpriteFrame(new TestSplitePanel1()) ; //フレーム作品実行
	}
	@Override
	public void mouseClicked(MouseEvent e) {
	}
	@Override
	public void mousePressed(MouseEvent e) {
		Point pt = e.getPoint();
		Sprite[] sprites = spriteThread.search(pt.x, pt.y);//探す
		for(Sprite s : sprites){
			if(s instanceof SpriteDrag) {//魚のSprite
				this.dragFish = (SpriteDrag)s;
				this.dragFish.speed_x = 0;//止める
				this.dragFish.setDrag(pt);
				System.out.println(s);//デバック用表示
			}
		}
	}
	@Override
	public void mouseReleased(MouseEvent e) {
		if(this.dragFish != null){
			this.dragFish.setDrag(null);
			this.dragFish.speed_x = -2;
			this.dragFish = null;
		}
	}
	@Override
	public void mouseEntered(MouseEvent e) {
	}
	@Override
	public void mouseExited(MouseEvent e) {
	}
	@Override
	public void mouseDragged(MouseEvent e) {
		if(this.dragFish != null){
			this.dragFish.setDrag( e.getPoint() );
		}
	}
	@Override
	public void mouseMoved(MouseEvent e) {
	}
}