(完结篇)
实现自动行走的功能(Move类)
类成员与构造函数
private long time;
private ImageView imageView;
private int direID;
double x;
double maxx;
double width;
Rectangle2D screenBounds = Screen.getPrimary().getVisualBounds();
Stage stage;
private EventListener listen;
private int petID;
boolean exit;
public Move(long time, ImageView imgView, int dire, Stage primaryStage, EventListener el) {
this.time = time;
imageView = imgView;
direID = dire;
stage = primaryStage;
listen = el;
petID = listen.petID;//此petID是调用Move时的petID
}
多线程实现移动
使用listen.petID而不是定义一个变量int petID = listen.petID;
是因为在运动过程中点击“切换宠物”时实际的petID会改变,所以使用listen.petID就可以做到同步改变。若下面使用listen.mainimg(petID,0)
显示的就是点击“切换宠物”前的宠物,这个petID就是旧的petID。
public void run() {
//点击就停下
imageView.addEventHandler(MouseEvent.MOUSE_PRESSED,
e ->{exit = true;listen.mainImg(listen.petID, 0);});
while(!exit) {
//如果petID!=listen.petID,则已“切换宠物”,此时要结束运动。
if(petID!=listen.petID) {
exit=true;
return;
}
width = imageView.getBoundsInLocal().getMaxX();//图片的宽度
x = stage.getX();//窗体位置
maxx = screenBounds.getMaxX();//屏幕宽度
double speed=15;//每次移动的位移量
if(x+speed+width >= maxx | x-speed<=0 | time<=0) {
this.interrupt();
listen.mainImg(listen.petID, 0);
return;
}
if(direID == 0) { //向左走
stage.setX(x-speed);
}
else if(direID == 1) { //向右走
stage.setX(x+speed);
}
time -= 300;//每0.3秒移动一次
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Move类完整代码
public class Move extends Thread{
private long time;
private ImageView imageView;
private int direID;
double x;
double maxx;
double width;
Rectangle2D screenBounds = Screen.getPrimary().getVisualBounds();
Stage stage;
private EventListener listen;
private int petID;
boolean exit;
public Move(long time, ImageView imgView, int dire, Stage primaryStage, EventListener el) {
this.time = time;
imageView = imgView;
direID = dire;
stage = primaryStage;
listen = el;
petID = listen.petID;//此petID是调用Move时的petID
}
public void run() {
//点击就停下
/*使用listen.petID而不是定义一个变量int petID = listen.petID;
*是因为在运动过程中点击“切换宠物”时实际的petID会改变,所以使用listen.petID就可以做到同步改变。
*若下面使用listen.mainimg(petID,0)显示的就是点击“切换宠物”前的宠物,这个petID就是旧的petID。
*/
imageView.addEventHandler(MouseEvent.MOUSE_PRESSED,
e ->{exit = true;listen.mainImg(listen.petID, 0);});
while(!exit) {
//如果petID!=listen.petID,则已“切换宠物”,此时要结束运动。
if(petID!=listen.petID) {
exit=true;
return;
}
width = imageView.getBoundsInLocal().getMaxX();//图片的宽度
x = stage.getX();//窗体位置
maxx = screenBounds.getMaxX();//屏幕宽度
double speed=15;//每次移动的位移量
if(x+speed+width >= maxx | x-speed<=0 | time<=0) {
this.interrupt();
listen.mainImg(listen.petID, 0);
return;
}
if(direID == 0) { //向左走
stage.setX(x-speed);
}
else if(direID == 1) { //向右走
stage.setX(x+speed);
}
time -= 300;//每0.3秒移动一次
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
完。