使敌人只产生一次cocos2d?

时间:2012-07-05 19:18:57

标签: iphone ios xcode4 cocos2d-iphone

好的,我知道这应该很简单,但我有一个巨大的脑屁并且无法解决这个我想要的只是产生一次的敌人。现在它每180秒产卵一次,我希望它在180秒标记时只产卵一次。

         [self schedule:@selector(gameLogicboss:) interval:180 ];        
          [self schedule:@selector(updateboss:)];                

     -(void)addTarget1 {

Boss *target1 = nil;    


if ((arc4random() % 2) == 0) {{
    target1 = [WeakAndFastBoss boss];
}}  else {
    target1 = [WeakAndFastBoss boss];
}                      

// Determine where to spawn the target along the Y axis
CGSize winSize = [[CCDirector sharedDirector] winSize];
int minY = target1.contentSize.height/2;
int maxY = winSize.height - target1.contentSize.height/2;
int rangeY = maxY - minY;
int actualY = (arc4random() % rangeY) + minY;

// Create the target slightly off-screen along the right edge,
// and along a random position along the Y axis as calculated above
target1.position = ccp(winSize.width + (target1.contentSize.width/2), actualY);
[self addChild:target1 ];

// Determine speed of the target

int minDuration = target1.minMoveDuration;
int maxDuration = target1.maxMoveDuration;
int rangeDuration = maxDuration - minDuration;
int actualDuration = (arc4random() % rangeDuration) + minDuration;

// Create the actions
id actionMove = [CCMoveTo actionWithDuration:actualDuration position:ccp(-target1.contentSize.width/2, actualY)];

id actionMoveDone = [CCCallFuncN actionWithTarget:self 
                                         selector:@selector(spriteMoveFinished:)];
[target1 runAction:[CCSequence actions:actionMove, actionMoveDone, nil]];
target1.tag = 1;
[_targets addObject:target1];   
     }

     -(void)gameLogicboss:(ccTime)dt {
     [self addTarget1];
       iterations_++;
   }

                    - (void)updateboss:(ccTime)dt {
            CGRect projectileRect = CGRectMake(projectile.position.x -                  (projectile.contentSize.width/2), projectile.position.y - (projectile.contentSize.height/2),                           projectile.contentSize.width,                                   projectile.contentSize.height);

    BOOL bossHit = FALSE;
    NSMutableArray *targetsToDelete = [[NSMutableArray alloc] init];
    for (CCSprite *target1 in _targets) {
        CGRect target1Rect = CGRectMake(target1.position.x - (target1.contentSize.width/2),                                    target1.position.y - (target1.contentSize.height/2),                                    target1.contentSize.width,                                  target1.contentSize.height);

        if (CGRectIntersectsRect(projectileRect, target1Rect)) {

            //[targetsToDelete addObject:target];   
            bossHit = TRUE;
            Boss *boss = (Boss *)target1;
            boss.hp--;
            if (boss.hp <= 0) {
                _score ++;
                [targetsToDelete addObject:target1];
            }
            break;

        }                       
    }

    for (CCSprite *target in targetsToDelete) {
        [_targets removeObject:target];
        [self removeChild:target cleanup:YES];                                  
        _projectilesDestroyed++;
        if (_projectilesDestroyed > 2) {

              } 
             }

    if (bossHit) {
        //[projectilesToDelete addObject:projectile];
        [[SimpleAudioEngine sharedEngine] playEffect:@"explosion.caf"];
    }
    [targetsToDelete release];
     }

-(void)spriteMoveFinishedboss:(id)sender {
    CCSprite *sprite = (CCSprite *)sender;
    [self removeChild:sprite cleanup:YES];
    GameOverScene *gameOverScene = [GameOverScene node];
    [gameOverScene.layer.label setString:@"You Lose"];
    [[CCDirector sharedDirector] replaceScene:gameOverScene];    

if (sprite.tag == 1) { // target
    [_targets removeObject:sprite];
} else if (sprite.tag == 2) { // projectile
    [_projectiles removeObject:sprite];
}
   }

2 个答案:

答案 0 :(得分:2)

在这里继续前行。这段代码将每180秒执行一次gameLogicBoss方法:

[self schedule:@selector(gameLogicboss:) interval:180];

如果您希望这只发生一次,则必须在执行方法时取消计划选择器:

-(void) gameLogicboss:(ccTime)delta
{
    [self unschedule:_cmd];

    // rest of the code here …
}

_cmd是当前方法的选择器的简写。您当然也可以使用@selector(...)从不同的方法中取消选择选择器。

Cocos2D 2.0还有一个名为scheduleOnce的方法,它只调用一次选择器,而不必手动取消计划。

答案 1 :(得分:0)

我从未开发过任何这些语言或工具,所以我真的不知道一个优雅的解决方案,但我可以为您提供一个有效的解决方案。只需创建一个布尔变量并将其初始化为True。将所有用于生成boss的代码放在if控件中,这样只有在该变量设置为True时才会运行。在boss生成之后将变量设置为False。