-
----------------------------------------html
-
入口類main.cpp數組
-
主要控制類AppDelegate.cpp緩存
-
----------------------------------------app
-
對象類CCObjectdom
-
節點類CCNode函數
-
----------------------------------------動畫
-
導演類CCDirectorthis
-
場景類CCScenespa
-
圖層類CCLayer設計
-
精靈類CCSprite
-
----------------------------------------
-
座標類CCPoint
-
尺寸大小類CCSize
-
矩形類CCRect
-
----------------------------------------
-
數組類CCArray
-
----------------------------------------
入口類main.cpp
這是應用程序的入口類,用於建立cocos2dx的AppDelegate實例、窗口大小、以及運行程序。
主要代碼以下:
// 建立一個主控制類AppDelegate AppDelegate app; // 使用OpenGL進行圖形渲染 CCEGLView* eglView = CCEGLView::sharedOpenGLView(); // 窗口名 eglView->setViewName("CocosStudy"); // 窗口大小 eglView->setFrameSize(480, 320); // 運行 return CCApplication::sharedApplication()->run();
主要控制類AppDelegate.cpp
遊戲的入口,用於遊戲的初始化,並建立第一個遊戲界面。
裏面有3個方法:
// 初始化 virtual bool applicationDidFinishLaunching(); // 切換到後臺 virtual void applicationDidEnterBackground(); // 切換到前臺 virtual void 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); // 建立一個場景HelloWorld,遊戲程序的第一個界面 CCScene *pScene = HelloWorld::scene(); // 運行場景 pDirector->runWithScene(pScene); return true; } // 切換到後臺 void AppDelegate::applicationDidEnterBackground() { // 暫停遊戲 CCDirector::sharedDirector()->stopAnimation(); // 暫停音樂,須要時打開 //SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic(); } // 切換到前臺 void AppDelegate::applicationWillEnterForeground() { // 遊戲恢復 CCDirector::sharedDirector()->startAnimation(); // 音樂恢復,須要時打開 //SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic(); }
在main.cpp中,咱們設置了分辨率「eglView->setFrameSize(480, 320)」(1),在這裏咱們又設置了分辨率「CCEGLView::sharedOpenGLView()->setDesignResolutionSize(480,320,kResolutionShowAll)」(2),可是它們的意義不一樣。(1)是根據咱們的指望屏幕大小設置的,(2)是設計時的遊戲分辨率,咱們最初的設計是在電腦上完成的,這個大小是在電腦上顯示的大小,可是遊戲移植到手機後,手機型號不一樣,因此後面的參數kResolutionShowAll表示按照原比例(480x320)進行縮放來適配手機屏幕。
若是圖片的大小爲1x1,setFrameSize(1, 1),那麼setDesignResolutionSize(1,1)後,即便沒有設置kResolutionShowAll,圖片也能鋪滿整個屏幕。可是,若是setFrameSize(2, 2),若是setDesignResolutionSize(2,2)後,若是沒有設置kResolutionShowAll,那麼圖片只會鋪滿屏幕的1/4,只有設置kResolutionShowAll,屏幕纔會縮放到整個屏幕。
對象類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
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
就和現實中的導演同樣,這裏的導演也是起到指導的做用的。導演在這裏負責的就是讓不一樣的場景切換,控制整個遊戲的流程,包括開始,繼續,暫停等。以及設置、獲取系統信息,好比調整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
精靈說簡單一點,其實就是一個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(); }; //