cocos2d-x 2.2建立項目node
進入cocos2d-x-2.2/tools/project-creator,運行命令python
python create_project.py -project MyGame -package com.MyCompany.AwesomeGame -language cpplinux
便可在cocos2d-x-2.2/projects下生成空白項目,進入項目中查看文件結構,主要有Class文件夾,存放源文件,Resources文件夾存放遊戲中須要的圖片、音頻和配置等資源文件,還有爲各平臺生成的proj文件夾。空項目建立後便可編譯運行,win平臺直接使用vs從proj.win32打開項目並引入依賴,F5運行。linux平臺進入proj.linux,直接bash build.sh編譯,而後進入生成的bin/debug或bin/release目錄下運行可執行文件。bash
進入Class目錄查看框架生成的文件,包括HelloWorldScene和AppDelegate,AppDelegate中主要包含3個方法:項目的初始化bool applicationDidFinishLaunching(), 項目進入後臺時的處理方法 void applicationDidEnterBackground(), 項目恢復到前臺時的處理方法 void applicationWillEnterForeground()。項目在先後臺切換時通常都是中止/恢復全部的精靈動做、背景音樂、特效音樂等。applicationDidFinishLaunching方法架構
bool AppDelegate::applicationDidFinishLaunching() { // initialize director //初始化遊戲引擎控制器CCDirector,以便啓動遊戲引擎 CCDirector* pDirector = CCDirector::sharedDirector(); CCEGLView* pEGLView = CCEGLView::sharedOpenGLView(); pDirector->setOpenGLView(pEGLView); // turn on display FPS //啓用FPS顯示 pDirector->setDisplayStats(true); // set FPS. the default value is 1.0/60 if you don't call this //設置繪製間隔,默認每秒60幀 pDirector->setAnimationInterval(1.0 / 60); // create a scene. it's an autorelease object //建立場景 CCScene *pScene = HelloWorld::scene(); // run //運行 pDirector->runWithScene(pScene); return true; }
HelloWorldScene的初始化app
CCScene* HelloWorld::scene() { CCScene *scene = CCScene::create(); HelloWorld *layer = HelloWorld::create(); scene->addChild(layer); return scene; } // 初始化 bool HelloWorld::init() { // 1. super init first if ( !CCLayer::init() ) { return false; } CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize(); CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin(); // 添加關閉按鈕,位置爲屏幕左下方 CCMenuItemImage *pCloseItem = CCMenuItemImage::create( "CloseNormal.png", "CloseSelected.png", this, menu_selector(HelloWorld::menuCloseCallback)); pCloseItem->setPosition(ccp(origin.x + visibleSize.width - pCloseItem->getContentSize().width/2 , origin.y + pCloseItem->getContentSize().height/2)); CCMenu* pMenu = CCMenu::create(pCloseItem, NULL); pMenu->setPosition(CCPointZero); this->addChild(pMenu, 1); // 建立一個label CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Arial", 24); pLabel->setPosition(ccp(origin.x + visibleSize.width/2, origin.y + visibleSize.height - pLabel->getContentSize().height)); this->addChild(pLabel, 1); CCSprite* pSprite = CCSprite::create("HelloWorld.png"); pSprite->setPosition(ccp(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y)); this->addChild(pSprite, 0); return true; }
addChild(CCNode* child,int zOrder)中參數zOrder指的是child的z軸順序,也就是顯示的前後順序,其值越大,表示顯示的位置就越靠前。框架
cocos2d-x沒有API文檔,可是自帶了不少demo,就在cocos2d-x-2.2/samples目錄下。ide
cocos2d-x的渲染樹架構動畫
任何可見的遊戲元素都派生自Cocos2d-x節點(CCNode),常見的遊戲元素有場景(CCScene)、層(CCLayer)和精靈(CCSprite)等。一般遊戲按照場景、層、精靈的層次順序組織。ui
動做(action)做用於遊戲元素,可使遊戲元素運動起來。常見的動做有移動、轉動、閃爍、消失等。動做分爲持續性動做與瞬時動做,持續性動做在一段時間內連續完成,瞬時動做會瞬間完成。在Cocos2d-x中,動做由CCAction類實現,由CCAction類派生出持續性動做類CCAction Interval和瞬時動做類CCActionInstant。全部的動做都派生自以上兩個類之一。
動畫(animation)是一種特殊的持續性動做,它只能應用於精靈上,用於實現幀動畫效果。靜止的圖片叫作幀(frame),幀的序列表明一個動畫效果。
命名空間與類名稱
Cocos2d-x擁有一個包含其餘全部頭文件的文件"cocos2d.h"。一般,咱們只須要在使用時包含這個頭文件,就可使用引擎的所有功能了。如要使用擴展類,還須要包含"cocos2d-ext.h"。可以使用引擎提供的一個宏USING_NS_CC來引用cocos2d命名空間。
Cocos2d-x不使用傳統的值類型,全部的對象都建立在堆上,而後經過指針引用。建立Cocos2d-x對象一般有兩種方法:第一種是首先使用new操做符創造一個未初始化的對象,而後調用init系列方法來初始化;第二種是使用靜態的工廠方法直接建立一個對象。
CCSprite* sprite1 = new CCSprite(); sprite1->initWithFile("HelloWorld.png"); CCSprite* sprite2 = CCSprite::spriteWithFile("HelloWorld.png"); CCSprite* sprite3 = CCSprite::create("HelloWorld.png");
選擇器
schedule_selector(SELECTOR)
callfunc_selector(SELECTOR)
callfuncN_selector(SELECTOR)
callfuncND_selector(SELECTOR)
callfunc_selector(SELECTOR)
menu_selector(SELECTOR)
event_selector(SELECTOR)
compare_selector(SELECTOR)
屬性和宏
爲每個屬性編寫一個或兩個訪問器方法是一項十分枯燥的任務,爲了不重複性的工做,Cocos2d-x提供了一系列宏來幫助咱們方便地建立屬性,它們定義在引擎目錄中的"cocos2d/platform/CCPlatformMacros.h"中。
宏 | 描述 |
CC_PROPERTY | 定義一個屬性及其訪問器,沒有實現。 |
CC_PROPERTY_READONLY | 定義一個屬性,只包含get訪問器,沒有實現 |
CC_PROPERTY_PASS_BY_REF | 定義一個屬性,訪問器使用引用類型傳 |
CC_PROPERTY_READONLY_PASS_BY_REF | 定義一個屬性,只包含get訪問器, |
CC_SYNTHESIZE | 同CC_PROPERTY,實現了訪問器方法 |
CC_SYNTHESIZE_READONLY | 同CC_PROPERTY_READONLY,實現了訪問器方法 |
CC_SYNTHESIZE_READONLY_PASS_BY_REF | 同CC_PROPERTY_READONLY_PASS_BY_REF, |
CC_SYNTHESIZE_RETAIN | 同CC_PROPERTY,實現了訪問器方法。 |
CCPlatformMacros.h中宏源碼
#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; \ } \ } #define NODE_FUNC(__TYPE__) \ CC_DEPRECATED_ATTRIBUTE static __TYPE__* node() \ { \ __TYPE__ *pRet = new __TYPE__(); \ if (pRet && pRet->init()) \ { \ pRet->autorelease(); \ return pRet; \ } \ else \ { \ delete pRet; \ pRet = NULL; \ return NULL; \ } \ } #define CC_PROPERTY_READONLY(varType, varName, funName)\ protected: varType varName;\ public: virtual varType get##funName(void); #define CC_PROPERTY_READONLY_PASS_BY_REF(varType, varName, funName)\ protected: varType varName;\ public: virtual const varType& get##funName(void); #define CC_PROPERTY(varType, varName, funName)\ protected: varType varName;\ public: virtual varType get##funName(void);\ public: virtual void set##funName(varType var); #define CC_PROPERTY_PASS_BY_REF(varType, varName, funName)\ protected: varType varName;\ public: virtual const varType& get##funName(void);\ public: virtual void set##funName(const varType& var); #define CC_SYNTHESIZE_READONLY(varType, varName, funName)\ protected: varType varName;\ public: virtual varType get##funName(void) const { return varName; } #define CC_SYNTHESIZE_READONLY_PASS_BY_REF(varType, varName, funName)\ protected: varType varName;\ public: virtual const varType& get##funName(void) const { return varName; } #define CC_SYNTHESIZE(varType, varName, funName)\ protected: varType varName;\ public: virtual varType get##funName(void) const { return varName; }\ public: virtual void set##funName(varType var){ varName = var; } #define CC_SYNTHESIZE_PASS_BY_REF(varType, varName, funName)\ protected: varType varName;\ public: virtual const varType& get##funName(void) const { return varName; }\ public: virtual void set##funName(const varType& var){ varName = var; } #define CC_SYNTHESIZE_RETAIN(varType, varName, funName) \ private: varType varName; \ public: virtual varType get##funName(void) const { return varName; } \ public: virtual void set##funName(varType var) \ { \ if (varName != var) \ { \ CC_SAFE_RETAIN(var); \ CC_SAFE_RELEASE(varName); \ varName = var; \ } \ } #define CC_SAFE_DELETE(p) do { if(p) { delete (p); (p) = 0; } } while(0) #define CC_SAFE_DELETE_ARRAY(p) do { if(p) { delete[] (p); (p) = 0; } } while(0) #define CC_SAFE_FREE(p) do { if(p) { free(p); (p) = 0; } } while(0) #define CC_SAFE_RELEASE(p) do { if(p) { (p)->release(); } } while(0) #define CC_SAFE_RELEASE_NULL(p) do { if(p) { (p)->release(); (p) = 0; } } while(0) #define CC_SAFE_RETAIN(p) do { if(p) { (p)->retain(); } } while(0) #define CC_BREAK_IF(cond) if(cond) break #define __CCLOGWITHFUNCTION(s, ...) \ CCLog("%s : %s",__FUNCTION__, CCString::createWithFormat(s, ##__VA_ARGS__)->getCString()) // cocos2d debug #if !defined(COCOS2D_DEBUG) || COCOS2D_DEBUG == 0 #define CCLOG(...) do {} while (0) #define CCLOGINFO(...) do {} while (0) #define CCLOGERROR(...) do {} while (0) #define CCLOGWARN(...) do {} while (0) #elif COCOS2D_DEBUG == 1 #define CCLOG(format, ...) cocos2d::CCLog(format, ##__VA_ARGS__) #define CCLOGERROR(format,...) cocos2d::CCLog(format, ##__VA_ARGS__) #define CCLOGINFO(format,...) do {} while (0) #define CCLOGWARN(...) __CCLOGWITHFUNCTION(__VA_ARGS__) #elif COCOS2D_DEBUG > 1 #define CCLOG(format, ...) cocos2d::CCLog(format, ##__VA_ARGS__) #define CCLOGERROR(format,...) cocos2d::CCLog(format, ##__VA_ARGS__) #define CCLOGINFO(format,...) cocos2d::CCLog(format, ##__VA_ARGS__) #define CCLOGWARN(...) __CCLOGWITHFUNCTION(__VA_ARGS__) #endif // COCOS2D_DEBUG