地球人己阻止不了程序猿们学习cocos2d-x了 (第五篇)

  • 本帖最后由 dr_watson 于 2012-7-22 11:55 编辑 *

内容重点: 为 cocos2d-x 加上关键帧粒子系统.

cocos2d-x 的粒子系统只有单一发射器, 而且粒子的变化只有开始和结束的设定, 局限挺大的.

举个列子, 一个好的爆炸效果, 要有烟, 有火花, 可能还会有碎片, 要多个发射器加在一起才能做到.

而爆炸的火花是忽然间变光然後再变暗, 所以颜色等的变化要有 关键帧 般的设定才可以做到这个效果.

以我接触过的2D引擎来说, 我觉得是Torque2D 的粒子系统是比较出色的一个, 要把它移植到 cocos2d-x 有点难度, 但模仿一下总是可以的 {:soso_e104:}

对於多发射器的支持, cocos2d 是可以做到, 我们只要把几个 CCParticleSystemQuad 组合在一起用就可以.

以关键帧来控制粒子变化我们就要费点心思了, 在以不影响 cocos2d-x 库的情况下, 我以引申 CCParticleSystemQuad 的方法来实现它:


class CCParticleEmitter: public CCParticleSystemQuad
{
public:
        CCParticleEmitter();
        virtual ~CCParticleEmitter();

        virtual void update(float dt);

        void InitEmitter(CCParticleController &controller);
        
        void AddEmittingCounterKeyFrame(float time, float value);

        void Reset();

private:

        CCParticleControl mEmittingCount;

        int mControllerCount;
        CCParticleController **mControllers;

};

CCParticleSystemQuad 的 update() 是 virtual 的, 正好方便我们弄自己的粒子系统.

首先我们先了解一下怎样以关键帧来控制粒子变化. 简单来说, 我们就是定义一系列的"时间:数值"组合, 来决定粒子的某个属性在某个时间段的变化.

比如说粒子的透明度 (alpha):

时间(秒) :
透明度
0.0 : 1.0
1.0 : 0.5
2.0 : 0.0

这个列表说明, 在一开始, 粒子的透明度是1.0, 即是完全不透明, 到了1秒的时候, 透明度变成了0.5, 一半透明了, 最後到了2秒, 粒子变成完全透明, 即是消失了!

但是以秒为作为关键帧的时间单位有个不好的地方, 就是每个粒子生命的长短一般都是不规则的(不规则的安排才能做出好的粒子效果), 那我们在制定关键帧时就比较杯具了, 很难统一的去处理每个粒子. Torque2D 的原作者(Melv May)想到了一个较好的方法, 时间的表达不是用时间, 而是用粒子生命的百分比. 比如像刚才的例子, 那个粒子的生命?期是2秒, 那我们的列表就变成了:

生命?期的百分比 :
透明度
0.0 : 1.0
0.5 : 0.5
1.0 : 0.0

1.0 就是代表100%, 整个生命?期的长短.

现在以关键帧控制的粒子属性有:

  • 粒子数目
  • 颜色 (R, G, B, A)
  • 大小 (*)
  • 移动速度 (*)
  • 旋转角度
  • 粒子数目
  • radial 加速 (*)
  • tangential 加速 (*)
  • 旋转速度 (*)
  • 旋转半径

其中有(*) 的, 是说数值代表的是属性开始数值的百分比, 比如粒子大小一开始是 10个 像素, 那 0.5 就是5个像素, 2.0 就是20个像素.

附件工程里的粒子效果现在是以人手很痛苦地输入在一个粒子 plist 档里, 看看那位同学有时间弄个粒子编辑器? {:soso_e113:}

最后看看我们的爆炸效果吧:

288

注意事项:

工程是用了今天(6月21日) github 上的cocos2d-x最新版本, 这个版本改了很多命名方式, 所以用较旧的cocos2d-x 版本不一定可以编译.

  • 关键帧的数目暂时定了为6个, 如有需要, 可以更改 CCParticleEmitter.h 里的 MAX_KEYFRAME.
  • 这个粒子系统只是试验性质, 并没有详细测试, 如果有?或改善的建议(改善的建议最好是有热心同学改好了分享给大家:)), 欢迎跟贴留言.

339

整个xcode版本 就好了!

我来看看,学习了。。

又出新的了,必须顶

谢谢分享…………

建议带个exe可以不用编译跑跑

赞一下,慢慢体会

我只看看,我不说话。

顶了再看。

更新工程至 cocos2d-x 2.0.1

导入之后无法生成,这是个什么情况??
d:coco2.0cocos2dxplatformwin32ccstdc.h(62): error C2146: 语法错误: 缺少“;”(在标识符“gettimeofday”的前面)
1>d:coco2.0cocos2dxplatformwin32ccstdc.h(62): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>d:coco2.0cocos2dxplatformwin32ccapplication.h(5): fatal error C1083: 无法打开包括文件:“CCCommon.h”: No such file or directory
1> System.cpp
1>d:coco2.0cocos2dxincludeccconfig.h(30): fatal error C1083: 无法打开包括文件:“CCPlatformConfig.h”: No such file or directory
1> SoundManager.cpp
1>d:coco2.0cocos2dxincludeccconfig.h(30): fatal error C1083: 无法打开包括文件:“CCPlatformConfig.h”: No such file or directory
1> SneakyJoystickSkinnedBase.cpp
1>d:coco2.0cocos2dxincludeccconfig.h(30): fatal error C1083: 无法打开包括文件:“CCPlatformConfig.h”: No such file or directory
1> SneakyJoystick.cpp
1>d:coco2.0cocos2dxincludeccconfig.h(30): fatal error C1083: 无法打开包括文件:“CCPlatformConfig.h”: No such file or directory
1> SneakyButtonSkinnedBase.cpp
1>d:coco2.0cocos2dxincludeccconfig.h(30): fatal error C1083: 无法打开包括文件:“CCPlatformConfig.h”: No such file or directory
1> SneakyButton.cpp

???
下面还有好多???

自从你改版本之后你的例子我就运行不了了???
求救!

CCParticleEffect *mEffect;

怎么在设置的时候是这样设置的
void MonsterManager::SetParticleEffect(CCParticleEffect *effect)
{
mEffect = effect;
}
跑不通啊

1>e:cocos2d-x素材particledemoclassesmonstermanager.cpp(210): error C2440: “=”: 无法从“CCParticleEffect *”转换为“CCParticleEffect *”
1> 没有转换为数组类型,但有转换为数组的引用或指针

— Begin quote from ____

moonagent 发表于 2012-8-2 11:24 url

导入之后无法生成,这是个什么情况??
d:coco2.0cocos2dxplatformwin32ccstdc.h(62): error C2146: …

— End quote

??你是用那?版本的 cocos2d-x?

— Begin quote from ____

dr_watson 发表于 2012-8-7 15:30 url

??你是用那?版本的 cocos2d-x?

— End quote

cocos2d-2.0-rc0a-x-2.0

— Begin quote from ____

moonagent 发表于 2012-8-7 15:41 url

cocos2d-2.0-rc0a-x-2.0

— End quote

我用的是 2.0.1, 可能目???有所改?.

必须顶啊。

鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎:D:D