您的位置:首页 > 移动开发 > Cocos引擎

书生教你cocos2d-x-保卫萝卜(三)

2013-11-30 18:43 453 查看
书生教你cocos2d-x-保卫萝卜(三)书生换了新公司,最近在进行工作交接,耽误了博客的更新,在此先给朋友们说声抱歉。这几天我会赶一下进度,完结保卫萝卜的教程。争取在去新公司上班前再出一个cocos2d-x使用lua脚本的游戏demo。 之前我们搭建了保卫萝卜的主界面,并且实现了一个简单的动画类结构。(http://luoposhusheng.blog.51cto.com/8148702/1329353)这篇文章我们先实现这个动画类里的AnimationManager模块,方便我们使用。之后就把它放一边,等到需要改进时继续优化。由于篇幅问题,我们在下一章实现选关界面,之后就讲解游戏场景了。下面讲解我们对动画类进行了哪些修改,源码下载地址http://down.51cto.com/data/1028692
class FrameAnimationBase:public cocos2d::CCObject{
public:
friend class FrameAnimation;
virtual ~FrameAnimationBase();
/*static FrameAnimationBase* create();*/
static FrameAnimationBase* create(std::string name,constchar* file_path );
/*bool init();*/
bool init(std::string name,constchar* file_path);
void AddFrame(std::string action_name,cocos2d::CCSpriteFrame* frame);
void AddFrame(std::string action_name,std::string  frame_name);
private:
FrameAnimationBase();
cocos2d::CCDictionary* action_dic;
std::string default_action;
cocos2d::CCSpriteFrame* GetFrame(std::string action_name,int frame_index);
};
首先是AnimationBase类,我们修改了创建函数static FrameAnimationBase* create(std::string name,const char* file_path );接口要求我们传入动画的名字和文件地址。也就是说我们把动画信息编辑在一个xml里。由于我不打算再进行程序手动创建动画内容的行为,所以我把原本的函数注释掉了。这是动画信息数据化的改动。然后看AnimationManager这个类的结构
class AnimationManager:public cocos2d::CCNode{
public:
virtual ~AnimationManager();
static AnimationManager* SharedAnimationManager();
FrameAnimation* CreateAni(std::string name);//得到动画对象
FrameAnimationBase* CacheAnimationBase(std::string name);//缓存动画数据信息
void StartStep(float interval);
void StepLogic(float dt);
void Step();
void ClearAnimations();
private:
AnimationManager();
bool init();
cocos2d::CCDictionary* ani_base_dic;
cocos2d::CCArray* ani_array;
};
这个类负责管理动画资源。它有一个方便我们创建动画的接口。FrameAnimation* CreateAni(std::string name);//得到动画对象以后我们程序创建动画对象,直接通过这个接口,传入一个动画的名字。然后AnimationManager会自动找到对应base,如果没有这个动画会自动加载对应名称的xml文件,创建出base。之后基于base创建出Animation返回给我们。同时,AnimationManager会把这个Animation放进一个队列里,方便我们统一对所有的Animation进行step();值得一提的是这里用ccarray当容器存储的动画,可能会造成效率不够高,不过没关系,如果有必要的话,我们再对其进行优化。
AnimationManager对外有2个重要的接口,Step(),这个函数会对所有的动画进行step,通过它,我们可以手动控制所有动画的状态更新。void StartStep(float interval);是自动step,如果我们执行了它,则每隔一段时间会自动调用step,不需要我们重复调用。具体使用哪种模式,根据个人习惯。到此,动画类的框架就确定了。然后书生思考了一下,我们之后很可能需要对动画类进行优化,主要是2个方面,1是存储结构,使用ccarray存储信息来遍历或许不是一个好的选择,如果导致游戏掉帧,我们马上进行修改。2是我们的动画没有时间的概念,需要手动控制step的时机,可能我们会加入时间和停留帧的时间。但是总的来说,对外接口是不变了。所以我们可以放心的先进行下面的工作。先看一下testscene里关于动画类的使用。
void TestLayer::TestAnimation(){
cocos2d::CCSize win_size=cocos2d::CCDirector::sharedDirector()->getWinSize();
cocos2d::CCMenu* menu=cocos2d::CCMenu::create();
this->addChild(menu);
menu->setPosition(ccp(0,0));
//测试切换动作
cocos2d::CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("Items01.plist");
//创建实例
for(int i=0;i<100;i++){
FrameAnimation* luobo_ani=AnimationManager::SharedAnimationManager()->CreateAni("luobo");
this->addChild(luobo_ani);
luobo_ani->setPosition(ccp(win_size.width*0.3,win_size.height*0.7));
luobo_ani->Play("happy");
int x=rand()%(int)(win_size.width-200);
int y=rand()%(int)(win_size.height);
luobo_ani->setPosition(ccp(x,y));
}
cocos2d::CCMenuItemSprite* btn_step_file_ani=  GCreateBtnText("Step");
menu->addChild(btn_step_file_ani);
btn_step_file_ani->setPosition(ccp(win_size.width*0.9,win_size.height*0.8));
btn_step_file_ani->setTarget(this,menu_selector(TestLayer::btnTestStepCallBack));
cocos2d::CCMenuItemSprite* btn_auto_step_ani=  GCreateBtnText("AutoStep");
menu->addChild(btn_auto_step_ani);
btn_auto_step_ani->setPosition(ccp(win_size.width*0.9,win_size.height*0.6));
btn_auto_step_ani->setTarget(this,menu_selector(TestLayer::btnTestAutoStepCallBack));
}
void TestLayer::btnTestStepCallBack(cocos2d::CCObject* pSender){
AnimationManager::SharedAnimationManager()->Step();
}
void TestLayer::btnTestAutoStepCallBack(cocos2d::CCObject* pSender){
AnimationManager::SharedAnimationManager()->StartStep(0.1);
}
无关的代码被删除,FrameAnimation* luobo_ani=AnimationManager::SharedAnimationManager()->CreateAni("luobo");是我们创建动画的代码,只有1句。我写了一个for循环,创建了100个萝卜动画,随机在屏幕上。同时创建了2个按钮,一个点击,会让所有的动画step,另一个会让动画自动以0.1秒间隔执行step

我的电脑配置非常糟糕,即便如此仍然跑满了60帧,而保卫萝卜这个游戏中,屏幕里不会同时出现100个以上的动画。所以应该ok。同时,我也用公司的电脑测试过,我公司的电脑配置一般,可以同时对500个动画进行更新而不掉帧。苹果的产品不提,大部分的安卓手机的配置也是比我这破笔记本的性能要好的。 迟了一个星期,实在对不住大家,选关界面的链接为http://luoposhusheng.blog.51cto.com/8148702/1334242明天是周日,我实现游戏关卡,然后找机会更新博客。[align=left][/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息