2012-07-25 28 views
4

我想添加一个粒子效果到我的cocos2d iOS游戏。向粒子添加粒子时遇到问题,因为我的所有精灵都使用spritebatch来提高性能。由于这个原因,我似乎无法轻易地在我的精灵上使用粒子效果。如果我简单地将所有粒子效果保留在我的游戏层上,一切正常,但我宁愿让每个精灵跟踪它自己的粒子效果。这里是我的代码,它位于我的播放器类:在cocos2d中使用粒子效果与ccspritebatchnode

-(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继承它,并有伊娃跟踪粒子效果:

#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];  
} 

当这样做我没有收到错误,但是粒子也不显示。

任何帮助将不胜感激。

回答

3

为您的sprite类中的粒子系统添加一个实例变量。然后,当你创建粒子效果时,不要将它添加到精灵本身,而是添加到更高级别的节点。这可能是主要的游戏层或场景,或者您可以简单地使用self.parent.parent这会给你精灵批处理节点的父节点。

然后在sprite类中安排更新方法。如果粒子系统不是零,则将其位置设置为精灵的位置。如果需要的话加上补偿。

的Et瞧:

-(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; 
    } 
} 
+0

它的工作原理!谢谢!我不知道你可以做些什么,比如self.parent.parent。 – 2012-07-26 20:18:08