0

CCSpriteこのように、ダブルタップで(爆弾を表すはずの)を作成しています。

- (void)handleDoubleTap:(UITapGestureRecognizer *)doubletapRecognizer
{
    [self placeBomb];
}

-(void)placeBomb
{
    NSLog(@"Bomb placed");
    _circle = [[CCSprite alloc]initWithFile:@"Circle.png"];
    CGPoint circle0position = ccp(_cat.position.x , _cat.position.y);
    CGPoint c0TileCoordt = [self tileCoordForPosition:circle0position];
    CGPoint c0TileCoord = [self positionForTileCoord:c0TileCoordt];//Supereffective way to get rid of decimals
    _circle.position = c0TileCoord;
    [self addChild:_circle];
    id fade = [CCScaleTo actionWithDuration:3.5 scale:0];
    [_circle runAction:fade];
    [self performSelector:@selector(explosion) withObject:nil afterDelay:3];
}

次に-(void)explosion、 which (驚き) を実行して爆発させます。これにより、再び checkForDamage メソッドが呼び出され、爆発の存続期間中の爆発領域内の衝突がテストされます。

問題は、爆弾 (スプライト) の量に制限を設けたくないということですが、今 2 つの爆弾を配置すると、最初の爆弾の爆発が 2 番目の爆弾の場所で発生します。これは明らかに非難できません。 、それが私がそれをするように頼むからです。爆発は に基づいてい_circle.positionます 爆発ブロックの長さは約300行なので、ここに投稿することはお勧めしません(Heres pastebin link)が、例として checkForDamage を投稿します。

-(void)checkForDamage //Gets called with CCTime on explosion
{
    bool playerHit = NO;
    CGPoint bombPos = [self tileCoordForPosition:_circle.position];

    for (int i = 0; i <= explosionLenght; i++)
    {        
        CGPoint playerPosF = [self tileCoordForPosition:_cat.position];

        int bombX    = (bombPos.x + i);
        int bombY    = (bombPos.y + i);
        int bombNegX = (bombPos.x - i);
        int bombNegY = (bombPos.y - i);

        CGPoint centre = bombPos;
        CGPoint top    = ccp(centre.x, bombY);
        CGPoint left   = ccp(bombNegX, centre.y);
        CGPoint bottom = ccp(centre.x, bombNegY);
        CGPoint right  = ccp(bombX, centre.y);

        if (CGPointEqualToPoint(top, playerPosF) || 
            CGPointEqualToPoint(left, playerPosF) ||
            CGPointEqualToPoint(bottom, playerPosF) || 
            CGPointEqualToPoint(right, playerPosF))
        {
            playerHit = YES;

            NSLog(@"Player hit, BOOL:%i",playerHit);
            [self unschedule:@selector(checkForDamage)];
            break;
        }
    }

    [self performSelector:@selector(stopCheckDamage) withObject:nil afterDelay:2];    
}

_circle複数の爆発とダメージのチェックを同時に行うことができるように、爆弾の複数のインスタンスを作成するにはどうすればよいですか。ループしてタグ付きのスプライトを作成しようとしましたforが、タグでスプライトにグローバルにアクセスして実行する方法がわかりません。次のように、爆発ごとに異なるスプライトを作成することを考えました

if (explosion1exists) {explosion with circle1}, if (expl1 + expl2 exists) {expl with circle3}

しかし、せいぜい 20 ~ 30 個の爆弾を配置するだけなので、これでは非常に効率が悪く、もっと良い方法があるはずだと考えました。これを効果的に行う方法はありますか?

4

0 に答える 0