访问Timer中的对象:Java

时间:2017-06-20 12:50:56

标签: java

我需要一些关于我正在进行的程序的帮助。这是一个植物大战僵尸游戏和我定时器继续添加僵尸。

  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类中传递整个数组。有帮助吗?感谢。

4 个答案:

答案 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)

这是一个设计问题。应该完全管理游戏吗?对象应该管理自己吗?

就个人而言,我认为您的想法是一种很好的方法,自我管理的对象可以帮助您在游戏发展过程中降低复杂性。