cocod2d-x 之 HelloWorld

  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,實現了訪問器方法。
用於派生自CCObject的類型,訪問器採起
Cocos2d-x的內存管理機制自動維護
對象的引用計數

  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
View Code
相關文章
相關標籤/搜索