0

私は頭を動かすのに苦労していて、NSMutableArrays助けが必要です。

私は、伝統的なマリオのように、レベル全体に散らばっている「プレーヤー」と「コイン」の衝突をテストしようとしています。

クラッシュレポートが表示されます' *コレクション<__NSArrayM:0x4bf6d0>が列挙中に変更されました。

私は次のような同様のスプライト衝突方法に従いました:http: //geekanddad.wordpress.com/2010/06/22/enemies-and-combat-how-to-make-a-tile-based-game-with-cocos2d -パート-3/

何らかの理由で、1枚のコインしかスポーンされない場合はすべて正常に機能しますが、1枚を超えるコインがスポーンされると、コインの衝突によってクラッシュが発生します。

これはnoobの問題であり、[delete addObject:nuCoin]に関連していることを理解しています。-私は周りを見回して、削除機能を処理するためのサブ配列を作成することを読みました-しかし、私は明らかに失われ、助けていただければ幸いです、事前に感謝します!

-(void) coinCollision {

    NSMutableArray *coinsToDelete = [[NSMutableArray alloc] init];
    NSMutableArray *delete = [[NSMutableArray alloc] init];

    for (CCSprite *nuCoin in _coins) {


        CGRect coinRect = CGRectMake((nuCoin.position.x+1) - (nuCoin.contentSize.width/4),
                                     (nuCoin.position.y+5) - (nuCoin.contentSize.height/4),
                                     nuCoin.contentSize.width/3.5,
                                     nuCoin.contentSize.height/7);




    for (CCSprite *Player in _player) {
        CGRect playerRect = CGRectMake(player.position.x - (player.contentSize.width/4),
                                    player.position.y - (player.contentSize.height*.05),
                                    player.contentSize.width*.05,
                                    player.contentSize.height/2);



            if (CGRectIntersectsRect(coinRect, playerRect)) {

                [coinsToDelete addObject:nuCoin];}


        }


    for (CCSprite *nuCoin in coinsToDelete) {

        [[SimpleAudioEngine sharedEngine] playEffect:@"Coin.mp3"];
        [_coins removeObject:nuCoin];

        [delete addObject:nuCoin];
        [map removeChild:nuCoin cleanup:YES];

    }

    }

    [delete release];

}
4

1 に答える 1

0

for(...in...)高速列挙ループ内で可変配列にオブジェクトを追加したり、可変配列からオブジェクトを削除したりすることはできません。これを機能させるには、いくつかのロジックを開発する必要があります(たとえば、削除するオブジェクトのインデックスを保存するか、削除可能としてマークし、forループの終了後にすべてを1つのステップで削除します)。

例:

NSMutableArray *markedAsDeletee = [NSMutableArray array];
for (CCSprite *sprite in array)
{
    if (/* decide wheteher this sprite should be deleted */)
        [markedAsDeletee addObject:sprite];
}

[array removeObjectsInArray:markedAsDeletee];
于 2012-08-12T12:42:57.577 に答える