0

私はゲームに取り組んできましたが、敵のゲームオブジェクトを削除するのに問題はありませんでした (現在、それらはからサブクラス化されてCCSpriteおり、それが最善の方法ではないことがわかっています)

しかし、プログラムが に追加された後にremoveChildからを実行しようとしたときにクラッシュするように変更した理由がわかりません。_targetstargetsToDelete

私は物事を動かそうとしましたが、作成中に配列を追加または編集する方法がわかりません...助けやアドバイスは素晴らしいでしょう!

実際、ゲームの敵を作成する最善の方法についてのヒントがあれば、サブクラス化しますNSObjectCCNode? それらをコンポーネント クラスに分割すると聞きましたが、その意味がわかりませんでした。

//Projectile Target collision

-(void)update:(ccTime)dt {

    for (spygot *target in _targets) {
        CGRect targetRect = CGRectMake(
                                       target.position.x - (target.contentSize.width/2),
                                       target.position.y - (target.contentSize.height/2),
                                       target.contentSize.width,
                                       target.contentSize.height);

        //Collision Detection Player
        CGRect playerRect2 = CGRectMake(
                                        _controlledSprite.position.x - (_controlledSprite.contentSize.width/2),
                                        _controlledSprite.position.y - (_controlledSprite.contentSize.height/2),
                                        _controlledSprite.contentSize.width,
                                        _controlledSprite.contentSize.height);

    NSMutableArray *projectilesToDelete = [[NSMutableArray alloc] init];
    for (Projectile *projectile in _projectiles) 
    {           
        NSMutableArray *targetsToDelete = [[NSMutableArray alloc] init];

        CGRect projectileRect = CGRectMake(
                                           projectile.position.x - (projectile.contentSize.width/2),
                                           projectile.position.y - (projectile.contentSize.height/2),
                                           projectile.contentSize.width,
                                           projectile.contentSize.height);
        BOOL monsterHit = FALSE;

        if (CGRectIntersectsRect(projectileRect, targetRect))
        {
            NSLog(@"hit");
            target.mhp = target.mhp - 1;
            monsterHit = TRUE;

            if (target.mhp <= 0)
            {
                [targetsToDelete addObject:target];
            }
        }


        for (spygot *target in targetsToDelete) 
        {
            [self removeChild:target cleanup:YES];
            [_targets removeObject:target];
        }

        if (monsterHit)
        {
            [projectilesToDelete addObject:projectile];
        }

        [targetsToDelete release];
    }

    for (Projectile *projectile in projectilesToDelete) 
    {
        [_projectiles removeObject:projectile];
        [self removeChild:projectile cleanup:YES];

    }
    [projectilesToDelete release];
}
4

3 に答える 3

0

通常、この種のエラーが発生したのは、コードがブロック内にあるか、他の方法であいまいなスレッド上にあるためです。このコードが同時に複数回実行されていないことをどの程度確信していますか?

次のようにラップしてみてください。

dispatch_async(dispatch_get_main_queue(), ^{
    // do everything here.
});

ゲームの敵オブジェクトにCCSpriteを使用する際のアドバイスについては、問題が発生したときに修正することをお勧めします。今、問題が発生していますか?時期尚早の最適化は、そもそも間違って行うのとほぼ同じくらい悪いことです。プロジェクトの終わりに、以前にどのようにそれを行うべきだったかがよくわかります。;)

于 2012-12-30T06:25:33.460 に答える
0

貼り付けたコードはすべて、 をfor反復するループ内のもののよう_targetsです。変数はどのようtargetに初期化されますか?

于 2012-12-30T05:55:14.633 に答える
0

反復処理中に配列から要素を削除できないことを知っていると思います。そのため、targetsToDelete配列があります。

しかし、あなたはすぐにターゲットを削除するように見えます。

これを試してください: メイン ループの繰り返しを終了し、targetsToDelete 配列へのターゲットの収集を終了し、メイン ループが完了した後にのみターゲットを削除します。

于 2013-01-02T21:05:19.323 に答える