1,闡述cocos2d-x 中CCScene CCLayer CCSprite CCNode
CCScene:
CCScene是app工作流程上獨立塊,一個app可能擁有多個scene,但是在任何時候只能有一個是激活狀態的。一個CCScene對象由一個或多個CCLayer組成,layer之間是前後相連的。Layer提供了scene的外觀和行爲。通常的用法是直接用一個或多個layer實例化一個scene
CCScene的子類CCTrasitionScene實現移動transitions,提供兩個scene之間的轉移效果,由於scene是CCNode的子類,所以scene可以手工或者用aciton來轉變座標。所有層和精靈都是他的(子節點)children。
CCScene的4個基本方法:
runWithScene(運行畫面),
replaceScene(替換場景 例如從主菜單進入遊戲界面),
pushScene(暫停界面),
popScene(從暫停的界面還原到遊戲界面)
Layers:
CCLayer同樣是CCNode的子類,通常用addChild方法添加子節點。
CCLayer對象定義了可描繪的區域,定義了描繪的規則。CCLayer可以實現半透明的效果,
層的事件相應機制 : 最外層最先接受到事件(屏幕觸碰),最後是底層,如果在某層處理了該事件,則後面的層不會在接受到事件信號
Sprites
cocos2d的sprite對象就是一個可以移動、選擇、伸縮、動畫的2d圖形,CCSprite 對象的子成員中可以包含其它的CCSprite 對象。當CCSprite 對象轉換座標系的時候,它所包含的CCSprite 對象也會轉換轉換座標系。sprites是CCNode 的子類, 所以他們也可以使用actions來轉換座標.
See Actions for more detail about actions.
CCNode是場景、層、菜單、精靈等所有節點的父類,它是一個抽象類,沒有可視化表示形式,定義了所有node共有的屬性和方法。
2,說一下CCAction和CCActionMessager
CCAction是動作的基類,主要使用CCFiniteTimeAction有限次動作執行,就是按時間順序執行一系列動作,執行完後動作結束;
CCFiniteTimeAction又分爲CCActionInstanse(瞬時動作的基類)和CCActionInterval(延時動作的基類)。CCActionInstanse:沒什麼特別,跟CCActionInterval主要區別是沒有執行過程,動作瞬間就執行完成了;CCActionInterval:執行需要一定的時間(或者說一個過程)。我們用的最多的就是延時動作,下面對它進行單獨介紹。
CCActionMessage是管理所有Action的單例,一般情況下並不直接使用這個單例,而是使用CCNode的接口,但是假如你想操作的目標不是CCNode的子類或者你想暫停/恢復行動就要使用到CCActionMessager
3,你常用的cocos2d-x工具
TiledMap (地圖編輯器)ParticleEditor(粒子編輯器)cocosBuilder(可視化編輯)Texture Packer(圖片組合工具)等
4,簡述:CCDirector CCEGLView CCEGLViewProtocol
CCDirector是singleton模式的共享的對象。它知道當前哪個scene是激活。 CCDirector以stack的方式處理scenes的調用(當另一個scene進入的時候,暫停當前的scene,完成之後再返回原來的 scene),CCDirector 負責更換CCScene,在CCLayer 被push的時候,更換或結束當前的scene。另外:CCDirector 負責初始化OpenGL ES。
作用:
1.訪問和改變場景
2.訪問cocos2d的配置細節
3.訪問視圖,(openGL, UIView, UIWindow)
4.暫停,恢復和結束遊戲
5.在UIKit和OpenGL之間轉換座標
CCEGLView是CCEGLViewProtocol的子類,是用於屏幕適配(這個問題還沒全解決啊)
5,簡述CCSpriteframeCache CCSpriteBatchNode,並說出CCNode,CCSprite是如何實現繪製的?
CCSpriteFrameCache 緩存了所有CCSpriteFrame. 可以一下方式獲取特定frame並設定給Sprite. 前提是文件已經緩存
CCSpriteBatchNode 中的所有CCSprite只會被渲染1次,因此可以提高遊戲的FPS。
限制:加入到 CCSpriteBatchNode 中的CCSprite必須使用同一張紋理圖。
比如遊戲中的子彈就很適合用它,因爲子彈都是一個樣子。通過TexturePacker生成的紋理圖也適合使用它。
(第二問不會)
6,cocos2d-x的屏幕適配解決方案
Cocos2d-x2.0.4之後
pEGLView->setDesignResolutionSize(480, 320, kResolutionNoBorder);第三個參數,找到定義:
講得很清楚了:
kResolutionExactFit:會靠拉伸來填滿屏幕,本例來說背景圖會變形來填充屏幕,因爲1024:768=1.3, 480:320=1.5,寬高比不同,圖片也就無法等比縮放來填滿屏幕,只能變形了。
kResolutionNoBorder: 看不到黑邊,實際就是寬高等比縮放,但縮放比例取寬比和高比之中大的那一個。
kResolutionShowAll:全部顯示,可以理解爲保證內容都顯示在屏幕之內,實際也是寬高等比縮放,但縮放比例取寬比和高比之中小的那一個。
一般來說,我們希望設計時一屏的內容,用戶在實際設備上也能在一屏內看到,拿本例來說,1024x768分辨率時,右下角的按鈕卻跑到屏幕外去了。看完上面的分析,你應該知道如何解決了: 對了,改變pEGLView->setDesignResolutionSize(480, 320, kResolutionNoBorder);第三個參數爲kResolutionShowAll。
7,cocos2d-x聊天的實現,對話框 字符集字體描邊 輸入法
8,cocos2d-x遊戲儲存
CCUserDefault和SQList
CCUserDefalt存在的的問題
1.沒有記錄和表的概念
你會發現,如果要設置多存檔,必須自己操作,而且代碼會變得複雜,容易出錯。
對於簡單的遊戲可以使用CCUserDefalt,但是對於複雜遊戲,可以考慮使用SQLite。
2.沒有數據類型安全
比如,如果你錯寫把一個Integer按Bool讀取,是沒有錯誤提示的
3.沒有存檔數據完整性的校驗
我們找到之前的存檔記錄,用CCUserDefault::getXMLFilePath()可以獲得存檔位置,打開它
9,cocos2d-x內存管理
cocos2d-x最初移植自cocos2d的objective C版本。因此,在內存管理上,使用了和NSObject類似的引用計數器方法,相關接口放置在CCObject類中。
引用計數器——手動管理內存
CCObject的及其子類的對象在創建時,引用計數自動設置爲1。之後每次調用retain,引用計數+1。每次調用release,引用計數-1;若引用計數=0,則直接delete this。
retain是在指針傳遞和賦值時使用的,他的含義是表示擁有。這經常用在指針賦值上。
自動釋放池——自動管理內存
對於使用autorelease的對象,不必管它,每幀結束後會自動釋放。
CCNode節點管理
cocos2d-x使用節點組成一棵樹,渲染的時候要遍歷這棵樹。CCNode是所有節點類的父類,他內部使用了一個CCArray對象管理他的所有子節點,當對象被添加爲子節點時,實際上是被添加到CCArray對象中,同時會調用這個對象的retain方法。同理,從CCArray中移除時,也會調用release方法。
靜態工廠
cocos2d-x中存在大量的靜態工廠方法,這些方法中,全都對this指針調用了autorelease函數。
cache機制類
cache內部也使用了ratain和release方法,防止這些資源被釋放掉。
使用這些cache,我們可以保存預加載的一些資源,在方便的時候調用它,去綁定給一些對象。注意,這些cache在場景切換時,不會自動刪除,需要手動調用purgeXXXX方法,進行清理。
10,用cocos2d-x繪製一個三角形,並計算面積命名