4

cocos2diOSゲームにパーティクルエフェクトを追加しようとしています。すべてのスプライトがパフォーマンスを向上させるためにスプライトバッチを使用しているため、スプライトにパーティクルを追加するときに問題が発生します。このため、スプライトにパーティクルエフェクトを簡単に使用できないようです。ゲームプレイレイヤーにすべてのパーティクルエフェクトを保持するだけですべてが正しく機能しますが、各スプライトに独自のパーティクルエフェクトを追跡させたいと思います。これが私のプレーヤークラスにある私のコードです:

-(void)loadParticles  
{    
    shieldParticle = [[CCParticleSystemQuad alloc] initWithFile:@"shieldParticle.plist"];
    shieldParticle.position = self.position;
    [self addChild:shieldParticle];  
}

このテクニックを使用すると、次のようにエラーが発生します

CCSprite only supports CCSprites as children when using CCSpriteBatchNode

これを回避するために、別のクラス、particleBaseを作成しました。

particleBaseクラスでは、ccspriteから継承し、パーティクルエフェクトを追跡するためのiVarがあります。

#import "cocos2d.h"
@interface particleBase : CCSprite
{
CCParticleSystem *particleEffect;
}

-(void)setParticleEffect:(NSString *)effectName;
-(void)turnOnParticles;
-(void)turnOffParticles;
@end

#import "particleBase.h"

@implementation particleBase

-(void)setParticleEffect:(NSString *)effectName
{    
    particleEffect = [[CCParticleSystemQuad alloc] initWithFile:effectName];
    particleEffect.active = YES;
    particleEffect.position = self.position;
    [self addChild:particleEffect];
}

このテクニックを使用するとき、私は自分のプレーヤークラスでこれを試しました:

-(void)loadParticles
{    
    shieldParticle = [[particleBase alloc] init];
    [shieldParticle setParticleEffect:@"shieldParticle.plist"];
    [shieldParticle turnOnParticles];
    [shieldParticle setPosition:self.position];
    [self addChild:shieldParticle z:150];      
}

これを行ってもエラーは発生しませんが、パーティクルも表示されません。

どんな助けでも大歓迎です。

4

1 に答える 1

3

スプライトクラスにパーティクルシステムのインスタンス変数を追加します。次に、パーティクルエフェクトを作成するときに、それをスプライト自体に追加するのではなく、より高いレベルのノードに追加します。これはメインのゲームレイヤーまたはシーンである場合もあれself.parent.parentば、スプライトバッチノードの親を提供する単純に使用する場合もあります。

次に、スプ​​ライトクラスで更新メソッドをスケジュールします。パーティクルシステムがnilでない場合は、その位置をスプライトの位置に設定します。必要に応じてプラスオフセット。

Etvoilá:

-(void) createEffect
{
    particleSystem = [CCParticleSystem blablayouknowwhattodohere];
    [self.parent.parent addChild:particleSystem];
    particleSystem.position = self.position;

    // if not already scheduled:
    [self scheduleUpdate];
}

-(void) removeEffect
{
    [particleSystem removeFromParentAndCleanup:YES];
    particleSystem = nil;

    // unschedule update unless you need update for other things too
    [self unscheduleUpdate];
}

-(void) update:(ccTime)delta
{
    if (particleSystem)
    {
        particleSystem.position = self.position;
    }
}
于 2012-07-26T13:55:49.230 に答える