0

cocos2d でバウンディング ボックスを使用してボールと別のスプライトとの衝突を検出してい[self removeChild:Row4Tile1 cleanup: YES];ますが、CGRect を使用すると、スプライトが削除されてもそこにとどまります。境界ボックスも削除する方法はありますか? それぞれを次のように初期化します

Row4Tile1 = [CCSprite spriteWithFile:@"Row4.png" rect:(CGRectMake(Row4Tile1.position.x, Row4Tile1.position.y, 26, 73))];
Row4Tile1.color = ccc3(0, 168, 255);
Row4Tile1.position = ccp(301, 443);
Row4Tile1.rotation = 15.0;
[row4 addObject:Row4Tile1];
[self addChild:Row4Tile1];

その後、それらを削除しますがif (CGRectIntersectsRect(ball.boundingBox, Row4Tile1.boundingBox)) 、複数のスプライトに同じ画像を使用しているため、これが問題かどうかはわかりません。tick メソッドのコードは次のとおりです。

 - (void)tick:(ccTime) dt {    
 _world->Step(dt, 10, 10);
    for(b2Body *b = _world->GetBodyList(); b; b=b->GetNext()) {
    if (b->GetUserData() != NULL) {
        ballData = (__bridge CCSprite *)b->GetUserData();
        ballData.position = ccp(b->GetPosition().x * PTM_RATIO,
                                b->GetPosition().y * PTM_RATIO);
        ballData.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());
         NSLog(@"ball position is %@", NSStringFromCGPoint(ballData.position));
        for(CCSprite *sprite in row4){
            if (CGRectIntersectsRect(ball.boundingBox, Row4Tile1.boundingBox)) {
                [self removeBall];
                [row4 removeObject:Row4Tile1];
                [self removeChild:Row4Tile1 cleanup: YES];
            }
            if (CGRectIntersectsRect(ball.boundingBox, Row4Tile2.boundingBox)) {
                [self removeBall];
                [row4 removeObject:Row4Tile2];
                [self removeChild:Row4Tile2 cleanup: YES];
            }
            if (CGRectIntersectsRect(ball.boundingBox, Row4Tile3.boundingBox)) {
                [self removeBall];
                [row4 removeObject:Row4Tile3];
                [self removeChild:Row4Tile3 cleanup: YES];
            }
   }

ボールを削除する方法はありませんが、うまく機能するので追加しませんでした。削除されていないのは行の境界ボックスだけです

4

1 に答える 1

0

« 削除されていないメモリについて話しますか? 次に、もう1つの同様の問題があります。

Row4Tile1 を row4 配列と self に追加しました。そのため、スプライトの dealloc は、保持カウントが 0 の場合にのみ呼び出されます。したがって、配列から削除すると、自身が dealloc を呼び出します。より明確な情報については、上記のスレッドを確認してください。

« color rect だけで描画する場合は、box2d デバッグ形状または CC_SPRITE_DEBUG_DRAW が 1 である可能性があります。box2d 形状の場合は、スプライトを削除する前に b2body を破棄する必要があります。

于 2013-06-11T13:56:54.250 に答える