2014-01-04 5 views
2

Я создаю 2-й зомби-шутер, и я пытаюсь думать о хорошем способе постепенного увеличения скорости создания зомби.Как постепенно увеличить скорость?

Я создаю зомби со следующим кодом.

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))); 
    } 


} 

В основном я хочу назвать этот метод своим основным методом (который работает непрерывно). Я думал, может быть, с помощью модульных и сделать что-то вроде:

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

    x++; 

но, кажется, грязный - и это не изменяет того, как часто они создаются.

Я просто немного озадачен тем, что нашел хороший способ сделать это - и, на удивление, я тоже не нашел ничего полезного. Так что, если кто-нибудь может указать на хорошую идею сделать это, мы будем очень признательны!

+0

Какова текущая скорость для зомби, я не понимаю? –

+0

Ваша игра держит счет или отслеживает, как долго он играет? –

ответ

0

Вы можете просто уменьшить каждый раз, когда период между зомби творения:

int x = 1; 
    int tau = 1000; 

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

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

Гуава имеет 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); 

Ваше творение Zombie становится:

while (true) { 
    zombieRate.acquire(); 
    createZombie(); 
} 
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» - это оптимизация, когда число вернет некоторую десятичную.

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() 
      } 
     } 
Смежные вопросы