1. 程式人生 > >cocos2d-js:小技巧及注意事項彙總

cocos2d-js:小技巧及注意事項彙總

以下是我使用cocos2d-js以來總結的一些經驗,如果有錯誤或更好的解決辦法還請大家指導。

1、建立EditBox後該控制元件父類上的所有控制元件位置都會被重置為(0, 0),解決辦法:(1)在建立完該控制元件的父類上的所有控制元件後開啟一次性排程器重新設定這些控制元件的位置;(2)或者在onEnter()中重新設定這些控制元件的位置;

2、如果在使用EditBox的層上新建層,新建的層會蓋不住EditBox,解決辦法:可以把兩個層建立在同一父類上,新建層後將使用EditBox的層隱藏,不能隱藏的移到螢幕外;

3、對EditBox設定setVisible(true)後它會馬上獲得焦點,並彈出輸入法。如果專案需要iOS版本,並且有對EditBox設定setPlaceHolder屬性,那麼需要再對EditBox設定setInputMode屬性,不然EditBox第一次獲得焦點時佔位符不會消失且變得異常大;

4、EditBox中的文字發生變化的響應事件為editBoxTextChanged(sender, text),在EditBox執行了setDelegate(this)後,直接在this對應的上下文中重寫該事件方法即可;

5、PageView的監聽事件和觸控事件在手機上都無效,PageView的getCurPageIndex()方法在手機上無法使用,需替換為getCurrentPageIndex() ;

6、plist檔案在哪使用就在哪載入,重複執行cc.spriteFrameCache.addSpriteFrames()也只會載入一次,不要將很多plist放在一起載入,會非常卡,特殊情況再特殊處理;

7、LayerMultiplex中的層,只在建立LayerMultiplex時初始化一次,之後進入相應層只進入onEnter(),離開進入onExit(),如果其中的層初始化的東西很多,影響載入速度了,可以設定標記控制這些層在ctor()不執行初始化程式碼,等到第一次onEnter()再執行且僅執行一次初始化程式碼;

8、判斷一個節點a是否存在,不要直接用if(a)判斷,a被建立之後即使執行removeFromParent()後這個變數依然存在,但節點已經不在了,所以需要判斷的節點在建立後執行setName("a"),用if(this.getChildByName("a"))來判斷是否存在(this代表節點a的父類)。如果不這麼做,在瀏覽器上不會出錯,打包到手機後會有問題;(有時打包後提示找不到物件,retain後才正常可能是這個原因導致)

9、場景物件中定義的全域性變數(即在ctor()上面定義的變數),使用前最好再初始化一次,不然可能下次初始化場景後這些變數卻儲存了原來的值;

10、大量使用的相似介面,可以定義一個全域性的層,要用這些介面的時候就繼承這個全域性層;

11、LabelTTF控制元件可以在字串中用\n換行,但Text控制元件不行;

12、通過cc.director.getRunningScene()可以拿到當前所在的場景;

13、Button和ImageView等控制元件setScale9Enabled(true)後無法再通過loadTextures改變圖片;

14、節點的層級關係最好可以定義一個列舉統一管理,不然到最後層級關係會容易比較亂;

15、專案中的顏色、字型等介面屬性可以定義全域性變數來統一使用或修改;

16、毫秒時間a可以通過new Date(a)來轉換,以便使用Date的各種方法;

17、ControlSwitch新增在ListView中有BUG,無法正常使用;

18、使用本地儲存時,要注意:(1)cc.sys.localStorage.setItem()的引數不要使用全域性變數;(2)判斷本地儲存是否有資料用if(cc.sys.localStorage.getItem("a")),不能用if(cc.sys.localStorage.getItem("a") != null)。不然打包到手機後會出問題,且不報錯。另外不要將emoji表情存到本地,不然讀取的時候程式程式碼會不再往下執行,如果無法避免存入emoji表情,那就在程式中自己加入異常處理,一旦讀本地儲存後程序程式碼不再往下執行,就清除本地儲存資料;

19、在Xcode中除錯時,cc.log()不會輸出,要用console.log(),但這個的引數對型別有比較多的限制,型別不符的話會報錯;

20、如果在迴圈中建立Button控制元件並定義其點選事件時,事件內如果需要使用迴圈變數的值(例如i),可使用匿名函式新增其點選事件,將i通過函式引數傳遞,例如:

(function (i) {
    button.addClickEventListener(function () {
        switch (i){
            case 0 :
                //
                break;
            default :
                //
                break;
        }
    });
})(i);

否則迴圈變數的值會因為迴圈的執行而改變,出現錯誤;

21、將層隱藏後該層不會再被渲染,對於不會經常變化又需要經常顯示和隱藏的層,可以不必每次都建立和移除,直接用setVIsible()控制就好;

22、透明遮蔽層用以下程式碼即可:

var TransparentLayer = cc.Layer.extend({
    ctor:function () {
        this._super();
        
        var listener = cc.EventListener.create({
            event: cc.EventListener.TOUCH_ONE_BY_ONE,
            swallowTouches: true,
            onTouchBegan: function (touch, event) {
                return true;
            }
        });
        cc.eventManager.addListener(listener, this);
        this._listener = listener;
    },

    onExit: function () {
        cc.eventManager.removeListener(this._listener);
        this._super();
    }
});

23、在觸控事件中判斷觸控點是否在控制元件區域內使用cc.rectContainsPoint(this._widget.getBoundingBox(), touch.getLocation());

24、很多規則圖形可以通過DrawNode畫出來,不需要使用圖片;

25、手機上預設音量調節按鈕調節鈴聲大小,只有在有聲音播放時才會變為調整媒體音量,所以如果想使一個沒有背景音樂的遊戲執行時可以調節媒體音量,就迴圈播放一個無聲音樂或者將音樂音量調節為0後迴圈播放任意一個音樂;

26、背景重複貼圖需要使用精靈,呼叫setTextureRect(cc.rect(0, 0, x, y))方法和getTexture().setTexParameters(cc.LINEAR, cc.LINEAR, cc.REPEAT, cc.REPEAT)方法,並且要注意圖片資源的寬高必須是2的n次冪;

27、使用Text控制元件時如果要改變文字的顏色,先呼叫setString()再去改變文字顏色,否則不會有變化;

28、android橫豎屏切換:

//通知android改成豎屏
jsb.reflection.callStaticMethod(className, methodName, "(Ljava/lang/String;)V", str);
var size = cc.view.getFrameSize();
cc.view.setFrameSize(size.height, size.width);
//更改解析度成豎屏的解析度
cc.view.setDesignResolutionSize(720, 1280, cc.ResolutionPolicy.SHOW_ALL);

29、字型的描邊、加粗效果可以使用自帶字型完成,無需新增字型檔案,程式碼如下:(加粗可以直接描邊使顏色與文字顏色相同即可)

        var def = new cc.FontDefinition(); // 宣告文字定義
        def.fontName = "Verdana"; // 字型
        def.fontSize = 36; // 字號大小
        def.textAlign = cc.TEXT_ALIGNMENT_CENTER; // 文字對齊
        def.fillStyle = cc.color(255, 255, 255); // 字型(內部)顏色

        def.strokeEnabled = true; // 開啟文字描邊效果
        def.strokeStyle = cc.color(0, 0, 0); // 描邊的顏色
        def.lineWidth = 3; // 字型的寬度

        def.defadowEnabled = true; // 開啟陰影效果
        def.shadowOffsetX = 12; // 陰影X軸效果
        def.shadowOffsetY = 12;

        var label = new cc.LabelTTF("文字顯示內容", def);
        label.setPosition(cc.winSize.width / 2, cc.winSize.height / 2);
        this.addChild(label);

30、使用cc.loader.loadImg(url, {isCrossOrigin: false}, function(err, img){})下載網路圖片時,img只能通過精靈載入。另外要將project.json裡的"renderMode"設定為1;

31、Button控制元件如果需要點選放大的效果,則只設置normalImage引數,不要設定selectedImage和disableImage引數即可;

32、iOS版本中可能出現每個場景中第一次聲音播放無效的問題,原因未知,解決方法可以在每個場景第一次執行播放聲音程式碼時連續執行兩次。