0

cocos2dゲームに問題があります。敵が発射した発射体を5秒ごとに削除しようとしています(各発射体の寿命は5秒と想定されています)が、その方法がわかりません。エラーが発生します

Assertion failure in -[CCTimer initWithTarget:selector:interval:]

これが私のコードです:

-(void)projectileShooting:(ccTime)dt
{
    [self schedule:@selector(projectileShooting:) interval:2.5];
    projcount++;
    if([proj count] <= 15 ){
        if(enemy1.position.y < 320){
            v = ccp(player.position.x,player.position.y);
            for(CCSprite *enemies in enemy){
            CCSprite * projectilebullet = [CCSprite spriteWithFile:@"Projectile.png"];
            [proj addObject:projectilebullet];
            [self addChild:projectilebullet];
            CGPoint MyVector = ccpSub(enemies.position,player.position );
            MyVector = ccpNormalize(MyVector);
            MyVector = ccpMult(MyVector, enemies.contentSize.width/2);
            MyVector = ccpMult(MyVector,-1);
            projectilebullet.position = ccpAdd(enemies.position, MyVector);
            for(CCSprite *projectile in proj){
                [self schedule:@selector (deleteprojectile:projectile:) interval:5];
            }
        }
    }
}

for(CCSprite *enem2 in enemytwo)
{
    if(  [proj count] <= 15){
        CCSprite * projectilebull = [CCSprite spriteWithFile:@"Projectile.png"];
        CGPoint MyVector = ccpSub(enem2.position,player.position );
        MyVector = ccpNormalize(MyVector);
        MyVector = ccpMult(MyVector, enem2.contentSize.width/2+10);
        MyVector = ccpMult(MyVector,-1);
        projectilebull.position = ccpAdd(enem2.position, MyVector);
        [self addChild:projectilebull];
        [proj addObject:projectilebull];
        for(CCSprite *projectile in proj){
        }
    }
}



}

-(void)deleteprojectile:(CCSprite *)protime:(ccTime)dt{
    NSMutableArray *timepro = [[NSMutableArray alloc]init];
    [timepro addObject:protime];
    for(CCSprite *objecttime in timepro){
        [proj removeObject:objecttime];
        [self removeChild:objecttime cleanup:YES];
    }
}
4

2 に答える 2

1

これはちょっとしたハックですが、よりエレガントな解決策が見つかるまで、これが私のプログラムで使用しているものです。次のように、親からノードを削除するために呼び出すメソッドがゲームレイヤーにあります。

-(void)removeNode:(CCNode*)node {
    [node removeFromParentAndCleanup:YES];
}

そして、遅延後にノードを削除するようにスケジュールしたい場合は、次のように呼び出します。

[self performSelector:@selector(removeNode:) withObject:node afterDelay:delay];

シンプルで、機能します。

于 2012-12-26T20:42:50.130 に答える
0

セレクターの引数名を発射物ではなくプロタイムに変更します。セレクターは、オブジェクトのクラス定義で定義されているシグニチャーと一致する必要があります。セレクターが適切に定義されておらず、おそらくタイマーがオブジェクトが指定されたセレクターを実装しているかどうかをチェックしています。

テストする時間がなかったので、確認してくれた@RamyAlZuhouriに感謝します。

于 2012-12-26T15:41:48.927 に答える