天天看點

cocos2d-x面試題

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工具

4,簡述:CCDirector CCEGLViewCCEGLViewProtocol

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聊天的實作,對話框 字元集 字型描邊 輸入法

CCUserDefault和SQList

CCUserDefalt存在的的問題

1.沒有記錄和表的概念

你會發現,如果要設定多存檔,必須自己操作,而且代碼會變得複雜,容易出錯。

對于簡單的遊戲可以使用CCUserDefalt,但是對于複雜遊戲,可以考慮使用SQLite。

2.沒有資料類型安全

比如,如果你錯寫把一個Integer按Bool讀取,是沒有錯誤提示的

3.沒有存檔資料完整性的校驗

我們找到之前的存檔記錄,用CCUserDefault::getXMLFilePath()可以獲得存檔位置,打開它

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方法,進行清理。

本文轉蓬萊仙羽51CTO部落格,原文連結:http://blog.51cto.com/dingxiaowei/1366268,如需轉載請自行聯系原作者

繼續閱讀