I would add something like this to your controller:
// in your .h add a few iVars
float minDelay,maxDelay;
BOOL spawnEnabled;
// in your init setup a couple of iVars
minDelay = 0.5; // seconds
maxDelay = 2.0; // seconds
spawnEnabled = NO;
// where you are ready to spawn
spawnEnabled = YES;
[self scheduleOnce:@selector(spawnOneEnemy) delay:0.];
// add the spawning method
-(void) spawnOneEnemy {
if(!spawnEnabled) return; // prevent spawning if this was called
// after a gameOver or Win was declared
// here, compute the random x,y coords where you want to spawn
CGPoint spawnCoords = [self randomSpawnCoordinates];
// create and add an enemy at the random coordinate
Enemy * enemy = [self createEnemy];
enemy.position = spawnCoords;
[self addChild enemy]; // assumes 'self' is a CCNode subclass
// compute the next spawn time
u_int32_t delta = (u_int32_t) (ABS(maxDelay-minDelay)*1000); // ms resolution
float randomDelta = arc4random_uniform(delta)/1000.; // now in seconds
[self scheduleOnce:@selector(spawnOneEnemy) delay:randomDelta];
}
// where you win
spawnEnabled = NO;
// where you lose
spawnEnabled = NO;
// left as an exercise to the reader :
-(CGPoint) randomSpawnCoordinates {
}
-(Enemy *) createEnemy {
// I am assuming you have an Enemy class or equivalent,
// and that it subclasses from CCNode somehow
NSUInteger randomEnemy = arc4random_uniform(4); // will return 0-3
return [self createEnemyOfType:randomEnemy];
}
-(Enemy *) createEnemyOfType:(NSUInteger) enemyType {
// assumes all your enemy types subclass Enemy
switch(enemyType) {
case 0: return [self createEnemyOfType0];
case 1: return [self createEnemyOfType1];
case 2: return [self createEnemyOfType2];
case 3: return [self createEnemyOfType3];
default : return [self createEnemyOfType1];
}
}
EDIT : clarified the iVars declarations. EDIT : put in some thoughts for random enemies