Search code examples
iosobjective-csprite-kit2d-games

How to add new object to spawning method after 50 points in sprite-kit


I have 6 different kinds of enemys in my game and I want to start spawning a random one till I have 50 points and then add a new random one. I want to do this till all enemys are in play. In this moment all enemys are in play from the beginning.

I have an arc4random switch statement that is called wenn my moving ground is in a certain position. I read that a NSMutableArray could be a solution but it only can have objects inside.

Here is the code I have:

// The method that is called to add an random enemy:
-(void)addRandomEnemy {

switch (arc4random() % 12) {
    case 0:
        [self addEnemy1];
        break;
    case 1:
        [self addEnemy2];
        break;
    case 2:
        [self addEnemy3];
        break;
    case 3:
        [self addEnemy4];
        break;
    case 4:
        [self addEnemy5];
        break;
    case 5:
        [self addEnemy6];
        break;
    }
}

// Inside the update method:
if (ground.position.x < 333 && ground.position.x > 328) {

        [self addRandomEnemy];
    }
if (ground.position.x < 666 && ground.position.x > 661) {

        [self addRandomEnemy];
    }

My question is how can I add a new kind of enemys to a spawning cycle after a specific amount of points for example ?

Thanks guys ! (code in objective-c please)

EDIT UPDATE code:

-(void)addRandomEnemy:(int)number {

// Array
NSArray *numberArray = @[@0, @1, @2, @3, @4 ,@5, @6]; 
NSMutableArray *numbers = [[NSMutableArray alloc] initWithArray:numberArray];

// shuffle
NSUInteger count = [numbers count];
for (NSUInteger i = 0; i < count; ++i) {

    int nElements = count - i;
    int n = (arc4random() % nElements) + i;
    [numbers exchangeObjectAtIndex:i withObjectAtIndex:n];
}

// Here I can't replace the case 0 with numbers[0]
switch (arc4random() % number) {
case 0:
    [self addEnemy1];
    break;
case 1:
    [self addEnemy2];
    break;
case 2:
    [self addEnemy3];
    break;
case 3:
    [self addEnemy4];
    break;
case 4:
    [self addEnemy5];
    break;
case 5:
    [self addEnemy6];
    break;
   }
}

It now says: "Expression is not an Integer constant expression"


Solution

  • //This 2 arrays you should initialize like properties, not in the update method, because otherwise result array will be always with 1 random element 
    NSMutableArray *numberArray = [NSMutableArray arrayWithArray:@[@0,@1,@2,@3,@4,@5]];
    NSMutableArray *resultArr = [[NSMutableArray alloc] initWithCapacity:6];
    
    NSNumber *randomType = [[NSNumber alloc] initWithDouble:(arc4random() % number)];
    
            if ([numberArray containsObject:randomType]) {
                [numberArray removeObject:randomType];
                if (![resultArr containsObject:randomType]) {
                    [resultArr addObject:randomType];
                }
            }
    
            NSNumber *enemyTypeIndex = [[NSNumber alloc] initWithDouble:arc4random() % [resultArr count]];
           [self addSomeEnemy:[resultArr objectAtIndex:[enemyTypeIndex integerValue]]];
    

    And thats your adSomeEnemy method(uncomment methods call):

    - (void)addSomeEnemy:(NSNumber *)enemy {
    
        switch ([enemy integerValue]) {
    
            case 0:
                //[self addEnemy1];
                break;
            case 1:
               // [self addEnemy2];
                break;
            case 2:
                //[self addEnemy3];
                break;
            case 3:
               // [self addEnemy4];
                break;
            case 4:
               // [self addEnemy5];
                break;
            case 5:
               // [self addEnemy6];
                break;
            }
        }
    

    Only what you should do now - make 2 first arrays as properties, initialize them where you want(but before the first update call), for example in initWithSize method, and replace "numberArray"/"resultArr" with "self.numberArray"/"self.resultArr"