鼠标点击做出动作(EventListener类)

使用接口EventHandler< MouseEvent>.

类成员及构造函数

private ImageView imageView;
	int gifID = 0;//图片编号,0为默认图(主图),99为告别图
	int petID = 0;//宠物ID
	double time = 3;//播放动画的时间
	public EventListener(ImageView imgView, int pet) {
		imageView=imgView;
		petID = pet;
	}

处理点击事件

public void handle(MouseEvent e) {
	if(gifID!=0) return;	//如果动作没做完,就不允许再做新的动作
	double x = e.getX();
	double y = e.getY();
//		System.out.println(x+" "+y);//测试眼睛等部位的位置
	//选择动作
	if(petID == 0) lxhBehavior(x,y);
	else biuBehavior(x,y);
	loadImg(petID,gifID,time);//显示图片
	}

根据点击的位置做出不同的动作

//罗小黑的动作
public void lxhBehavior(double x,double y) {
	//以下的“左”“右”都是相对于用户来说的
	//点击左眼
	if(x>20 & x<42 & y>125 & y<143) {
		gifID = 1;
		time = 2.8;
	}
	//点击右眼
	else if(x>63 & x<90 & y>125 & y<143) {
		gifID = 2;
		time = 3.85;
	}
	//点击右耳
	else if(x>93 & x<110 & y>80 & y<100) {
		gifID = 3;
		time = 6.3;
	}
	//点击身体
	else if(x>110 & x<130 & y>125 & y<155) {
		gifID = 4;
		time = 3;
	}
	//点击小小黑
	else if(x>152 & x<175 & y>157 & y<172) {
		gifID = 5;
		time = 3.5;
	}
	else {
		gifID = 0;
	}
}

//比丢的动作
private void biuBehavior(double x, double y) {
	//以下的“左”“右”都是相对于用户来说的
	//点击左眼
	if(x>40 & x<51 & y>60 & y<67) {
		gifID = 1;
		time = 3.7;
	}
	//点击右眼
	else if(x>87 & x<100 & y>58 & y<69) {
		gifID = 2;
		time = 4.45;
	}
	//点击嘴
	else if(x>62 & x<76 & y>61 & y<69) {
		gifID = 3;
		time = 5.3;
	}
	//点击左手
	else if(x>31 & x<49 & y>87 & y<117) {
		gifID = 4;
		time = 1.75;
	}
	//点击右手
	else if(x>86 & x<107 & y>85 & y<114) {
		gifID = 5;
		time = 4;
	}
	//点击额头
	else if(x>43 & x<94 & y>34 & y<52) {
		gifID = 6;
		time = 1.8;
	}
	//点击肚子
	else if(x>64 & x<79 & y>86 & y<130) {
		gifID = 7;
		time = 4.1;
	}
	else {
		gifID = 0;
	}
}

加载图片

不仅是点击时使用,其他地方也能用的通用函数。

public void loadImg(int petID,int gifID, double time) {
	this.gifID = gifID;
	if(gifID!=0) {
		Image newimage;
		if(petID==0)
			newimage = new Image(this.getClass().getResourceAsStream("/lxh/罗小黑"+gifID+".gif"));
		else 
			newimage = new Image(this.getClass().getResourceAsStream("/biu/biu"+gifID+".gif"));
		
		imageView.setImage(newimage);
		//中断动图的播放,切换至主图
		new Timeline(new KeyFrame(Duration.seconds(time), ae ->mainImg(this.petID,0))).play();
	}
}

加载主图,负责默认状态和退出时的动作

public void mainImg(int pet,int key) {
	Image newimage;
	if(pet==0)
		newimage = new Image(this.getClass().getResourceAsStream("/lxh/罗小黑"+key+".gif"));
	else
		newimage = new Image(this.getClass().getResourceAsStream("/biu/biu"+key+".gif"));
	imageView.setImage(newimage);
	//这里是为了保证能做出新的动作,对应于handle方法的if(gifID!=0) return;
	//同时也是为了做其他动作时不被“自行走动”和“自娱自乐”打断
	if(key == 0) gifID=0;
}

EventListener类完整代码

虽然没有必要,上面都有了,但是方便复制嘛。

public class EventListener implements EventHandler<MouseEvent> {
	private ImageView imageView;
	int gifID = 0;//图片编号
	int petID = 0;//宠物ID
	double time = 3;//播放动画的时间
	public EventListener(ImageView imgView, int pet) {
		imageView=imgView;
		petID = pet;
	}
	public void handle(MouseEvent e) {
		if(gifID!=0) return;	//如果动作没做完,就不允许再做新的动作
		double x = e.getX();
		double y = e.getY();
//		System.out.println(x+" "+y);//测试眼睛等部位的位置
		//选择动作
		if(petID == 0) lxhBehavior(x,y);
		else biuBehavior(x,y);
		loadImg(petID,gifID,time);//显示图片
	}
	//罗小黑的动作
	public void lxhBehavior(double x,double y) {
		//以下的“左”“右”都是相对于用户来说的
		//点击左眼
		if(x>20 & x<42 & y>125 & y<143) {
			gifID = 1;
			time = 2.8;
		}
		//点击右眼
		else if(x>63 & x<90 & y>125 & y<143) {
			gifID = 2;
			time = 3.85;
		}
		//点击右耳
		else if(x>93 & x<110 & y>80 & y<100) {
			gifID = 3;
			time = 6.3;
		}
		//点击身体
		else if(x>110 & x<130 & y>125 & y<155) {
			gifID = 4;
			time = 3;
		}
		//点击小小黑
		else if(x>152 & x<175 & y>157 & y<172) {
			gifID = 5;
			time = 3.5;
		}
		else {
			gifID = 0;
		}
	}
	//比丢的动作
	private void biuBehavior(double x, double y) {
		//以下的“左”“右”都是相对于用户来说的
		//点击左眼
		if(x>40 & x<51 & y>60 & y<67) {
			gifID = 1;
			time = 3.7;
		}
		//点击右眼
		else if(x>87 & x<100 & y>58 & y<69) {
			gifID = 2;
			time = 4.45;
		}
		//点击嘴
		else if(x>62 & x<76 & y>61 & y<69) {
			gifID = 3;
			time = 5.3;
		}
		//点击左手
		else if(x>31 & x<49 & y>87 & y<117) {
			gifID = 4;
			time = 1.75;
		}
		//点击右手
		else if(x>86 & x<107 & y>85 & y<114) {
			gifID = 5;
			time = 4;
		}
		//点击额头
		else if(x>43 & x<94 & y>34 & y<52) {
			gifID = 6;
			time = 1.8;
		}
		//点击肚子
		else if(x>64 & x<79 & y>86 & y<130) {
			gifID = 7;
			time = 4.1;
		}
		else {
			gifID = 0;
		}
	}
	//点击部位后加载图片
	public void loadImg(int petID,int gifID, double time) {
		this.gifID = gifID;
		if(gifID!=0) {
			Image newimage;
			if(petID==0)
				newimage = new Image(this.getClass().getResourceAsStream("/lxh/罗小黑"+gifID+".gif"));
			else 
				newimage = new Image(this.getClass().getResourceAsStream("/biu/biu"+gifID+".gif"));
			
			imageView.setImage(newimage);
			//中断动图的播放,切换至主图
			new Timeline(new KeyFrame(Duration.seconds(time), ae ->mainImg(this.petID,0))).play();
		}
    }
	//主图,负责默认状态和退出时的动作
	public void mainImg(int pet,int key) {
		Image newimage;
		if(pet==0)
			newimage = new Image(this.getClass().getResourceAsStream("/lxh/罗小黑"+key+".gif"));
		else
			newimage = new Image(this.getClass().getResourceAsStream("/biu/biu"+key+".gif"));
		imageView.setImage(newimage);
		//这里是为了保证能做出新的动作,对应于handle方法的if(gifID!=0) return;
		//同时也是为了做其他动作时不被“自行走动”和“自娱自乐”打断
		if(key == 0) gifID=0;
    }
}