cocos2相關的題目

1,闡述cocos2d-x 中CCScene CCLayer CCSprite CCNode

CCScene

CCSceneapp工作流程上獨立塊,一個app可能擁有多個scene,但是在任何時候只能有一個是激活狀態的。一個CCScene對象由一個或多個CCLayer組成,layer之間是前後相連的。Layer提供了scene的外觀和行爲。通常的用法是直接用一個或多個layer實例化一個scene

CCScene的子類CCTrasitionScene實現移動transitions,提供兩個scene之間的轉移效果,由於sceneCCNode的子類,所以scene可以手工或者用aciton來轉變座標。所有層和精靈都是他的(子節點)children

CCScene的4個基本方法:

runWithScene(運行畫面),

replaceScene(替換場景 例如從主菜單進入遊戲界面),

pushScene(暫停界面),

popScene(從暫停的界面還原到遊戲界面)

 

Layers

CCLayer同樣是CCNode的子類,通常用addChild方法添加子節點。

CCLayer對象定義了可描繪的區域,定義了描繪的規則。CCLayer可以實現半透明的效果,

層的事件相應機制 : 最外層最先接受到事件(屏幕觸碰),最後是底層,如果在某層處理了該事件,則後面的層不會在接受到事件信號

Sprites
cocos2dsprite對象就是一個可以移動、選擇、伸縮、動畫的2d圖形,CCSprite 對象的子成員中可以包含其它的CCSprite 對象。當CCSprite 對象轉換座標系的時候,它所包含的CCSprite 對象也會轉換轉換座標系。spritesCCNode 的子類所以他們也可以使用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

CCDirectorsingleton模式的共享的對象。它知道當前哪個scene是激活。 CCDirectorstack的方式處理scenes的調用(當另一個scene進入的時候,暫停當前的scene,完成之後再返回原來的 scene),CCDirector 負責更換CCScene,CCLayer push的時候,更換或結束當前的scene。另外:CCDirector 負責初始化OpenGL ES

作用:

1.訪問和改變場景

2.訪問cocos2d的配置細節

3.訪問視圖,(openGL, UIView, UIWindow

4.暫停,恢復和結束遊戲

5.UIKitOpenGL之間轉換座標

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.沒有數據類型安全

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

3.沒有存檔數據完整性的校驗

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

 

 

9,cocos2d-x內存管理

cocos2d-x最初移植自cocos2dobjective 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內部也使用了ratainrelease方法,防止這些資源被釋放掉。

使用這些cache,我們可以保存預加載的一些資源,在方便的時候調用它,去綁定給一些對象。注意,這些cache在場景切換時,不會自動刪除,需要手動調用purgeXXXX方法,進行清理。

 

 

10,用cocos2d-x繪製一個三角形,並計算面積命名

 

11,UI不能模態解決方案

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