尊重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/17144971
上节回顾
【cocos2d-x IOS游戏开发-捕鱼达人9】鱼与动画
1、鱼的产生
鱼的产生
在一定范围内随机产生鱼
场景和屏幕的关系
屏幕只是场景的一个小区域
鱼的坐标是相对场景的。
一些简单的限定
不同的鱼有不同的产生机率
场景中的鱼有最大上限,如果上限内则不产生鱼
鱼在完全看不见的情况下有一定机率消失(可选)
鱼的配置
正常速度,加速时速度,最大加速时间
转弯速度(转1度需要的时间)
血量(决定了能够承受攻击的次数)
2、 鱼的移动
和移动相关的属性
方向
在场景中的位置
当前速度
转弯速度
移动规则
在场景范围内随机挑选一个可用点进行移动
转向时,停止移动
具体实现看代码:
点击开始游戏之后:
#ifndef _GAME_LOGIC_H_ #define _GAME_LOGIC_H_ #include "cocos2d.h" USING_NS_CC; #include <vector> #include "../include/IGameScene.h" #include "../include/SignalSlot.h" #include "../config/GameConfig.h" #include "../config/FishConfig.h" #include "GameLogicDef.h" #include "GameUIMgr.h" #include "GameObject.h" namespace fishingjoy { namespace logic { class CGameLogic:public cocos2d::CCObject,public IGameLogic { scene::IGameScene* m_pGameScene; CGameUIMgr mUIMgr; std::vector<CGameObject*> m_vecObjectsList; EGameState m_eGameState; public: //override base class. void update(float dt); public: //implement interface for IGameLogic virtual void enterGame() { const char* szPlaySceneBg = config::CGameConfig::getPlaySceneBg(); m_pGameScene->setBackground(szPlaySceneBg); m_eGameState = EGS_GAME_PLAY; //获取鱼的配置信息 const std::vector<config::SFishData>& rFishs = config::CFishConfig::getFishData(); //在屏幕上显示5条鱼 for(int i = 0; i < 5; ++i){ //随机生成鱼的索引 int idx = CCRANDOM_0_1()*rFishs.size(); //根据索引值取得鱼的数据 const config::SFishData& rData = rFishs[idx]; //创建对象鱼添加到m_vecObjectsList中 createGameObject(rData); } //emit signal... to notice that game is enter succesfully. Event_EnterGameSuccessed(); } virtual void exitGame() { shutdown(); } public: bool init(CCScene* pScene); void shutdown() { //to do.. //exit. CCDirector::sharedDirector()->end(); } private: CGameObject* createGameObject(const config::SFishData& rData); void destroyGameObject(CGameObject* pObj); }; } } #endif再看创建游戏对象的实现:
CGameObject* CGameLogic::createGameObject(const config::SFishData& rData) { //根据鱼的AniID创建m_pGameScene的对象 scene::ISceneObject* pS = m_pGameScene->createObject(rData.AniID); CGameObject* pObj = new CGameObject(pS); int maxw = config::CGameConfig::getExtendSize()+480; int maxh = config::CGameConfig::getExtendSize()+320; pObj->setPosition(CCRANDOM_0_1()*maxw,CCRANDOM_0_1()*maxh); pObj->setDuration(360*CCRANDOM_0_1()); m_vecObjectsList.push_back(pObj); return pObj; }创建对象鱼:
ISceneObject* CGameScene::createObject(int tid) { //创建一个Scene的对象 CSceneObject* pObj = new CSceneObject(tid); m_vecObjectsList.push_back(pObj); pObj->getRenderObject()->setPosition(cocos2d::CCPointMake(150,150)); m_pObjectLayer->addChild(pObj->getRenderObject()); return pObj; }实现真正的渲染控制
#ifndef __RENDER_OBJECT_H__ #define __RENDER_OBJECT_H__ #include "cocos2d.h" #include "../config/AniConfig.h" namespace fishingjoy { namespace scene { class CRenderObject:public cocos2d::CCSprite { const config::CAniObjectData* mAniObjectData; public: CRenderObject(int tid) { init(); //获取鱼的动画的配置信息 mAniObjectData = config::CAniConfig::getData(tid); if(mAniObjectData){ //获取默认的动画名字即move const char* de = mAniObjectData->getDefaultAni(); //根据名字设置动画的状态 setAni(de); } } void setAni(const char* aniName) { if(mAniObjectData){ //根据动画名字从std::vector<SAniData> mAnis中查找SAniData,即查找动画的配置信息 const config::SAniData* pData = mAniObjectData->getAni(aniName); //根据动画的配置信息数据创建动画 cocos2d::CCAnimation* pAnimation = cocos2d::CCAnimation::createWithSpriteFrames(pData->Frames,pData->Delay); //运行动画,CCRepeatForever的运行 this->runAction(cocos2d::CCRepeatForever::create(cocos2d::CCAnimate::create(pAnimation))); } } public: void update(float dt) { printf("update render object\n"); } }; } } #endif
本节源代码与工程文件:【资源引用页】
大家还可以优化相关细节,可以适当增加属性和玩法(比如显示血条等等)。