cocos2dx淺析幾個重要類

目錄

入口類main.cpp
主要控制類AppDelegate.cpp


對象類CCObject
節點類CCNode


導演類CCDirector
場景類CCScene
圖層類CCLayer
精靈類CCSprite


座標類CCPoint
尺寸大小類CCSize
矩形類CCRect


數組類CCArray


PS:這裏只對上述類中的相關函數進行講解,因爲函數太多,使用方法還是要通過自己在開發遊戲項目的過程中慢慢摸索練習。

入口類main.cpp
這是應用程序的入口類,用於創建cocos2dx的AppDelegate實例、窗口大小、以及運行程序。
主要代碼如下:

    // create the application instance
    AppDelegate app; //創建一個主控制類AppDelegate
    CCEGLView* eglView = CCEGLView::sharedOpenGLView(); //使用OpenGL進行圖形渲染
    eglView->setViewName("hello");                      //程序窗口標題
    eglView->setFrameSize(480, 320);                    //程序窗口分辨率大小
    return CCApplication::sharedApplication()->run();

主要控制類AppDelegate.cpp
這是遊戲程序的入口,主要用於遊戲程序的邏輯初始化,並創建運行程序的入口界面(即第一個遊戲界面場景)。
裏面有三個方法:

    applicationDidFinishLaunching();  //邏輯初始化
        applicationDidEnterBackground();  //切換到後臺
        applicationWillEnterForeground(); //切換到前臺
源碼分析:
bool AppDelegate::applicationDidFinishLaunching() { //邏輯初始化

    //初始化一個導演, 只能有一個導演
    CCDirector* pDirector = CCDirector::sharedDirector();
    //使用OpenGLView
    pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());
    //屏幕適配,設置遊戲設計的分辨率
    CCEGLView::sharedOpenGLView()->setDesignResolutionSize(480,320,kResolutionShowAll);

    //開啓狀態顯示, 幀數,精靈數等
    pDirector->setDisplayStats(false);

    //刷新頻率,每秒60幀。
    pDirector->setAnimationInterval(1.0 / 60);

    //創建一個場景Hello,這是遊戲程序的第一個界面
    CCScene *pScene = Hello::scene();

    //運行
    pDirector->runWithScene(pScene);

    return true;
}

// 切換到後臺
void AppDelegate::applicationDidEnterBackground() { 

    //暫停遊戲
    CCDirector::sharedDirector()->stopAnimation();

    // 暫停音樂
    SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
}

// 切換到前臺
void AppDelegate::applicationWillEnterForeground() { 

    //遊戲恢復
    CCDirector::sharedDirector()->startAnimation();

    //音樂恢復
    SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
}
講到這裏,大家可能會感到疑惑。爲什麼會設置了兩次分辨率大小呢?
     eglView->setFrameSize(480, 320);

        CCEGLView::sharedOpenGLView()->setDesignResolutionSize(480,320,kResolutionShowAll);
朋友們,這兩個的意義是不一樣滴。

setDesignResolutionSize 是設置了我們遊戲設計時候的分辨率,即想要適配的寬480高320的屏幕比例。也就是說設計者初衷的遊戲分辨率屏幕大小。但是對於每個用戶來說,他們使用的設備不一定是(480,320)的,比如手機有大有小。而後面的 kResolutionShowAll 參數意思是按照原比例(480/320)進行放縮以適配設備的實際屏幕。
eglView->setFrameSize(480, 320) 則是設置我們預想設備的屏幕大小,也就是應用程序窗口的大小。
以下貼了幾張對比圖,加深理解。
1、這是原圖片大小,窗口大小爲480 * 320。

這裏寫圖片描述

2、若設置窗口大小爲setFrameSize(960, 640),而不設置設計分辨率放縮比例kResolutionShowAll 的情況下,圖片不放縮,原圖還是480 * 320。

這裏寫圖片描述

3、設置了 kResolutionShowAll 之後,圖片放縮到適配整個屏幕960 * 640 了。

這裏寫圖片描述

對象類CCObject
這個類是所有類的開始,主要包含了節點的內存管理機制,內存的釋放、保留、複製等操作。
有興趣的可以自己去找資料學一下內存管理機制。
主要函數如下:

void release(void);                                   //釋放資源
void retain(void);                                    //保留資源,不被回收
CCObject* autorelease(void);                          //設置實例對象的釋放由內存管理器進行管理,實現自動釋放
CCObject* copy(void);                                 //拷貝對象
bool isSingleReference(void) const;                   //判斷對象是否只有一個使用者
unsigned int retainCount(void) const;                 //返回內存計數器,即對象的使用者個數
virtual bool isEqual(const CCObject* pObject);        //判斷是否與pObject對象相同
virtual void update(float dt) {CC_UNUSED_PARAM(dt);}; //更新函數,與scheduleUpdate()對應
friend class CCAutoreleasePool;                       //友元類,管理對象的內存使用情況
//

節點類CCNode
參考博客:http://blog.csdn.net/qiurisuixiang/article/details/8763260
CCNode類是絕大部分類的父類(並不是所有的類,例如CCDirector類是直接繼承CCObject類的),如CCScene、CCLayer、CCSprite以及精靈集合CCSpriteBatchNode等等等等的父類都是CCNode。
CCNode類包含了一些基本的屬性、節點相關、Action動作的執行、以及定時器等相關的操作。
當然CCNode也有父類,其父類爲CCObject。
繼承關係如下:
這裏寫圖片描述

主要函數如下:
/**
 *    屬性相關函數
 *    Visible , ContentSize , Position , AnchorPoint , 
 *    ZOrder , Scale , Skew , Rotation
 */

//設置節點是否可見.
virtual void setVisible(bool visible);
virtual bool isVisible();

//設置節點的尺寸大小.即節點的容器大小.
virtual void setContentSize(const CCSize& contentSize);
virtual const CCSize& getContentSize() const;

//設置節點的座標(x,y).在OpenGL中的座標
virtual void setPosition(const CCPoint &position); //傳參爲座標類CCPoint
virtual const CCPoint& getPosition();
virtual void setPosition(float x, float y);
virtual void getPosition(float* x, float* y);
virtual void  setPositionX(float x);
virtual float getPositionX(void);
virtual void  setPositionY(float y);
virtual float getPositionY(void);

//設置節點的錨點.
//錨點就像一枚圖釘,將圖片釘在屏幕上.而錨點就是圖片的座標.
//當然圖釘可以釘在圖片的左下角,右上角,或者中心都可以.
//一般由CCNode繼承的子類大多錨點都在中心,也有些是在左下角.
virtual void setAnchorPoint(const CCPoint& anchorPoint);
virtual const CCPoint& getAnchorPoint();
virtual const CCPoint& getAnchorPointInPoints();

//設置節點的Z軸.
//當有多個節點在Z軸顯示時,引擎會根據它們Z軸的大小決定繪製順序,Z軸大的會遮蓋Z軸小的
virtual void setZOrder(int zOrder);
virtual int getZOrder();

//設置節點的放縮比例.對X軸或Y軸進行放縮
//例如一張圖片. 放縮它的寬X,和高Y
virtual void setScaleX(float fScaleX);              //放縮寬X
virtual float getScaleX();
virtual void setScaleY(float fScaleY);              //放縮高Y
virtual float getScaleY();
virtual void setScale(float scale);                 //同時放縮X與Y
virtual float getScale();
virtual void setScale(float fScaleX,float fScaleY); //X放縮fScaleX倍,Y放縮fScaleY倍

//設置節點的傾斜角度.與平面的傾斜角度
//如一張圖片. X軸傾斜fSkewX角度,Y軸傾斜fSkewY角度
virtual void setSkewX(float fSkewX);
virtual float getSkewX();
virtual void setSkewY(float fSkewY);
virtual float getSkewY();

//設置節點旋轉角度.
virtual void setRotation(float fRotation);
virtual float getRotation();
virtual void setRotationX(float fRotaionX);
virtual float getRotationX();
virtual void setRotationY(float fRotationY);
virtual float getRotationY();

/**
 *    節點相關函數
 *    addChild , removeChild , setParent , removeFromParent ,
 *    reorderChild , sortAllChildren , setTag , 
 *    getCamera , isRunning , cleanup , 
 *    draw , visit , boundingBox ,
 *    onEnter , onEnterTransitionDidFinish , onExit
 */

//添加子節點.zOrder默認爲0.
//tag爲節點編號,可以通過tag獲取子節點.
virtual void addChild(CCNode * child);
virtual void addChild(CCNode * child, int zOrder);
virtual void addChild(CCNode* child, int zOrder, int tag);
virtual CCNode * getChildByTag(int tag);
virtual CCArray* getChildren();                    //獲得所有子節點,並以CCArray數組返回
virtual unsigned int getChildrenCount(void) const; //子節點個數

//刪除子節點.
virtual void removeChild(CCNode* child);
virtual void removeChild(CCNode* child, bool cleanup);
virtual void removeChildByTag(int tag);
virtual void removeChildByTag(int tag, bool cleanup);
virtual void removeAllChildren();                        //刪除所有節點
virtual void removeAllChildrenWithCleanup(bool cleanup); //cleanup爲true則刪除子節點的所有動作

//設置父節點.
virtual void setParent(CCNode* parent);
virtual CCNode* getParent();

//從父節點中移除該節點.
//Cleanup爲true則刪除當前節點的所有動作及回調函數.
virtual void removeFromParent();
virtual void removeFromParentAndCleanup(bool cleanup);

//重新設定節點的zOrder
virtual void reorderChild(CCNode * child, int zOrder);
//重新排序所有子節點
virtual void sortAllChildren();

//設置節點的tag編號
virtual void setTag(int nTag);
virtual int getTag() const;

//獲取節點的CCCamera攝像機
virtual CCCamera* getCamera();
//判斷節點是否在運行
virtual bool isRunning();
//停止所有運行的動作和回調函數
virtual void cleanup(void);

//繪製節點.
//draw裏有好多繪製方法.如直線,曲線,矩形,圓等
virtual void draw(void);
//遞歸訪問所有子節點,並重新繪製
virtual void visit(void);

//返回節點的矩形邊界框
CCRect boundingBox(void);

//節點開始進入舞臺時調用.即創建時調用.
virtual void onEnter();
//節點進入舞臺後調用.即創建完後調用.
virtual void onEnterTransitionDidFinish();
//節點離開舞臺時調用.即移除時調用
virtual void onExit();


/**
 *    Action動作相關
 *    runAction , stopAction , getActionByTag , numberOfRunningActions
 */

//執行動作
CCAction* runAction(CCAction* action);

//暫停動作
void stopAllActions(void);
void stopAction(CCAction* action);
void stopActionByTag(int tag);

CCAction* getActionByTag(int tag);         //根據tag標記獲取動作
unsigned int numberOfRunningActions(void); //獲取正在運行的動作數量


/**
 *    定時器相關函數
 *    scheduleUpdate , schedule , update
 */

//開啓默認定時器.刷新次數爲60次/秒.即每秒60幀.
//與update(float delta)回調函數相對應.
//給予定時器優先級priority.其中priority越小,優先級越高
void scheduleUpdate(void);
void scheduleUpdateWithPriority(int priority);
void unscheduleUpdate(void);      //取消默認定時器
virtual void update(float delta); //update爲scheduleUpdate定時器的回調函數.

//設置自定義定時器.默認爲每秒60幀.
//interval  :   每隔interval秒,執行一次.
//repeat    :   重複次數.
//delay     :   延遲時間,即創建定時器delay後開始執行.
void schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay);
void schedule(SEL_SCHEDULE selector, float interval);
void scheduleOnce(SEL_SCHEDULE selector, float delay); //只執行一次,delay秒後執行
void schedule(SEL_SCHEDULE selector);                  //默認爲每秒60幀
void unschedule(SEL_SCHEDULE selector);                //取消定時器

void unscheduleAllSelectors(void);                     //取消所有定時器
void pauseSchedulerAndActions(void);                   //暫停所有定時器和動作
void resumeSchedulerAndActions(void);                  //恢復所有定時器和動作
//
各個函數的作用,請自己摸索。

導演CCDirector、場景CCScene、圖層CCLayer、精靈CCSprite的概念請移步: cocos2dx基礎篇(3)——第一個程序HelloWorld
導演控制場景,場景控制圖層,圖層控制精靈,精靈控制動作。
相互之間的關係框架如下圖所示:

這裏寫圖片描述

由此看出:
    (1)整個遊戲一般只有一個導演。
    (2)一個遊戲可以由多個場景組成(菜單界面、遊戲界面、遊戲結束界面等),但是每次導演只能指導一個場景的運作。
    (3)一個場景可以由多個圖層組成(背景層、道具層、英雄層、怪物層等,每個圖層都可以由多個精靈元素組成(標籤、按鈕、菜單等)。
    (4)對於圖層上的每個精靈元素,一般都附帶相應的動作,可以帶多個動作。如揮刀、使用魔法、跑、跳,以及放大、縮小、旋轉等動作。

導演類CCDirector
參考博客:http://renpeng301.iteye.com/blog/1817548
http://blog.csdn.net/qiurisuixiang/article/details/8761191
就和現實中的導演一樣,這裏的導演也是起到指導的作用的。導演在這裏負責的就是讓不同的場景切換,控制整個遊戲的流程,包括開始,繼續,暫停等。以及設置、獲取系統信息,比如調整OpenGL相關的設置,獲取屏幕的大小等。
和CCScene、CCLayer、CCSprite等不同的是,導演類CCDirector是直接繼承CCObject類的,而不是CCNode類。
繼承關係如下:
這裏寫圖片描述

主要函數如下:
class CC_DLL CCDirector : public CCObject, public TypeInfo
{

//獲取全局唯一的CCDirector實例
//使用方法:CCDirector::sharedDirector()->replaceScene(scene);
static CCDirector* sharedDirector(void);


/**
 * 場景管理相關
 * runWithScene , pushScene , popScene , popToRootScene , replaceScene ,
 * pause , resume , end , 
 */

//指定進入Director的主循環運行的場景.
//ps:僅在運行第一個場景時調用,如果已經存在運行中的場景,不能調用本方法.
//本方法調用後將調用pushScene方法,然後調用startAnimation.
void runWithScene(CCScene *pScene);

//將運行中的場景暫停,並push到場景堆棧中,運行新的場景.
void pushScene(CCScene *pScene);

//從場景堆棧中pop出一個場景,替換現在正運行的場景,而運行中的場景將被刪除.
void popScene(void);

//從場景堆棧中pop出所有場景,最後一個棧底的場景將替換現在正運行的場景,而運行中的場景將被刪除.
void popToRootScene(void);

//使用新場景替換當前場景,而運行中的場景將被刪除.
//PS:舊場景不壓入堆棧,而是直接刪除.
void replaceScene(CCScene *pScene);

void pause(void);  //暫停場景
void resume(void); //恢復被暫停的場景
void end(void);    //終止執行,釋放運行中的場景. 而OpenGL view需要手動移除.

//獲取當前運行的場景. 導演在某一時刻只能運行一個場景
inline CCScene* getRunningScene(void) { return m_pRunningScene; }

//是否暫停
inline bool isPaused(void) { return m_bPaused; }

//場景替換時是否接收到Cleanup事件.即是否清除場景.
//若新場景是push進來的,舊場景不會接收到Cleanup事件  
//若新場景是replace進來的,舊場景會接收到Cleanup事件
inline bool isSendCleanupToScene(void) { return m_bSendCleanupToScene; }


/**
 * 刷新幀數FPS相關
 * setAnimationInterval , setDisplayStats
 */

//設置程序的FPS值. 即刷新頻率,相連兩幀的時間間隔.
//如dValue = 1.0/60.0 表示每秒60幀.
virtual void setAnimationInterval(double dValue) = 0;
inline double getAnimationInterval(void) { return m_dAnimationInterval; }

//是否在程序屏幕的左下角顯示FPS值
inline void setDisplayStats(bool bDisplayStats) { m_bDisplayStats = bDisplayStats; }
//判斷是否有顯示FPS值
inline bool isDisplayStats(void) { return m_bDisplayStats; }

//獲取每幀間隔的秒數
inline float getSecondsPerFrame() { return m_fSecondsPerFrame; }

//從CCDirector開機後,總共已經渲染了多少幀
inline unsigned int getTotalFrames(void) { return m_uTotalFrames; }


/**
 * OpenGL圖形渲染相關
 */

//設置CCEGLView.即OpenGL圖形渲染
inline CCEGLView* getOpenGLView(void) { return m_pobOpenGLView; }
void setOpenGLView(CCEGLView *pobOpenGLView);

//設置OpenGL的Projection
void setProjection(ccDirectorProjection kProjection);
inline ccDirectorProjection getProjection(void) { return m_eProjection; }

//設置OpenGL的glViewport
void setViewport();


/**
 * OpenGL View視圖相關
 */

//獲取OpenGL view的大小,單位爲點.
//類似手機屏幕的大小.參照"主要控制類AppDelegate.cpp"中的圖片.
CCSize getWinSize(void);
//獲取OpenGL view的大小,單位爲像素.
CCSize getWinSizeInPixels(void);

//獲取OpenGL View可視區域大小,單位爲點.
//類似程序的遊戲區域.參照"主要控制類AppDelegate.cpp"中的圖片.
CCSize getVisibleSize();

//獲取可視區域的原點座標.一般爲程序遊戲區域的左下角座標.
CCPoint getVisibleOrigin();

//將UIKit座標與OpenGL座標的相互轉換
//UIKit座標:原點在屏幕的左上角. 從左到右,從上到下.
//OpenGL座標:原點在屏幕的左下角.從左到右,從下到上.
CCPoint convertToGL(const CCPoint& obPoint); //轉爲GL座標
CCPoint convertToUI(const CCPoint& obPoint); //轉爲UI座標


/**
 * 其他
 */

//開始動畫
virtual void startAnimation(void) = 0; 
//停止動畫
virtual void stopAnimation(void) = 0; 

//繪製場景,每幀都會自動調用,無需手動.
void drawScene(void); 

//刪除緩存數據。包括CCTextureCache、CCSpriteFrameCache、CCLabelBMFont緩存數據
void purgeCachedData(void);

}
各個函數的作用,請自己摸索。

場景類CCScene
CCScene是繼承與CCNode類的。作爲場景類,它卻只有兩個函數init和create。因爲場景就像是一個容器,將不同的圖層(CCLayer)組合在一起,方便管理。
一個遊戲會有很多的場景,比如,主界面,遊戲界面,載入界面等等都是一個場景。而每一個場景都是由多個圖層組合在一起,形成一個完整的遊戲畫面。
其實在 cocos2dx基礎篇(3)——第一個程序HelloWorld 中就出現了CCScene的創建,以及將HelloWorld圖層放入該CCScene中。

繼承關係如下:

這裏寫圖片描述

以下爲CCScene的源碼:
class CC_DLL CCScene : public CCNode
{
public:
    CCScene();
    virtual ~CCScene();
    bool init();
    static CCScene *create(void);
};

bool CCScene::init()
{
    bool bRet = false;
     do {
         CCDirector * pDirector;
         CC_BREAK_IF( ! (pDirector = CCDirector::sharedDirector()) );
         this->setContentSize(pDirector->getWinSize());
         // success
         bRet = true;
     } while (0);
     return bRet;
}

CCScene *CCScene::create()
{
    CCScene *pRet = new CCScene();
    if (pRet && pRet->init()) {
        pRet->autorelease();
        return pRet;
    }
    else {
        CC_SAFE_DELETE(pRet);
        return NULL;
    }
}

圖層類CCLayer
CCLayer繼承於四個父類: CCNode, CCTouchDelegate, CCAccelerometerDelegate, CCKeypadDelegate。
CCLayer不僅繼承了CCNode的所有操作,還附加觸屏、重力加速度計、支持輸入功能。
一個圖層(CCLayer)可以包含多個元素,如標籤(CCLabel)、菜單(CCMenu)、精靈(CCSprite)等等。
注意:CCLayer的錨點默認爲(0,0),即左下角。並且忽略錨點的設置,即使你setAnchorPoint了錨點,CCLayer的錨點也不會改變,依然是(0,0)。
繼承關係如下:
這裏寫圖片描述

主要函數如下:
class CC_DLL CCLayer : public CCNode, public CCTouchDelegate, public CCAccelerometerDelegate, public CCKeypadDelegate
{

//創建一個靜態圖層對象
static CCLayer *create(void);

virtual void onEnter();                    //進入圖層回調函數
virtual void onExit();                     //退出圖層回調函數
virtual void onEnterTransitionDidFinish(); //場景轉換後的回調函數


/**
 * 觸屏事件相關
 * 分爲單點觸屏、多點觸屏
 * ccTouchBegan , ccTouchMoved , ccTouchEnded , ccTouchCancelled ,
 * registerWithTouchDispatcher , TouchEnabled , TouchMode , TouchPriority
 */

//單點觸屏接口的回調函數
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);     //觸屏開始
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);     //觸屏移動
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);     //觸屏結束
virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent); //觸屏取消
//多點觸屏接口的回調函數
virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent);
virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent);
virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent);
virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent);

//註冊觸屏偵聽事件
//默認是:CCTouchDispatcher::sharedDispatcher()->addStandardDelegate(this,0);
//例如:
//  void CCLayer::registerWithTouchDispatcher() {
//      CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this,INT_MIN+1,true); }
virtual void registerWithTouchDispatcher(void); 
//註冊腳本觸屏事件
virtual void registerScriptTouchHandler(int nHandler, bool bIsMultiTouches = false, int nPriority = INT_MIN, bool bSwallowsTouches = false); 
//註銷腳本觸屏事件
virtual void unregisterScriptTouchHandler(void); 

//設置是否接受觸屏
virtual void setTouchEnabled(bool value); 
virtual bool isTouchEnabled();

//設置觸屏模式. 同時響應,還是逐個響應
virtual void setTouchMode(ccTouchesMode mode);
virtual int getTouchMode();

//設置觸屏的優先級. 默認爲0,且priority越小優先級越高.
virtual void setTouchPriority(int priority);
virtual int getTouchPriority();


/**
 * 鍵盤輸入相關
 */

//設置是否接受鍵盤輸入
virtual bool isKeypadEnabled();
virtual void setKeypadEnabled(bool value);

//註冊,註銷 腳本鍵盤輸入
void registerScriptKeypadHandler(int nHandler); 
void unregisterScriptKeypadHandler(void);

//返回鍵和菜單鍵的回調函數,需要設置接收鍵盤事件
virtual void keyBackClicked(void);
virtual void keyMenuClicked(void);


/**
 * 加速度計相關. 即重力感應.
 * 類似重力加速,不同的是加速度計分別在X軸,Y軸,Z軸都有一個相應的加速度.
 * didAccelerate , registerScriptAccelerateHandler ,
 * AccelerometerEnabled , AccelerometerInterval
 */

//加速度計信息
virtual void didAccelerate(CCAcceleration* pAccelerationValue); //加速度計信息
void registerScriptAccelerateHandler(int nHandler);             //註冊加速度計
void unregisterScriptAccelerateHandler(void);                   //註銷加速度計

//設置是否接受加速度計的信息
virtual bool isAccelerometerEnabled();
virtual void setAccelerometerEnabled(bool value);
virtual void setAccelerometerInterval(double interval);         //設置加速度計的時間間隔

}

精靈類CCSprite
參考博客:http://blog.csdn.net/jackystudio/article/details/12747385
精靈說簡單一點,其實就是一個2D的圖片。並賦予圖片各種屬性以及特性。如大小、顏色、放縮、旋轉、動作等。精靈一般都是放在圖層(CCLayer)上面的,即一個圖層(CCLayer)應當有許多的精靈存在。精靈可以用來當做背景、人物、鳥、白雲等內容。
CCSprite不僅繼承了CCNode,還繼承兩個協議類:CCNodeRGBAProtocol和 CCTextureProtocol。
其中CCNodeRGBAProtocol協議類主要負責顏色的管理;而CCTextureProtocol協議類主要負責紋理圖片的管理。
注意:精靈的錨點默認爲(0.5,0.5),即中心點。
繼承關係如下:
這裏寫圖片描述

主要函數如下:
class CC_DLL CCSprite : public CCNodeRGBA, public CCTextureProtocol
{

/**
 * 創建精靈相關create
 * create , createWithTexture , 
 * createWithSpriteFrame , createWithSpriteFrameName
 */

//注意事項:
//從大圖中截取某一區域的圖片的CCRect rect的構造應該是這樣的:
//      CCRect("小圖左上角座標x", "小圖左上角座標y", 小圖寬, 小圖高)
//這與cocos2dx的座標系是不一樣的
static CCSprite* create();                                                     //默認創建空精靈對象
static CCSprite* create(const char *pszFileName);                              //圖片文件
static CCSprite* create(const char *pszFileName, const CCRect& rect);          //截取圖片文件中某一區域圖片
static CCSprite* createWithTexture(CCTexture2D *pTexture);                     //紋理圖片
static CCSprite* createWithTexture(CCTexture2D *pTexture, const CCRect& rect); //截取紋理圖片中某一區域圖片
static CCSprite* createWithSpriteFrame(CCSpriteFrame *pSpriteFrame);           //精靈幀. 精靈幀一般是從plist中讀取的
static CCSprite* createWithSpriteFrameName(const char *pszSpriteFrameName);    //精靈幀的名字


/**
 * 初始化精靈相關init
 * 一般在精靈create的時候,就會調用相對應的init函數. 
 * init , initWithTexture , 
 * initWithSpriteFrame , initWithSpriteFrameName , 
 * initWithFile
 */

virtual bool init(void);                                                               //默認初始化
virtual bool initWithTexture(CCTexture2D *pTexture);                                   //紋理圖片
virtual bool initWithTexture(CCTexture2D *pTexture, const CCRect& rect);               //截取紋理圖片中某一區域圖片
virtual bool initWithTexture(CCTexture2D *pTexture, const CCRect& rect, bool rotated); //截取紋理圖片中某一區域圖片,是否旋轉
virtual bool initWithSpriteFrame(CCSpriteFrame *pSpriteFrame);                         //精靈幀. 精靈幀一般是從plist中讀取的
virtual bool initWithSpriteFrameName(const char *pszSpriteFrameName);                  //精靈幀的名字
virtual bool initWithFile(const char *pszFilename);                                    //圖片文件
virtual bool initWithFile(const char *pszFilename, const CCRect& rect);                //截取圖片文件中某一區域圖片


/**
 * 繼承於節點類CCNode的函數
 * Scale , Position , Rotation , Skew , VertexZ
 * addChild , removeChild , reorderChild , sortAllChildren , 
 * AnchorPoint , Visible , draw
 */

virtual void setScale(float fScale);
virtual void setScaleX(float fScaleX);
virtual void setScaleY(float fScaleY);
virtual void setPosition(const CCPoint& pos);
virtual void setRotation(float fRotation);
virtual void setRotationX(float fRotationX);
virtual void setRotationY(float fRotationY);
virtual void setSkewX(float sx);
virtual void setSkewY(float sy);
virtual void setVertexZ(float fVertexZ);
virtual void addChild(CCNode *pChild);
virtual void addChild(CCNode *pChild, int zOrder);
virtual void addChild(CCNode *pChild, int zOrder, int tag);
virtual void removeChild(CCNode* pChild, bool bCleanup);
virtual void removeAllChildrenWithCleanup(bool bCleanup);
virtual void reorderChild(CCNode *pChild, int zOrder);
virtual void sortAllChildren();
virtual void setAnchorPoint(const CCPoint& anchor);
virtual void ignoreAnchorPointForPosition(bool value);
virtual void setVisible(bool bVisible);
virtual void draw(void);


/**
 * 繼承於顏色協議類CCNodeRGBA的函數
 * Color , Opacity
 */

//RGB顏色
virtual void setColor(const ccColor3B& color3);                  //設置顏色
virtual void updateDisplayedColor(const ccColor3B& parentColor); //傳遞顏色

//透明度
virtual void setOpacity(GLubyte opacity);                   //設置透明度
virtual void setOpacityModifyRGB(bool modify);              //設置透明度是否隨RGB顏色的變化而變化
virtual bool isOpacityModifyRGB(void);                      //判斷透明度是否隨RGB顏色的變化而變化
virtual void updateDisplayedOpacity(GLubyte parentOpacity); //傳遞透明度


/**
 * 繼承於紋理協議類CCTextureProtocol的函數
 * Texture , BlendFunc
 */

//設置精靈的紋理圖片
virtual void setTexture(CCTexture2D *texture);
virtual CCTexture2D* getTexture(void);

//設置顏色混合方式
inline void setBlendFunc(ccBlendFunc blendFunc) { m_sBlendFunc = blendFunc; }
inline ccBlendFunc getBlendFunc(void) { return m_sBlendFunc; }


/**
 * 批節點CCSpriteBatchNode相關的函數
 * CCSpriteBatchNode是精靈集合類,都使用同一張紋理圖片.
 * 故將這些精靈成批進行渲染,以提高渲染速度.
 */

virtual void updateTransform(void);                               //更新四個值:position(x,y), rotation, scale
virtual CCSpriteBatchNode* getBatchNode(void);                    //如果精靈是由批節點渲染的,則返回批節點
virtual void setBatchNode(CCSpriteBatchNode *pobSpriteBatchNode); //設置批節點,不推薦使用


/**
 * 紋理Texture相關的函數
 */

//設置紋理區域
virtual void setTextureRect(const CCRect& rect);
virtual void setTextureRect(const CCRect& rect, bool rotated, const CCSize& untrimmedSize);
virtual void setVertexRect(const CCRect& rect);


/**
 * 精靈幀SpriteFrames & 動畫Animation相關的函數
 *
 */

virtual void setDisplayFrame(CCSpriteFrame *pNewFrame);  //設置新的顯示精靈幀
virtual bool isFrameDisplayed(CCSpriteFrame *pFrame);    //返回精靈幀是否正在顯示
virtual CCSpriteFrame* displayFrame(void);               //返回當前顯示的精靈幀

//通過動畫幀的第frameIndex那一幀來設置顯示精靈幀
//動畫幀是從CCAnimationCache中讀取的
virtual void setDisplayFrameWithAnimationName(const char *animationName, int frameIndex);


/**
 *    屬性相關的函數
 */

//設置精靈是否需要更新
inline virtual void setDirty(bool bDirty) { m_bDirty = bDirty; }
inline virtual bool isDirty(void) { return m_bDirty; }

//返回四個值的信息:座標(x,y),頂點,顏色
inline ccV3F_C4B_T2F_Quad getQuad(void) { return m_sQuad; }

//判斷紋理是否被旋轉
inline bool isTextureRectRotated(void) { return m_bRectRotated; }

//設置精靈在地圖集TextureAtlas中的索引
inline void setAtlasIndex(unsigned int uAtlasIndex) { m_uAtlasIndex = uAtlasIndex; }
inline unsigned int getAtlasIndex(void) { return m_uAtlasIndex; }

//返回精靈區域,單位爲點
inline const CCRect& getTextureRect(void) { return m_obRect; }

//如果採用批渲染,設置紋理地圖集
inline void setTextureAtlas(CCTextureAtlas *pobTextureAtlas) { m_pobTextureAtlas = pobTextureAtlas; }
inline CCTextureAtlas* getTextureAtlas(void) { return m_pobTextureAtlas; }

//獲取偏移值
inline const CCPoint& getOffsetPosition(void) { return m_obOffsetPosition; }

//設置是否翻轉
void setFlipX(bool bFlipX);
void setFlipY(bool bFlipY);
bool isFlipX(void);
bool isFlipY(void);

};
精靈在整個遊戲中的使用應該是最頻繁的,它的功能也是最豐富的,所以需要花大把時間來摸索。

座標類CCPoint
CCPoint既可以表示座標點,又可以表示一個座標向量。
同時CCPoint對運算符進行的重載,可以很方便的完成CCPoint的賦值、加減乘除等操作。另外還有與座標向量相關的:距離、角度、點積、叉積、投影、標準化等操作。
當然cocos2dx也提供了許多有關CCPoint運算的宏定義與常量,如CCPointZero,CCPointMake,ccp,ccpAdd,ccpSub等。
CCPoint可以使一個座標點,也可以是一個座標向量。
這裏寫圖片描述

主要函數如下:
class CC_DLL CCPoint
{
public:
    float x; //X座標
    float y; //Y座標

/**
 * 構造函數
 */
CCPoint();
CCPoint(float x, float y);
CCPoint(const CCPoint& other);
CCPoint(const CCSize& size);

/**
 * 運算符重載
 * 直接像int型一樣相加減.如 p3 = p1 + p2
 */
CCPoint& operator= (const CCPoint& other);     //(other.x , other.y)
CCPoint& operator= (const CCSize& size);       //(size.width , size.height)
CCPoint operator+(const CCPoint& right) const; //(x1+x2 , y1+y2)
CCPoint operator-(const CCPoint& right) const; //(x1-x2 , y1-y2)
CCPoint operator-() const;                     //(-x , -y)
CCPoint operator*(float a) const;              //(x*a , y*a)
CCPoint operator/(float a) const;              //(x/a , y/a)

/**
 * CCPoint的相關函數
 * setPoint , forAngle , equals , fuzzyEquals ,
 * getLength , getDistance , getAngle , getPerp , rotateByAngle , 
 * dot , cross , project , normalize ,
 * rotate , unrotate , lerp
 */

//設置座標
void setPoint(float x, float y);

//根據角度,計算向量座標x=cos(a) , y=sin(a)
//這是一個static靜態函數
static inline CCPoint forAngle(const float a) { return CCPoint(cosf(a), sinf(a)); }

//判斷是否與target相等
bool equals(const CCPoint& target) const;

//判斷target是否在座標點模糊偏差爲var的範圍內.
//if( (x - var <= target.x && target.x <= x + var) && 
//    (y - var <= target.y && target.y <= y + var) ) 
//      return true;
bool fuzzyEquals(const CCPoint& target, float variance) const;

//與原點的距離
//與原點的距離平方,即x*x + y*y.
//與other的距離
//與other的距離平方
inline float getLength() const { return sqrtf(x*x + y*y); };
inline float getLengthSq() const { return dot(*this); };
inline float getDistance(const CCPoint& other) const { return (*this - other).getLength(); };
inline float getDistanceSq(const CCPoint& other) const { return (*this - other).getLengthSq(); };

//與X軸的夾角; 與other向量的夾角. 單位爲:弧度
inline float getAngle() const { return atan2f(y, x); };
float getAngle(const CCPoint& other) const;

//Perp逆時針旋轉90度; RPerp順時針旋轉90度
inline CCPoint getPerp() const { return CCPoint(-y, x); };
inline CCPoint getRPerp() const { return CCPoint(y, -x); };

//以pivot爲圓心,將座標逆時針旋轉angle度
CCPoint rotateByAngle(const CCPoint& pivot, float angle) const;

//計算兩點的 "點積dot" 和 "叉積cross"
inline float dot(const CCPoint& other) const { return x*other.x + y*other.y; };
inline float cross(const CCPoint& other) const { return x*other.y - y*other.x; };

//向量在other上的投影向量
//公式參考: http://www.cnblogs.com/graphics/archive/2010/08/03/1791626.html
inline CCPoint project(const CCPoint& other) const { return other * (dot(other)/other.dot(other)); };

//向量標準化,即長度爲1. PS: 如果是零向量,返回(1,0);
inline CCPoint normalize() const {
    float length = getLength();
    if(length == 0.0) return CCPoint(1.0f, 0);
    return *this / getLength();
};

/**
 * 未知函數
 */

//複合乘法???
//angle = this.getAngle() + other.getAngle()
//length = this.getLength() * other.getLength()
inline CCPoint rotate(const CCPoint& other) const { 
    return CCPoint(x*other.x - y*other.y, x*other.y + y*other.x); 
};

//反覆合乘法???
//angle = this.getAngle() - other.getAngle()
//length = this.getLength() * other.getLength()
inline CCPoint unrotate(const CCPoint& other) const { 
    return CCPoint(x*other.x + y*other.y, y*other.x - x*other.y); 
};

//線性內插法???
inline CCPoint lerp(const CCPoint& other, float alpha) const {
    return *this * (1.f - alpha) + other * alpha;
};

};

尺寸大小類CCSize
CCSize比較簡單,只是一個用來表示尺寸大小的類。寬爲width,高爲height。
和CCPoint一樣,也對運算符進行了重載。
目前好像就找到兩個宏定義與常量:CCSizeMake 和 CCSizeZero。
主要函數如下:

class CC_DLL CCSize
{
public:
    float width;  //寬度
    float height; //高度

/**
 * 構造函數
 */
CCSize();                          //(0 , 0)
CCSize(float width, float height); //(width , height)
CCSize(const CCSize& other);       //(other.width , other.height)
CCSize(const CCPoint& point);      //(point.x , point.y)

/**
 * 運算符重載
 * 直接像int型一樣相加減.如 p3 = p1 + p2
 */
CCSize& operator= (const CCSize& other);     //this = other
CCSize& operator= (const CCPoint& point);    //width=point.x , height=point.y
CCSize operator+(const CCSize& right) const; //width+right.width , height+right.height
CCSize operator-(const CCSize& right) const; //width-right.width , height-right.height
CCSize operator*(float a) const;             //width*a , height*a
CCSize operator/(float a) const;             //width/a , height/a

/**
 * CCSize的相關函數
 * setSize , equals
 */

//設置尺寸大小
void setSize(float width, float height);

//判斷兩尺寸是否相等
bool equals(const CCSize& target) const;

};

矩形類CCRect
CCRect是一個矩形類。包含:起始座標(左下角座標)CCPoint、矩陣的尺寸大小CCSize兩個屬性。
CCRect只對“=”運算符進行了重載。目前好像就找到兩個宏定義與常量:CCRectMake,CCRectZero。
值得注意的是CCRect類中:
intersectsRect函數,可以用作兩個CCRect矩形是否相交,即碰撞檢測。
containsPoint 函數,可以用作判斷點CCPoint是否在CCRect矩形中。
這裏寫圖片描述

若用CCRect來作爲創建CCSprite精靈的參數,需要注意,從大圖中截取某一區域的圖片的CCRect rect的構造應該是這樣的:
CCRect("小圖左上角座標x", "小圖左上角座標y", 小圖寬, 小圖高);
這與cocos2dx的座標系是不一樣的。
如下圖所示:

這裏寫圖片描述

主要函數如下:
class CC_DLL CCRect
{
public:
    CCPoint origin; //起始座標: 左下角座標
    CCSize  size;   //尺寸大小

/**
 * 構造函數
 */
CCRect();
CCRect(float x, float y, float width, float height);
CCRect(const CCRect& other);


/**
 * 運算符重載
 * 只重載了 “=” 運算符
 */
CCRect& operator= (const CCRect& other);


/**
 * CCRect的相關函數
 * setRect , getMinX , getMidX , getMaxX
 * equals , containsPoint , intersectsRect
 */

//設置矩形
void setRect(float x, float y, float width, float height);

//
float getMinX() const; //origin.x
float getMidX() const; //origin.x + size.width/2
float getMaxX() const; //origin.x + size.width
float getMinY() const; //origin.y
float getMidY() const; //origin.y + size.height/2
float getMaxY() const; //origin.y + size.height

//判斷是否與rect相同. 原點相同,尺寸相同.
bool equals(const CCRect& rect) const;

//判斷point是否包含在矩形內或四條邊上
bool containsPoint(const CCPoint& point) const;

//判斷矩形是否相交. 常常用作碰撞檢測.
bool intersectsRect(const CCRect& rect) const;

};

數組類CCArray
繼承於CCObject類,本質是將ccArray相關的函數操作進行了封裝處理。對於ccArray有興趣的自己瞭解一下。
宏定義:
CCARRAY_FOREACH(CCArray* arr, CCObject* obj); //遍歷CCArrray數組
CCARRAY_FOREACH_REVERSE(CCArray* arr, CCObject* obj); //逆序遍歷
CCArray類終點數據類型爲ccArray:

typedef struct _ccArray {
    unsigned int num; //元素個數
    unsigned int max; //數組容量. 和num不一樣,一般max>=num.
    //二重指針,相當於是指向 CCobject*數組 的指針.
    //每個元素用arr[i]來讀取,這是一個指向第i個索引的CCObject*
    CCObject** arr; 
} ccArray;
當然在我們添加元素的時候,不一定非是CCObject類型不可,可以是其他類型,如CCNode。
CCArray類的主要函數如下:
class CC_DLL CCArray : public CCObject
{
public:
    ccArray* data; //元素是一個ccArray類型

public:

/**
 *     構造、創建、初始化函數
 *     CCArray , create , init
 */

//構造函數
CCArray();
CCArray(unsigned int capacity);

//創建函數
static CCArray* create();
static CCArray* create(CCObject* pObject, ...);
static CCArray* createWithObject(CCObject* pObject);
static CCArray* createWithCapacity(unsigned int capacity);
static CCArray* createWithArray(CCArray* otherArray);
//通過plist文件導入數組
static CCArray* createWithContentsOfFile(const char* pFileName);
//同上. 但不設置autorelease自動釋放內存,需要手動調用release()釋放
static CCArray* createWithContentsOfFileThreadSafe(const char* pFileName);

//初始化函數
bool init();
bool initWithObject(CCObject* pObject);
bool initWithObjects(CCObject* pObject, ...);
bool initWithCapacity(unsigned int capacity);
bool initWithArray(CCArray* otherArray);

/**
 *     查詢
 *     count , capacity ,
 *     indexOfObject , objectAtIndex , lastObject , randomObject , 
 *     containsObject , isEqualToArray
 */

unsigned int count() const;    //元素個數
unsigned int capacity() const; //數組容量

//用元素查找的索引(下標從0開始). 
//若不存在,返回無符號整形最大值UINT_MAX=0xFFFFFFFF
unsigned int indexOfObject(CCObject* object) const;
//用索引查找元素
CCObject* objectAtIndex(unsigned int index); 

CCObject* lastObject();                      //返回最後一個元素
CCObject* randomObject();                    //返回隨機一個元素
bool containsObject(CCObject* object) const; //判斷object是否存在於CCArray中
bool isEqualToArray(CCArray* pOtherArray);   //兩數組每個索引位置上的元素是否全部相同

/**
 *     添加刪除元素
 *     addObject , insertObject
 *     removeObject , fastRemoveObject , removeAllObjects
 */

//添加元素
void addObject(CCObject* object);
void addObjectsFromArray(CCArray* otherArray);
void insertObject(CCObject* object, unsigned int index);

//刪除元素. bReleaseObj表示是否釋放資源
//被刪除的元素後面的元素都往前挪動一個位置
void removeLastObject(bool bReleaseObj = true);                        //刪除最後一個元素
void removeObject(CCObject* object, bool bReleaseObj = true);          //刪除object元素
void removeObjectAtIndex(unsigned int index, bool bReleaseObj = true); //刪除索引爲index的元素
void removeObjectsInArray(CCArray* otherArray);                        //刪除與otherArray數組中相同的所有元素

//快速刪除元素.
//和普通刪除不同的是: 只將最後一個元素覆蓋被刪除的元素,不進行元素挪動
void fastRemoveObject(CCObject* object);          //快速刪除object元素
void fastRemoveObjectAtIndex(unsigned int index); //快速刪除索引爲index的元素

//刪除所有元素
void removeAllObjects(); 

/**
 *     重排數組
 *     exchangeObject , replaceObjectAtIndex
 *     reverseObjects , reduceMemoryFootprint
 */

//交換兩個元素的位置
void exchangeObject(CCObject* object1, CCObject* object2);
void exchangeObjectAtIndex(unsigned int index1, unsigned int index2);

//用pObject替換索引爲index的元素
void replaceObjectAtIndex(unsigned int uIndex, CCObject* pObject, bool bReleaseObject = true);

//將數組元素反序, a b c d --> d c b a.
void reverseObjects();

//縮小內存,將內存縮小爲 max = num
void reduceMemoryFootprint();

};

轉載網址:http://blog.51cto.com/shahdza/1539567

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章