子弹类实现Runabble接口后,按下j键产生子弹类的实例对象,但是子弹移动时坐标变化异常,控制台输出的坐标在几万(加上子弹碰撞边界死亡限制后,坐标值不会超过边界了,但是速度太快,线程无休眠)。
class Shot implements Runnable{
int x;
int y;
int direct;
int speed=1;
boolean isLive=true;
public Shot(int x,int y,int direct){
this.x=x;
this.y=y;
this.direct=direct;
}
@Override
public void run() {
// TODO Auto-generated method stub
try{
Thread.sleep(50);
}catch(Exception e){
e.printStackTrace();
}
while(true){
switch(direct){
case 0:
//向上
y-=speed;
break;
case 1:
x+=speed;
break;
case 2:
y+=speed;
break;
case 3:
x-=speed;
break;
}
System.out.println("子弹坐标x="+x+"y="+y);
//子弹何时死亡
//判断子弹是否碰撞墙壁
if(x<0||x>400||y<0||y>300){
this.isLive=false;
break;
}
}
}
}
后来发现线程是线程休眠位置没有放在while循环中导致的问题,正确代码应该如下:
class Shot implements Runnable{
int x;
int y;
int direct;
int speed=1;
boolean isLive=true;
public Shot(int x,int y,int direct){
this.x=x;
this.y=y;
this.direct=direct;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
try{
Thread.sleep(50);
}catch(Exception e){
e.printStackTrace();
}
switch(direct){
case 0:
//向上
y-=speed;
break;
case 1:
x+=speed;
break;
case 2:
y+=speed;
break;
case 3:
x-=speed;
break;
}
System.out.println("子弹坐标x="+x+"y="+y);
//子弹何时死亡
//判断子弹是否碰撞墙壁
if(x<0||x>400||y<0||y>300){
this.isLive=false;
break;
}
}
}
}
问题解决,while(true)是一个死循环,子弹类的线程不断执行这段死循环,随时休眠50ms。