iOS_31_cocos2d_粒子系统ParticleSystem

最终效果图:


ParticleSystem是基类,
ParticleSystem的唯一一个直接子类是:ParticleSystemQuad
ParticleSystemQuad下面又有n多个子类
当需要自定义粒子系统时,用到的是ParticleSystemQuad,参数是:第3方软件生成的plist

下面是的粒子系统的继承结构图


下面介绍一下【Particle Designer】






生成两个文件,一个小纹理,一个plist


其中plist文件结构如下:


自定义粒子特效,使用上面生成的plist文件


cocos2d v3版本中,很重要的一点就是:

CCParticleSystemBase替换了以前版本的CCParticleSystem

CCParticleSystem替换了以前版本的CCParticleSystemQuad

因此,在v3以前的版本,自定义粒子时,用CCParticleSystemQuad

因此,在v3之后的版本,自定义粒子时,用CCParticleSystem就可以了



CCParticleBatchNode,

spriteBatchNode一样,使用同一个纹理创建的多个相同特效的粒子(如位于屏幕不同位置显示),

可以添加到同一个batchNode,让它统一管理;

而场景只需与一个batchNode打交道,界面上显示的Node也只有一个

//
//  ParticleScene.m
//  31_cocos2D入门
//
//  Created by beyond on 14-9-27.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import "ParticleScene.h"

@interface ParticleScene()
{
    // 演示系统自带的粒子特效
    CCParticleSystem *_particleSystem;
    
    // 显示粒子特效的名字
    CCLabelTTF *_label;
    
}
@end

@implementation ParticleScene
#pragma mark - 覆盖父类方法
-(id)init
{
    if (self=[super init]) {
        // 1、场景Node 允许交互
        self.userInteractionEnabled = YES;
        // 2、显示粒子特效的名字
        _label = [CCLabelTTF labelWithString:@"" fontName:@"Marker Felt" fontSize:30];
        _label.positionType = CCPositionTypeNormalized;
        // 屏幕的右上方 注意这里是笛卡尔坐标系,原点在左下方
        _label.position = ccp(0.7f, 0.75f);
        _label.horizontalAlignment = CCTextAlignmentRight;
        [self addChild:_label];
    }
    return self;
}
// 直接覆写,即:不用创建一个sprite In Center
- (void)addSpriteInCenter{}
// 实现父类的方法,添加一个按钮到屏幕上
- (void)addShowBtns
{
    // 1.使用系统默认的粒子特效
    [self addBtn:@"【系统粒子】" position:ccp(0, 0) target:self sel:@selector(systemParticleClicked)];
    
    // 2.使用粒子设计器
    [self addBtn:@"【粒子设计器】" position:ccp(0, 0.1) target:self sel:@selector(diyParticleClicked)];
    
    // 3.使用ParticleBatchNode
    [self addBtn:@"【粒子Batch】" position:ccp(0, 0.2) target:self sel:@selector(particleBatchNodeClicked)];
}
// 展示系统默认的粒子特效
static int i = 0;
- (void)systemParticleClicked
{
    // 要添加,先移除
    [_particleSystem removeFromParent];
    i++;
    if (i>11) {
        i=1;
    }
    Class cls;
    switch (i) {
        case 1:
            cls = NSClassFromString(@"CCParticleFire");
            break;
            
        case 2:
            cls = NSClassFromString(@"CCParticleFireworks");
            break;
            
        case 3:
            cls = NSClassFromString(@"CCParticleSun");
            break;
            
        case 4:
            cls = NSClassFromString(@"CCParticleGalaxy");
            break;
            
        case 5:
            cls = NSClassFromString(@"CCParticleFlower");
            break;
            
        case 6:
            cls = NSClassFromString(@"CCParticleMeteor");
            break;
            
        case 7:
            cls = NSClassFromString(@"CCParticleSpiral");
            break;
            
        case 8:
            cls = NSClassFromString(@"CCParticleExplosion");
            break;
            
        case 9:
            cls = NSClassFromString(@"CCParticleSmoke");
            break;
            
        case 10:
            cls = NSClassFromString(@"CCParticleSnow");
            break;
            
        case 11:
            cls = NSClassFromString(@"CCParticleRain");
            break;
            
        default:
            break;
    }
    
    _particleSystem = [cls node];
    // 设置自定义纹理和位置后,添加到场景中(默认纹理是fire.png)
    _particleSystem.texture = [CCTexture textureWithFile:@"circle.png"];
    _particleSystem.position = ccp(self.contentSize.width/2,self.contentSize.height*0.3);
    [self addChild:_particleSystem];
    
    
    // 2、显示粒子特效的名字
    _label.string = NSStringFromClass(cls);
    
}

// 自定义粒子特效,使用粒子设计器
- (void)diyParticleClicked
{
    
    CCParticleSystem *diyParticleSystem = [CCParticleSystem particleWithFile:@"circle.plist"];
    diyParticleSystem.position = ccp(self.contentSize.width/2,self.contentSize.height*0.5);
    // 添加到场景
    [self addChild:diyParticleSystem];
}
// 同spriteBatchNode一样,使用同一个纹理创建的多个粒子特效,可以添加到同一个batchNode中,让它统一管理;而场景只需与一个batchNode打交道,界面上显示的Node也只有一个
- (void)particleBatchNodeClicked
{
//    CCParticleBatchNode *batch = [CCParticleBatchNode batchNodeWithFile:@""];
//    [batch addChild:p1,p2,p3];
}
@end



下面是系统自带的粒子效果,它们全继承自ParticleSystemQuad

ParticleSystemQuad继承自:ParticleSystem

注意:自带的粒子效果,默认要用到一张名为fire.png图片作为纹理

但,可以通过texture属性另行设置











图片编码:在特殊的plist文件中,通过一个key,包含了一个图片的所有编码,从而,创建粒子特效时,不再需要一张.png图片

如下面的这个plist文件,

最后一项key:textureImageData,里面所有字串,就代表着一张完整的图片

从而,无需再另外导入一张.png图片


类似的图片编码,还出现在cocos2d屏幕左下角的帧率显示的数字上面

导演类,决定显示在下角的帧率数字


command+单击,进入


通过再次进入,发现,显示的帧率,其实是CCFPSLabel


通过为_FPSLabel设置string,从而能够在屏幕左下角显示帧率


那么,_FPSLabel是如何实例化的呢?它显示的数字用的纹理是什么呢?

请看下面这张,重点来了~~~


command+单击进入 getFPSImageData方法

发现指向指针的指针datapointer指向了内存中另一块区域:

cc_fps_images_ipadhd_png


进去之后,发现,这些字串,就是图片经过编码后的data







  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值