2013-08-14 4 views
0

Привет, я делаю прокручивающееся приложение cocos2d, где враги атакуют персонажа. Я использую arc4random и оператор switch, чтобы порождать врагов по одному. Это должно произойти, но вместо этого оно порождает два за раз. Я новичок в cocos2d и объектив c, поэтому я могу пропустить что-то простое. Однако любая помощь является ценной., вызывающий метод arc4random, чтобы породить одного врага, но вместо него вместо 2-мя новинками

Вот код:

#import "FlyingEnemy.h" 

@implementation FlyingEnemy 
+(id)createEnemies{ 
return [[[self alloc]init]autorelease]; 
} 

-(id)init{ 
if((self = [super init])){ 
    CGSize size = [[CCDirector sharedDirector]winSize]; 
    screenWidth = size.width; 
    screenHeight = size.height; 

    screenBounds = [[UIScreen mainScreen] bounds]; 

    redEnemyFlameCounter = 1; 

    xPoint = screenWidth - 50; 
    yPoint = screenHeight/2; 

    yellowEnemyFlameCounter = 1; 

    blueEnemyFlameCounter = 1; 

    xPointBlueEnemy = screenWidth - 50; 
    yPointBlueEnemy = screenHeight - 50; 

    [self createEnemyOfType]; 
} 
return self; 
} 

-(void) createEnemyOfType{ 
randomEnemy = arc4random_uniform(4); 
CCLOG(@"the number is %i",randomEnemy); 
switch(randomEnemy) { 
    case 0: isRedEnemyOnTheScreen = YES; 

      redEnemy = [CCSprite spriteWithFile:@"redenemy.png"]; 
      redEnemy.position = ccp(xPoint, yPoint); 
      [self addChild:redEnemy z:-1]; 

      [self schedule:@selector(shootTheBullets:)interval:1.0f/2.0f]; 

      [self schedule: @selector(removeTheEnemy:)interval:18.0f/1.0f]; 

      [self schedule: @selector(redEnemyFlame:)interval:1.0f/5.0f]; 

     CCLOG(@"number = %i",randomEnemy); 
     break; 
    case 1: isYellowEnemyOnTheScreen = YES; 

      yellowEnemy = [CCSprite spriteWithFile:@"yellowenemy.png"]; 
      yellowEnemy.position = ccp(screenWidth - 50, 50); 
      [self addChild:yellowEnemy z:-1]; 

      yellowEnemyMoveDown = [CCMoveTo actionWithDuration:2.0 position:ccp(yellowEnemy.position.x, 50)]; 
      yellowEnemyMoveUp = [CCMoveTo actionWithDuration:2.0 position:ccp(yellowEnemy.position.x, screenHeight/2)]; 
      yellowEnemyFloatingSequnece = [CCSequence actions:yellowEnemyMoveUp, yellowEnemyMoveDown, nil]; 
      yellowEnemyFloatingRepeat = [CCRepeat actionWithAction:yellowEnemyFloatingSequnece times:2]; 
      [yellowEnemy runAction:yellowEnemyFloatingRepeat]; 

      [self schedule: @selector(yellowEnemyFlame:)interval:1.0f/5.0f]; 

     CCLOG(@"number = %i",randomEnemy); 
     break; 
    case 2: isBlueEnemyOnTheScreen = YES; 

      blueEnemy = [CCSprite spriteWithFile:@"blueenemy.png"]; 
      blueEnemy.position = ccp(xPointBlueEnemy, yPointBlueEnemy); 
      [self addChild:blueEnemy z:-1]; 

      [self schedule:@selector(shootTheWaterBullets:)interval:1.0f/2.0f]; 

      CCMoveTo* blueEnemyMoveDown = [CCMoveTo actionWithDuration:3.0 position:ccp(xPointBlueEnemy, 70)]; 
      CCMoveTo* blueEnemyMoveUp = [CCMoveTo actionWithDuration:3.0 position:ccp(xPointBlueEnemy, screenHeight - 100)]; 
      CCSequence* blueEnemyFloatingSequence = [CCSequence actions:blueEnemyMoveDown, blueEnemyMoveUp, nil]; 
      CCRepeat* blueEnemyFloatingRepeat = [CCRepeat actionWithAction:blueEnemyFloatingSequence times:3]; 
      [blueEnemy runAction:blueEnemyFloatingRepeat]; 

      [self schedule: @selector(removeTheBlueEnemy:)interval:18.0f/1.0f]; 

      [self schedule: @selector(blueEnemyFlame:)interval:1.0f/5.0f]; 

     CCLOG(@"number = %i",randomEnemy); 
     break; 
    case 3 : isSpinningRockOnTheScreen = YES; 

      spinningRock = [CCSprite spriteWithFile:@"rocks.png"]; 
      spinningRock.position = ccp(screenWidth * 1.5, screenHeight/2); 
      [self addChild:spinningRock z:-1]; 

      [spinningRock runAction:[CCRepeatForever actionWithAction:[CCRotateBy actionWithDuration:2.0 angle:360]]]; 

      moveTheRock = [CCMoveTo actionWithDuration:39.0 position:ccp(-500, spinningRock.position.y)]; 
      [spinningRock runAction:moveTheRock]; 

      [self schedule:@selector(removeTheSpinningRock:)interval:10.0f/1.0f]; 

     CCLOG(@"number = %i",randomEnemy); 
     break; 
} 
} 

-(void)removeTheSpinningRock:(ccTime)delta{ 
[self unschedule:@selector(removeTheSpinningRock:)]; 
[self stopAllActions]; 

[self createEnemyOfType]; 

isSpinningRockOnTheScreen = NO; 
} 

-(void)redEnemyFlame:(ccTime)delta{ 
redEnemyFlameCounter ++; 

if (redEnemyFlameCounter % 2){ 
    [redEnemy setTexture:[[CCSprite spriteWithFile:@"redenemy2.png"]texture]]; 
}else{ 
    [redEnemy setTexture:[[CCSprite spriteWithFile:@"redenemy.png"]texture]]; 
} 
} 

-(void)removeTheEnemy:(ccTime)delta{ 
CCMoveBy* moveUp = [CCMoveBy actionWithDuration:2.0 position:ccp(100, screenHeight/2)]; 
[redEnemy runAction:moveUp]; 
[self unschedule:@selector(removeTheEnemy:)]; 

[self createEnemyOfType]; 

isRedEnemyOnTheScreen = NO; 
} 

-(void)yellowEnemyFlame:(ccTime)delta{ 
yellowEnemyFlameCounter ++; 

if (yellowEnemyFlameCounter % 2){ 
    [yellowEnemy setTexture:[[CCSprite spriteWithFile:@"yellowenemy2.png"]texture]]; 
}else{ 
    [yellowEnemy setTexture:[[CCSprite spriteWithFile:@"yellowenemy.png"]texture]]; 
} 
[self schedule:@selector(yellowEnemyFlight:)interval:8.0f/1.0f]; 

} 

-(void)yellowEnemyFlight:(ccTime)delta{ 
yellowEnemyMoveLeft = [CCMoveTo actionWithDuration:4.0 position:ccp(-100, bulletY)]; 
[yellowEnemy runAction:yellowEnemyMoveLeft]; 

[self schedule:@selector(removeTheYellowEnemy:)interval:4.0f/1.0f]; 
} 

-(void)removeTheYellowEnemy:(ccTime)delta{ 
CCMoveTo* removeYellowEnemy = [CCMoveTo actionWithDuration:1.0 position:ccp(-100, screenHeight/2)]; 
[yellowEnemy runAction:removeYellowEnemy]; 
[self unschedule:@selector(removeTheYellowEnemy:)]; 

[self createEnemyOfType]; 

isYellowEnemyOnTheScreen = NO; 
} 

-(void)blueEnemyFlame:(ccTime)delta{ 
blueEnemyFlameCounter ++; 

if (blueEnemyFlameCounter % 2){ 
    [blueEnemy setTexture:[[CCSprite spriteWithFile:@"blueenemy2.png"]texture]]; 
}else{ 
    [blueEnemy setTexture:[[CCSprite spriteWithFile:@"blueenemy.png"]texture]]; 
} 
} 

-(void)removeTheBlueEnemy:(ccTime)delta{ 
CCMoveBy* moveUpBlueEnemy = [CCMoveBy actionWithDuration:0.5 position:ccp(200, 400)]; 
[blueEnemy runAction:moveUpBlueEnemy]; 
[self unschedule:@selector(removeTheBlueEnemy:)]; 

[self createEnemyOfType]; 

isBlueEnemyOnTheScreen = NO; 
} 
@end 
+0

В этом коде не должно быть ничего плохого, создаете ли вы два экземпляра класса FlyingEnemy в другом месте? –

+0

Спасибо за быстрый ответ. Я не создаю еще один экземпляр FlyingEnemy нигде. Есть ли другой метод, например arc4random, который я могу попробовать, который может быть более надежным? Есть ли другой способ делать то, что я делаю? – PoKoBros

+0

Я не вижу, что это проблема, она возвращает только одно число. Два врага одинакового цвета? Вызывается ли ваш журнал сообщений дважды? –

ответ

2

При вызове метода removeEnemy, вы не вызываете соответствующий метод для удаления вашего ребенка спрайт со сцены. Поэтому каждый раз, когда вы вызываете этот метод, другой CCSprite добавляется без удаления, поэтому вы видите дубликаты. Убедитесь, что вы вызываете removeChild: для удаления CCSprite.

+0

если я положил removeChild в методах removeEEemem, тогда я получаю сообщение плохо ошибка доступа. – PoKoBros

+0

Я не могу сказать, как вы объявляете свою переменную redEnemy, но похоже, что сильная ссылка не поддерживается, а переменная выходит за рамки. Вам нужно либо установить @property, который силен, и сохранить спрайт там, либо вы можете дать ярлыку спрайта и получить к нему доступ таким образом. –

+0

Я использовал оба тега и свойства, и оба они по-прежнему вернули ошибку с плохим доступом к потоку. – PoKoBros

1

Если у вас плохой доступ, это означает, что ваш объект ниль или если вы удалили свой объект из сцены, и после этого вы пытаетесь что-то сделать с этим объектом, например, запустить действие на нем, это плохой доступ.