我正在创建一个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++;
但这看起来很混乱 - 并且它不会改变它们的创建频率。
我只是有点难以找到一个好方法来做到这一点 - 令人惊讶的是我在这里找不到任何有用的东西。 因此,如果任何人都可以指出这样做的好主意,那将非常感谢!!
答案 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()
}
}