如何逐步提高某事的速度?

时间:2014-01-04 18:50:11

标签: java loops sprite increment

我正在创建一个2d僵尸射击游戏,我试图想出一个逐步提高僵尸创建率的好方法。

我使用以下代码创建了一个僵尸。

    public void createZombies(){

    int direction = new Random().nextInt(4);

    if (direction == 0) {
        // spawn from top
        zombies.add(new Zombie(new Random().nextInt(1120), new Random()
                .nextInt(1)));
    }
    if (direction == 1) {
        // spawn from left
        zombies.add(new Zombie(new Random().nextInt(1), new Random()
                .nextInt(640)));
    }
    if (direction == 2) {
        // spawn from bottom
        zombies.add(new Zombie(new Random().nextInt(1120), 640));
    }
    if (direction == 3) {
        // spawn from right
        zombies.add(new Zombie(1120, new Random().nextInt(640)));
    }


}

我基本上想从我的main方法(连续运行)调用该方法。我想过可能使用模块化并做类似的事情:

    int x = 1;
    if(x  % 1000 == 0){
        createZombies();
    }

    x++;

但这看起来很混乱 - 并且它不会改变它们的创建频率。

我只是有点难以找到一个好方法来做到这一点 - 令人惊讶的是我在这里找不到任何有用的东西。 因此,如果任何人都可以指出这样做的好主意,那将非常感谢!!

4 个答案:

答案 0 :(得分:1)

Guava有一个RateLimiter,可能对您的用例有用。特别是,您可以执行以下操作:

//initially, create one zombie every 10 seconds
final RateLimiter zombieRate = RateLimiter.create(0.1);
Runnable increaseRate = new Runnable() {
    @Override public void run() {
        //increase rate by 20%
        zombieRate.setRate(zombieRate.getRate() * 1.2);
    }
};

//then increase the rate every minute
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(increaseRate, 1, 1, TimeUnit.MINUTES);

你的僵尸创作然后变成:

while (true) {
    zombieRate.acquire();
    createZombie();
}

答案 1 :(得分:0)

你可以简单地减少每次僵尸创作之间的时间:

    int x = 1;
    int tau = 1000;

    if(x  % tau == 0){
        createZombies();
    }

    x++;
    tau = tau > 0 ? --tau : 1;

答案 2 :(得分:0)

你必须根据经过的时间来定义zomby创作的“速度”。

double velocity=0.5; //every 2ms 1 zomby
long latestCreation = System.currentTimeMillis();
double rest = 0;

public synchronized void createZombies() {
   double number=velocity * (System.currentTimeMillis() - latestCreation) + rest;
   latestCreation = System.currentTimeMillis()

   int n = Math.round(number);
   rest = number - n; //n° of partial zomby
   for (int i=0; i<n; i++) createZomby();
}

从您的主题或您喜欢调用createZombies()。

不幸的是,你不知道线程何时会真正执行,那么你必须定义一个函数时间依赖。当数字返回一些小数时,var“rest”是一个优化。

答案 3 :(得分:0)

也许你可以这样做:

       float maxZombieRate = 0.8; //for example
       float zombieRate = 0.05;
       while(zombieRate<=maxZombieRate){ //you could have a timer too
            if(Math.random <= zombieRate){ //Math.random returns values between 0 and 1
                createZombies(); //
                zombieRate+=0.05; //increase in 5% the probability of run createZombies()
            }
        }