Let's walk through this code, pretending that nanoTime = 0
at the start for simplicity.
We initialize beginTime = 0
and i = 0
We check the while
loop's condition, and i
is indeed less than 3, so we enter the loop.
We check if the current time is 1 second later than begin time yet, but of course it isn't! We've barely executed two instructions since begin time. So we skip over the loop body.
We hit the end of the while
loop, and check the condition again. i
is still less than 3, so we re-enter the loop and go back to step 3.
We keep doing this BILLIONS of times, because we do so little work inside the loop each time, nanoTime
isn't much bigger each time we loop around.
This is called a "busy-wait" or "spinning" - the processor is kept busy checking the clock then looping then re-checking the clock, so it's never allowed to exit this loop, return from this function, update the rest of your game state, process player input, or draw a frame. You've effectively stalled your game here.
Finally, an eternity of wasted CPU time later, we've managed to burn a second of time and our inner if
condition finally passes. Huzzah! We enter its body.
We spawn 3 enemies.
We increment i
to 1.
We set beginTime
to 1000000100 or so.
We hit the end of the while
loop and check the condition again. Oh no. i
is still less than 3, so we're stil not allowing the CPU to move on yet! Back to step 3 we go, and burn another second doing nothing...
etc.
So, don't put a wait loop inside your game loop. Instead, what you really want to do is call this function periodically, and each time check if it's time to spawn a new wave, rather than hold the CPU hostage until it's time.
That might look something like this:
// Call this at the start of your level.
void SetUpWaves() {
nextWaveSpawnTime = System.nanoTime() + 1000000000;
wavesRemaining = 3;
}
// Call this periodically, say once per frame update,
// or at a coarser frequency if you prefer, since it changes state infrequently.
void SpawnWaveIfReady() {
// Cheap early-out if it's not time to spawn a wave yet.
if(System.nanoTime < nextWaveSpawnTime)
return;
// It is time! Spawn a wave!
for (int j = 0; j < 3; j++)
{
world.spawnEnemy();
}
wavesRemaining--;
// Work out when to spawn the next wave, which might be "never again."
if(wavesRemaining > 0)
nextWaveSpawnTime += 1000000000;
else
nextWaveSpawnTime = long.MAX_VALUE;
}