在CMMenuScene中,当用户点击开始游戏时,导演让场景进入到CMGameScene
class CMGameScene : public cocos2d::CCLayer,public CMReceiver { public: // there's no 'id' in cpp, so we recommend returning the class instance pointer static cocos2d::CCScene* CreateGameScene(); private: // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone virtual bool init(); // a selector callback void menuCloseCallback(CCObject* pSender); // implement the "static node()" method manually CREATE_FUNC(CMGameScene); void OnMsgReceive( int enMsg,void* pData,int nSize ); void OnCallPerFrame(float dt); void InitControlUI(); void OnMenuLeftKeyCallBack(CCObject *pSender); void OnMenuRightKeyCallBack(CCObject *pSender); void OnMenuJumpKeyCallBack(CCObject *pSender); void OnMenuFireKeyCallBack(CCObject *pSender); enum { enTagMap, enTagMenu, }; enum { enTagLeftKey, enTagRightKey, enTagJumpKey, enTagFireKey, }; void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent); void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent); void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent); void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent); };
ccTouches系列函数是触摸响应函数
onMsgReceive是自定义的消息处理函数
OnCallPerFrame是定时刷新处理函数
init函数则是该scene创建时,被回调的初始化函数
bool CMGameScene::init() { do { //super init first if (CCLayer::init()==NULL) { return false; } CMGameMap* pGameMap = CMGameMap::CreateGameMap("MarioMap1.tmx"); CC_BREAK_IF(pGameMap==NULL); pGameMap->setPosition(ccp(0,96)); addChild(pGameMap,enZOrderBack,enTagMap); //注册Update函数 this->schedule(schedule_selector(CMGameScene::OnCallPerFrame)); InitControlUI(); return true; } while (false); CCLog("Fun CMGameScene::init Error!"); return false; }
1)创建背景地图
2)注册定时回调函数
3)初始化控件
具体的细节,大家可以下载代码看,在这里大家了解框架即可。
游戏的逻辑都在OnCallPerFrame中,代码如下:
void CMGameScene::OnCallPerFrame(float dt) { do { CMGameMap* pMap = dynamic_cast<CMGameMap*>(getChildByTag(enTagMap)); CC_BREAK_IF(pMap==NULL); pMap->OnCallPerFrame(dt); //CCLog("TileType = %d",pMap->HeroPosToTileType(pHero->getPosition())); //CCLog("HeroPosX=%f HeroPosY=%f",pHero->getPositionX(),pHero->getPositionY()); return; } while (false); CCLog("fun CMGameScene::Update Error!"); }
所以CMGameScene只是个框,真正处理整个游戏逻辑的还是CMGameMap类