转载请表明出处:http://blog.csdn.net/tim_shadow/article/details/23258203
设计模式介绍:
Cocos2dx 的设计模式大概可以类似于一部电影,包括几个部分:
1.CCDirector(大导演)
2.CCScene (场景)
3.CCLayer(层)
4.CCSprite (演员精灵)
2.CCScene (场景)
3.CCLayer(层)
4.CCSprite (演员精灵)
一个游戏(电影)一般只有一个CCDirector(大导演),CCDirector(大导演)安排每一个个的CCScene(场景),每一个CCScene(场景)都分为很多的CCLayer(层),很多的CCLayer(层)组成一个完整的CCScene(场景),在CCLayer(层)上有很多的CCSprite(演员精灵)它们有不同的样式,不同的动作,不同的位置,还有一套将他们联系到一起的一套规则,这就组成了一个完整的游戏。
CCDirector (大导演)
CCDirector(大导演)为单列模式,所以,在项目中通过
CCDirector* pDirector = CCDirector::sharedDirector();
获取的CCDirector 的引用均为同一个CCDirector对象的引用。
我们可以通过如下代码来指配CCDirector(大导演)的一些属性:
一般在Layer的init方法中添加 CCSprite (演员精灵),并且设置动作等。
//初始化CCDirector
CCDirector* pDirector = CCDirector::sharedDirector();
CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();
//设置显示视图
pDirector->setOpenGLView(pEGLView);
//设置是否显示FPS信息
pDirector->setDisplayStats(false);
//设FPS,默认为 1.0/60,表示游戏1秒钟最多刷新60次
pDirector->setAnimationInterval(1.0 / 60);
//初始化场景信息
MenuScene *pScene = MenuScene::create();
//设置初始场景
pDirector->runWithScene(pScene);
若想要切换场景,那么可以调用 以下代码:
CCDirector::sharedDirector()->replaceScene(ccScene *ccScene);
CCScene(场景)
场景的创建方式
1.直接创建:
CCScene* scene=CCScene::create();
2.自定义CCScene
自定义方法一般都会把场景中的CCLayer(层)在 CCScene::init()方法中添加到场景中
class MenuScene: public cocos2d::CCScene {
public:
virtual bool init();
//利用宏创建原生态的Create方法
CREATE_FUNC(MenuScene)
};
bool MenuScene::init() {
if (!CCScene::init()) {
return false;
}
addChild(MenuLayer::create());
return true;
}
其中 CREATE_FUNC 为Cocos2d为简化编码者的代码量,还有自动处理对象回收而定义的宏,具体定义为:
#define CREATE_FUNC(__TYPE__) \
static __TYPE__* create() \
{ \
__TYPE__ *pRet = new __TYPE__(); \
if (pRet && pRet->init()) \
{ \
pRet->autorelease(); \
return pRet; \
} \
else \
{ \
delete pRet; \
pRet = NULL; \
return NULL; \
} \
}
CCLayer(层)
层的创建方式
class MenuLayer: public cocos2d::CCLayer {
public:
virtual bool init();
//利用宏创建原生态的Create方法
CREATE_FUNC(MenuLayer)
};
bool MenuLayer::init() {
if (!CCLayer::init()) {
return false;
}
return true;
}
也可以:
class GameLayer: public cocos2d::CCLayerColor {
public:
virtual bool init();
//
CREATE_FUNC(GameLayer)
};
bool GameLayer::init() {
if (!CCLayerColor::initWithColor(ccc4(0, 0, 255, 255))) {
return false;
}
return true;
}
一般在Layer的init方法中添加 CCSprite (演员精灵),并且设置动作等。
class MenuLayer: public cocos2d::CCLayer {
public:
virtual bool init();
//利用宏创建原生态的Create方法
CREATE_FUNC(MenuLayer)
void menuStartGame(CCObject* cObj);
void menuExitGame(CCObject *cObj);
};
bool MenuLayer::init() {
if (!CCLayer::init()) {
return false;
}
CCSize visiblesize = CCDirector::sharedDirector()->getVisibleSize();
//添加开始游戏按钮
CCLabelTTF* startGameTTF = CCLabelTTF::create("Start", "Artial", 30);
startGameTTF->setColor(ccc3(0, 255, 0));
CCMenuItemLabel *startGameLabel = CCMenuItemLabel::create(startGameTTF,
this, menu_selector(MenuLayer::menuStartGame));
CCMenu* startGameMenu = CCMenu::create(startGameLabel, NULL);
startGameMenu->setPosition(
ccp(visiblesize.width/2,visiblesize.height/2+20));
addChild(startGameMenu);
//添加退出按钮
CCLabelTTF* exitGameTTF = CCLabelTTF::create("Exit", "Artial", 30);
exitGameTTF->setColor(ccc3(255, 0, 0));
CCMenuItemLabel *exitGameLabel = CCMenuItemLabel::create(exitGameTTF, this,
menu_selector(MenuLayer::menuExitGame));
CCMenu* exitGameMenu = CCMenu::create(exitGameLabel, NULL);
exitGameMenu->setPosition(ccp(visiblesize.width/2,visiblesize.height/2-20));
addChild(exitGameMenu);
return true;
}
void MenuLayer::menuStartGame(CCObject* pSender) {
CCDirector::sharedDirector()->replaceScene(GameScene::create());
}
void MenuLayer::menuExitGame(CCObject* pSender) {
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) || (CC_TARGET_PLATFORM == CC_PLATFORM_WP8)
CCMessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");
#else
CCDirector::sharedDirector()->end();
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
exit(0);
#endif
#endif
}
其中以下代码为Cocos2d的固定退出模式
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) || (CC_TARGET_PLATFORM == CC_PLATFORM_WP8)
CCMessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");
#else
CCDirector::sharedDirector()->end();
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
exit(0);
#endif
#endif