-2

わかりました、これは単純なはずですが、私は巨大な脳のおならを持っていて、これを理解することはできません。私が望むのは、敵が一度スポーンすることだけです。現在、180秒ごとにスポーンしていますが、180秒の時点で1回だけスポーンします。

         [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];
}
   }
4

2 に答える 2

2

ここで手足に行きます。このコードでは、gameLogicBossメソッドが180秒ごとに実行されます。

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

これを1回だけ実行する場合は、メソッドの実行時にセレクターのスケジュールを解除する必要があります。

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

    // rest of the code here …
}

_cmd現在のメソッドのセレクターの省略形です。もちろん、@ selector(…)を使用して、別のメソッドからセレクターのスケジュールを解除することもできます。

Cocos2D 2.0には、scheduleOnceという名前のメソッドもあります。このメソッドは、手動でスケジュールを解除しなくても、セレクターを1回だけ呼び出します。

于 2012-07-05T20:07:49.057 に答える
0

私はこれらの言語やツールを使って開発したことがないので、洗練されたソリューションはよくわかりませんが、機能するソリューションを提供することはできます。ブール変数を作成し、それをTrueに初期化するだけです。ボスを生成するためのすべてのコードをifコントロールに配置して、その変数がTrueに設定されている場合にのみ実行されるようにします。ボスがスポーンした後、変数をFalseに設定します。

于 2012-07-05T20:07:22.880 に答える