我需要一些关于我正在进行的程序的帮助。这是一个植物大战僵尸游戏和我定时器继续添加僵尸。
Timer ZombieTimer = new Timer ();
TimerTask task = new TimerTask() { //for continuous arrival of zombies
public void run()
{
Random rand = new Random(); //puts a zombie in a random lane
int a = rand.nextInt(4);
int b=9;
Zombie z = new Zombie();
gardenField[a][b] = z;
System.out.println("New zombie in " + a + " tile " + b);
}
};
ZombieTimer.scheduleAtFixedRate(task, 1000, 8000); //new zombie every 8 seconds
现在,在创建了一个Zombie对象之后,我想让僵尸在它所属的水平阵列中移动(靠近植物移动)。我也在考虑使用Timer,但我不知道是否应该在Zombie类中传递整个数组。有帮助吗?感谢。
答案 0 :(得分:2)
我认为你是在正确的道路上,但你没有必要将列表传递给计时器。在任务的run()方法中,您应该简单地调用在外部类中定义的方法updatePositions()
(将僵尸向前移动1步)。
答案 1 :(得分:2)
您不需要将数组gardenField传递给Zombie类。
如果您可以访问gardenField,只需在每个x时间间隔更新它们,方法是循环遍历阵列中的所有僵尸并将其位置向右移动。为此制作一个单独的计时器,它应该可以工作。
答案 2 :(得分:1)
我会使用ScheduledExecutorService而不是Timer。另外,我会使用ExecutorService让一个线程负责移动僵尸。
例如:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ZombiesVsPlantsExample {
private static volatile Zombie[][] map = new Zombie[100][100]; // volatile not needed if you synchronize all access to the map. not only writes
public static void main(String[] args) {
ZombiesVsPlantsExample zombiesVsPlantsExample = new ZombiesVsPlantsExample();
zombiesVsPlantsExample.doTheWork();
}
private void doTheWork() {
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); // this thread pool will be used to create zombies
ExecutorService executorService = Executors.newFixedThreadPool(1); // this thread pool will be used to move zombies
ZombieCreator zombieCreator = new ZombieCreator(map);
scheduler.scheduleAtFixedRate(zombieCreator, 2, 8, TimeUnit.SECONDS); // one new zombie every 8 seconds
executorService.submit(new ZombiesPositionProcessor(map));
}
}
class Zombie {
}
class ZombieCreator implements Runnable {
Zombie[][] map;
public ZombieCreator(Zombie[][] map) {
this.map = map;
}
@Override
public void run() {
Zombie zombie = new Zombie();
synchronized(map){
map[1][2] = zombie; // put new zombie in some random location in map
}
System.out.println("new zombie was created");
}
}
class ZombiesPositionProcessor implements Runnable {
Zombie[][] map;
public ZombiesPositionProcessor(Zombie[][] map) {
this.map = map;
}
@Override
public void run() {
while (true) {
// iterate map and move zombies one by one
System.out.println("moving one zombie");
}
}
}
答案 3 :(得分:0)
这是一个设计问题。应该完全管理游戏吗?对象应该管理自己吗?
就个人而言,我认为您的想法是一种很好的方法,自我管理的对象可以帮助您在游戏发展过程中降低复杂性。