0

私は cocos2d プロジェクトに取り組んでおり、スプライトの配列を操作したいと考えています。

私は配列を作成します:

NSMutableArray *ssprites;

次に、init メソッドで何かを追加します。

CCSprite *obssprite = [CCSprite spriteWithFile:@"/Users/Desktop/Programs/physics test/physics test/Resources/Icon-Small@2x.png"];  
            obssprite.position=ccp(position,5);

            [self addChild: obssprite];

            [ssprites addObject: obssprite];

その後、スプライトを削除したい:

for( int i=0; i<[ssprites count];i++) {
    CCSprite *spr = (CCSprite *) [ssprites objectAtIndex:i];
        if(YES) {    //this is just for test, the actual program uses an actual condition

            [spr removeFromParentAndCleanup: YES];
            [ssprites removeObjectAtIndex:i];
        }


}

しかし、何らかの理由でスプライトが画面に表示されたままになります。スプライトを実際に削除するには、コードをどのように修正すればよいですか?

4

2 に答える 2

1

ジョーがコメントで述べたように、スプライトの配列をループし、ループ自体でそれらを削除しています。したがって、最初にインデックス 0 のオブジェクトを削除してiから 1 にインクリメントすると、元の配列のインデックス 2 のオブジェクトを実際に「ポイント」します (以前はインデックス 1 だったオブジェクトがインデックス 0 になりました)。毎秒オブジェクトを削除しているように思えますか?

この問題に関係なく、ループしている配列から要素を削除することは決して良い考えではありません。この配列はまったく必要ですか?単純に CCNode の子配列を使用した場合はどうなるでしょうか (コードからは、すべてのスプライトが親と独自のスプライト配列に追加されているように見えます)。


この単純なコードでこれを実際に見ることができます

NSMutableArray *ssprites = [NSMutableArray arrayWithObjects:@"obj1", @"obj2", @"obj3", @"obj4", @"obj5", nil];
for(int i = 0; i < [ssprites count]; i++) 
{
    NSString *spr = (NSString *) [ssprites objectAtIndex:i];

    NSLog(@"removing %@", spr);

    [ssprites removeObjectAtIndex:i];
}

このようにコードを変更することをお勧めします

NSMutableArray *spritesToRemove = [[NSMutableArray alloc] init];

for (CCSprite *spr in ssprites)
{
    if (YES) // Your condition goes here
    {
        // Remove the sprite from its parent here.
        [spr removeFromParentAndCleanup:YES];
        // However, leave the "spr" in ssprites array - just "mark" it for deletion.
        [spritesToRemove addObject:spr];
    }
}

[ssprites removeObjectsInArray:spritesToRemove];
于 2013-04-18T18:24:55.407 に答える
0

試す:

//..
[self removeChild:spr cleanup: YES]
//..
于 2013-04-18T14:54:04.090 に答える