【发布时间】:2013-04-24 12:55:18
【问题描述】:
我正在使用 java 创建一个小型坦克游戏。在该游戏中,生命包和硬币堆不时在游戏网格上的随机位置生成。它们都有有限的生命周期,并且生命周期结束后它们就会从场上消失。当它们在网格上可见时,任何坦克都可以在消失之前获得它们。我想将 lifepack 对象和 coinpile 对象的列表保存在 ArrayList 中,以便通过游戏 AI 算法访问它们。我希望使用简单的java知识将上述概念实现如下。
以下是我的 LifePack 类。CoinPile 类的行为方式类似:
public class LifePack extends Thread{
public int healthBonus;
public int lifetime;
public String type;
public Point location;
public boolean visible;
public LifePack(int x,int y,int lifetime){
location=new Point(x, y);
this.lifetime=lifetime;
this.type="health_pack";
this.visible=true;
this.start();
}
public void run(){
while(true){
if(this.lifetime>0){
try{
Thread.sleep(1);
if(lifetime%1000==0){
System.out.println("Life pack "+this.getId()+" will be disappeared in "+this.lifetime/1000+" s");
}
this.lifetime--;
}
catch(Exception ex){
ex.printStackTrace();
}
}
else{
this.visible=false;
this.interrupt();
break;
}
}
System.out.println("Life pack visibility = "+this.visible);
}
}
我想将新创建的 LifePack 对象添加到数组列表中,如下所示:
public ArrayList<LifePack> lifePacks;
lifePacks = new ArrayList<LifePack>();
lifePacks.add(new LifePack(x, y, lifeTime));
每次创建新的生命包时,我都会将该生命包对象添加到上面的数组列表中。一旦生命包的生命周期到期,我想将上述类中的“visible”布尔变量设置为“false”,以便我可以检查该变量以用于其他目的。
但我没有得到我想要的输出。我可以将正在运行的线程对象添加到上面的数组列表中并保持线程状态运行,还是我必须移动到不同的实现?如果有解决方案,请有人帮我解决这个问题。
谢谢。
【问题讨论】:
-
您的架构总体上不是很好。您正在为每个 Lifepack 创建一个新线程,因此如果您有 1000 个 Lifepack,那么您将运行 1000 个线程。线程是有代价的(上下文切换等,pp.),你应该在这里做这件事真的没有意义。相反,使用一个游戏逻辑线程(或者可能为所有生命包使用一个指定线程)并检查每 x 毫秒你的生命包是否仍然存在并执行一些游戏逻辑。这是通常的游戏架构方法。
-
谢谢@dirkk。其实我的java知识不是很好。我会试试你的想法。再次感谢。
标签: java multithreading arraylist