2011-02-08 19 views
0

私は2つの可変配列を持っています。オブジェクトが配列から削除されたときにループしていて、インデックスが変わってしまい、ループしてコードを繰り返すときに 'rpoint'値と 'rsprite'値が1だけ減少する必要があります。ループ内のループ?

これは私がこれまで持っていたものですが、これは私がこれを持っている時です。

CGPoint cg1 = CGPointMake(33,33); 
    NSValue *cg1obj = [NSValue valueWithCGPoint:cg1]; 

    CGPoint cg2 = CGPointMake(33,97); 
    NSValue *cg2obj = [NSValue valueWithCGPoint:cg2]; 

    NSMutableArray *numberxy = [[NSMutableArray alloc] initWithCapacity:2]; int pointcount = 0; 
    [numberxy insertObject:cg1obj atIndex:pointcount++]; 
    [numberxy insertObject:cg2obj atIndex:pointcount++]; 

    CGPoint red1point = CGPointMake(red1.position.x,red1.position.y); 
    NSValue *red1pointobj = [NSValue valueWithCGPoint:red1point]; 

    CGPoint red2point = CGPointMake(red2.position.x,red2.position.y); 
    NSValue *red2pointobj = [NSValue valueWithCGPoint:red2point]; 

    NSMutableArray *sprites = [[NSMutableArray alloc] initWithCapacity:2]; int spritecount = 0; 
    [sprites insertObject:red1pointobj atIndex:spritecount++]; 
    [sprites insertObject:red2pointobj atIndex:spritecount++]; 



    for (int i=0; i<3;i++) { 
     int rpoint; 
     int rsprite; 

     do{ 
      rpoint = arc4random() % 2; 
     rsprite = arc4random() % 2; 
     } while (rpoint == 0 && rsprite == 0); 

     CGPoint point = [[numberxy objectAtIndex:rpoint] CGPointValue]; 

     CGPoint sprite = [[sprites objectAtIndex:rsprite] CGPointValue]; 

     sprite = ccp(point.x,point.y); 
     CCSprite *sprite1; 

     if (rsprite <3) { 
      sprite1 = [CCSprite spriteWithFile:@"Red tile.png"]; 
      sprite1.position = sprite; 
      sprite1.scale = 0.9; 
      [self addChild:sprite1]; 
     } 
    } 

しかし、すぐに私はそれが動作しないループのためにこれを追加し、iが除去されるので、ランダムな数の範囲が生成される場合、インデックス番号は配列内のオブジェクトの変更され実現されるようrpointとrsprite(ランダムなインデックス番号を取得するために使用される)の整数は、コードが繰り返されるときに1つ下がる必要がありますが、どうやってこれを行うのか分かりません。

if (sprite1.position.x == point.x && sprite1.position.y == point.y) { 
      [numberxy removeObjectAtIndex:rpoint]; 
      [sprites removeObjectAtIndex:rsprite]; 
     } 

答えて

0

あなたはこのような配列内のオブジェクトの数に基づいて乱数を得ることができます:あなたは反復処理している間、それは、配列から項目を削除するには非常に悪い考えです

do{    
    rpoint = arc4random() % [numberxy count]; 
    rsprite = arc4random() % [sprites count]; 
} while (rpoint == 0 && rsprite == 0); 
+0

ありがとう、本当に有益でした:) – Dangermouse

1

をそれ。

あなたが代わりに行うことができることの1つは、削除するアイテム(実際には保存されたオブジェクトポインタでインデックスではなく)を別の配列に維持し、次に削除するすべてのオブジェクトを特定したときですあなたの配列から、この "items to delete"リストを繰り返して、メイン配列の各オブジェクトを見つけてそれを削除します。

+0

私はそれについてやってみましたが、Daveのコードはもっと少ないコードでやっています:) – Dangermouse