cocos2d-x学习笔记(12)--粒子系统
cocos2d-x学习笔记(12)--粒子系统
这次我们要接触的是粒子系统,其实就是游戏中常说的武器系统。
上图就是所有的粒子效果,我们只要掌握其使用方法即可。在讲粒子系统之前,我要补充说明一些东西。
首先是CCSprite的继承关系:
可以看到CCSprite继承了CCNode类,而CCNode中包含addChild成员函数,所以CCSprite同样有addChild成员函数。可能之前一直只用layer和scene调用addChild,给大家造成一个习惯,以为只有CCLayer和CCScene类才有addChild,其实不然。再看看下面的继承关系图就一目了然:
接下来下,补充第二个说明:
例子:sprite->runAction(CCRepeateForever::actionWithAction( (CCActionInterval *)(CCSequence::actions (action1, action2, NULL) ) ));
首先我们看看CCSequence::actions的函数原型:
函数的返回值类型是CCFiniteTimeAction,但是我们看看CCRepeateForever::actionWithaction的函数原型:
函数接受的参数类型是CCActionInterval,有于类型不匹配,要转换,转换的根据看了下图就明白了:
、
CCActionInterval类继承了CCFiniteTimeAction类,那么上面例子的强制转换就存在合理性了。
最后一点就是在看这一节的笔记前,最好看看上一节的笔记cocos2d-x学习笔记(11)--坐标系,有助于理解这一节的代码;
以上的补充主要想说的事,大家在遇到什么不懂得地方的时候,可以多去官方网站去查查资料,那里才是最佳的学习地点。
step1:创建cocos2d-win32 application,并命名为particle;
step2:在HelloWorldScene.h中添加下面几个类:
[cpp]
class ParticleDemo:public CCLayer
{
protected:
CCParticleSystem* m_emitter;
CCSprite* m_background;
public:
ParticleDemo();
~ParticleDemo();
virtual std::string title();
virtual void onEnter();
void backCallback(CCObject* pSender);
void restartCallback(CCObject* pSender);
void nextCallback(CCObject* pSender);
virtual void registerWithTouchDispatcher();
virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);
virtual void ccTouchMoved(CCTouch* touch, CCEvent* event);
virtual void ccTouchEnded(CCTouch* touch, CCEvent* event);
void setEmitterPosition();
};
/************************************************************************/
/* firework */
/************************************************************************/
class FireWork:public ParticleDemo
{
public:
virtual void onEnter();
std::string title();
};
class DemoSun:public ParticleDemo
{
public:
virtual void onEnter();
std::string title();
};
class DemoFlower:public ParticleDemo
{
public:
virtual void onEnter();
std::string title();
};
class DemoExplosion:public ParticleDemo
{
public:
virtual void onEnter();
std::string title();
};
class DemoSnow:public ParticleDemo
{
public:
virtual void onEnter();
std::string title();
};
step3:在HelloWorldScene.cpp中添加如下全局变量及函数:
[cpp]
static int index = 1;
const int MAX_INDEX = 5;
CCLayer* runThisTest(int index)
{
switch(index)
{
case 1:return new FireWork();
case 2:return new DemoSun();
case 3:return new DemoFlower();
case 4:return new DemoExplosion();
case 5:return new DemoSnow();
}
return NULL;
}
在添加对应类的成员函数
[cpp]
/************************************************************************/
/* ParticleDemo */
/************************************************************************/
ParticleDemo::ParticleDemo()
{
m_emitter = NULL;
setIsTouchEnabled(true);
CCSize size = CCDirector::sharedDirector()->getWinSize();
//添加基本按钮
CCLabelTTF* pNextLabel = CCLabelTTF::labelWithString("Next ", "Arial", 30);
CCLabelTTF*pBackLabel = CCLabelTTF::labelWithString("Back ", "Arial", 30);
CCLabelTTF*pRestartLabel = CCLabelTTF::labelWithString("Restart ", "Arial", 30);
CCMenuItemLabel* pNextItem = CCMenuItemLabel::itemWithLabel(
pNextLabel, this, menu_selector(ParticleDemo::nextCallback));
CCMenuItemLabel* pBackItem = CCMenuItemLabel::itemWithLabel(
pBackLabel, this, menu_selector(ParticleDemo::backCallback));
CCMenuItemLabel* pRestartItem = CCMenuItemLabel::itemWithLabel(
pRestartLabel, this, menu_selector(ParticleDemo::restartCallback));
CCMenu* pNextMenu = CCMenu::menuWithItem(pNextItem);
CCMenu* pBackMenu = CCMenu::menuWithItem(pBackItem);
CCMenu* pRestartMenu = CCMenu::menuWithItem(pRestartItem);
pNextItem->setPosition(ccp(size.width/2 +150, 50));
pBackItem->setPosition(ccp(size.width/2 - 150, 50));
pRestartItem->setPosition(ccp(size.width/
补充:移动开发 , 其他 ,