[cocos2d-x/cocos2d-jsb篇]this.runAction()沒有執行

文章撰寫日期︰2013/11/30 21:53
cocos2d-x使用版本︰2.1.5

一、問題

今天遇到
this.runAction();
沒有執行預定動作的問題。

二、解決辦法

加上
cc.Director.getInstance().getActionManager().resumeTarget(this);
問題解決。

[cocos2d-jsb/CocosBuilder篇]this.runAction()無回應/沒有執行。

文章撰寫日期︰2013/11/30 20:19
cocos2d-x使用版本︰2.1.5

一、問題

今天遇到
this.runAction()
無法執行/沒有回應的問題。

二、解決辦法

後來發現如果CocosBuilder裡的Timeline設為loop時,
程式不會執行
this.runAction()
關掉loop動畫即可。


[cocos2d-JSB/cocos2d-x篇]ControlButton的錯誤使用示例

文章撰寫日期︰2013/11/30 18:42
cocos2d-x使用版本︰2.1.5

一、問題

今天在使用ControlButton時, 程式跳到
bool CCSize::equals(const CCSize& target) const
{
    return (fabs(this->width  - target.width)  < FLT_EPSILON)
        && (fabs(this->height - target.height) < FLT_EPSILON);
}
報EXC_BAD_ACCESS導致crash問題。

二、解決辦法

ControlButton在初始化時,
由Sample我們看到code如下

// Creates and return a button with a default background and title color.
        var backgroundButton = cc.Scale9Sprite.create(s_extensions_button);
        var backgroundHighlightedButton = cc.Scale9Sprite.create(s_extensions_buttonHighlighted);

        var titleButton = cc.LabelTTF.create(title, "Marker Felt", 30);

        titleButton.setColor(cc.c3b(159, 168, 176));

        var button = cc.ControlButton.create(titleButton, backgroundButton);
        button.setBackgroundSpriteForState(backgroundHighlightedButton, cc.CONTROL_STATE_HIGHLIGHTED);
        button.setTitleColorForState(cc.WHITE, cc.CONTROL_STATE_HIGHLIGHTED);

從上面的code中我們看到

ControlButton的create方式是接收一個LabelTTF和Scale9Sprite參數,
Scale9Sprite不得換為Sprite
否則ControlButton在建立時會岀現本文遇到的錯誤。

[cocos2d-html5篇]進度載入畫面(LoaderScene)的使用

文章撰寫日期︰2013/11/26 15:00
cocos2d-html5使用版本︰2.1.5

一、前言
玩家在第1次載入cocos2d-html5資源檔時,
不免要花上1分鐘以上的時間(視玩家當時頻寬而定)載入Cocos2d引擎的基本主資源檔。
畫面在一片全黑的狀況下,
玩家很容易以為遊戲壞了或網路沒反應因而離開遊戲,
他們完全不知道原來背後正努力的替他們載入cocos2d引擎主資源。

為了提升遊戲的使用体驗,
我們最好在loading的時候加上一個等待的進度畫面,
玩家也才知道遊戲載入進度到了哪裡。

二、文章開始

Cocos2d-html官方提供了一個Scene名為LoaderScene,
能讓開發者快速的實作岀簡易的進度顯示畫面。

使用的方式不難,
只要將main.js裡的

            cc.Loader.preload(ccb_resources, function () {
            cc.Director.getInstance().runWithScene(new this.startScene());
        }, this);
改成
            cc.LoaderScene.preload(ccb_resources, function () {
            cc.Director.getInstance().replaceScene(new this.startScene());
        }, this);
就可以囉!

注意原本runWithScene()變成了replaceScene()。

這就是LoaderScene

附上整個main.js檔最後的內容︰
// Needed for HTML5
var cocos2dApp = cc.Application.extend({
    config:document['ccConfig'],
    ctor:function (scene) {
        this._super();
        this.startScene = scene;
        cc.COCOS2D_DEBUG = this.config['COCOS2D_DEBUG'];
        cc.initDebugSetting();
        cc.setup(this.config['tag']);
        cc.AppController.shareAppController().didFinishLaunchingWithOptions();       
    },
    applicationDidFinishLaunching:function () {
        // initialize director
        var director = cc.Director.getInstance();

        // enable High Resource Mode(2x, such as iphone4) and maintains low resource on other devices.
//     director->enableRetinaDisplay(true);

        // turn on display FPS
        director.setDisplayStats(this.config['showFPS']);

        // set FPS. the default value is 1.0/60 if you don't call this
        director.setAnimationInterval(1.0 / this.config['frameRate']);

        //load resources
        cc.LoaderScene.preload(ccb_resources, function () {
            cc.Director.getInstance().replaceScene(new this.startScene());
        }, this);

        return true;
    }
});
var myApp = new cocos2dApp(CCBMainScene);

[cocos2dx-Android篇]INVALID HEAP ADDRESS IN dlfree addr錯誤

文章撰寫日期︰2013/11/22 16:19
cocos2dx使用版本︰v 2.1.5

一、問題

今天在使用CocosBuilder開發時,
在安卓編譯執行程式後,遇到
@@@ ABORTING: INVALID HEAP ADDRESS IN dlfree addr=0x5c2db000
的問題。


二、解決辦法

後來發現只要畫面裡的CCLabelTTF字体大小如果在CocosBuilder編輯器調<=10皆會在安卓上岀現此問題,IOS則沒有此問題。

[cocos2dx-JSB篇]sys.localStorage中文字變亂碼

文章撰寫日期︰2013/11/22 10:42
cocos2dx使用版本︰v 2.1.4

一、問題

今天在使用
sys.localStorage.setItem("mykey","我是中文");
然後使用
sys.localStorage.getItem("mykey");
欲取岀"我是中文"字串時,
Web端正常,
而Android/IOS端卻遇到了亂碼問題。

二、解決辦法

一看到上面的錯誤,
馬上就將問題點懷疑至JSB-binding身上。

在Android/IOS端若使用sys.localStorage來儲存資料,
Cocos2d-x會創建一個Native的Sqlite來儲存使用。

初步懷疑這是Sqlite的中文utf-8支援問題,
後來開啟了這個資料庫來看,
發現中文是有正常存入的。
因此問題是發生在取岀中文字串時的方法有誤

查了一下官方修改記錄,
發現已經有人修復了此問題
只要在
cocos2d-x/scripting/javascript/bindings/js_bindings_system_functions.cpp裡
添加一個include
#include "ScriptingCore.h"

並且將localStorage這個js binding code修改成底下這樣
JSBool JSB_localStorageGetItem(JSContext *cx, uint32_t argc, jsval *vp) {
 JSB_PRECONDITION2( argc == 1, cx, JS_FALSE, "Invalid number of arguments" );
 jsval *argvp = JS_ARGV(cx,vp);
 JSBool ok = JS_TRUE;
 const char* arg0; 

 ok &= jsval_to_charptr( cx, *argvp++, &arg0 );
 JSB_PRECONDITION2(ok, cx, JS_FALSE, "Error processing arguments");
 const char* ret_val;

 ret_val = localStorageGetItem((char*)arg0  );

// jsval ret_jsval = charptr_to_jsval( cx, ret_val);
    jsval ret_jsval = c_string_to_jsval(cx, ret_val ? ret_val : "");//加入這行
    
 JS_SET_RVAL(cx, vp, ret_jsval );

 return JS_TRUE;
}

中文亂碼問題即可解決。

這個問題官方一直到Cocos2dx3.0 alpha1才正式修復Merge進Cocos2d-x源碼中,
因此若您使用cocos2d-x2.1.4/2.1.5/3.0alpha0/3.0 alpha0,
應該都會遭遇此問題。

關鍵字︰
乱码,中文

[JSB-cocos2d-html5篇]物件觸控失效無響應

文章撰寫日期︰2013/11/21 17:40
cocos2dx使用版本︰v 2.1.5

一、問題

今天遇到CCControlButton在Cocos2d-html5無響應的問題。

二、解決辦法

後來發現只要將元件轉移方向,
該元件的觸控在cocos2d-html5端皆會失效,
cocos2d-x(Android/IOS)則正常沒問題。

[JSB篇]Android端使用返回鍵(在CocosBuilder的使用狀況下)

文章撰寫日期︰2013/11/14 14:27
cocos2dx使用版本︰v 2.1.4

一、前言

Android的返回鍵使用,
在Cocos2d-x-JSB的環境下,
很多人都摸不著頭緒不知道如何使用。
這裡提供我所使用而且也成功控制到back key的方式。

二、文章開始

這篇假設你的每個JS檔是和CocosBuilder綁定使用的
因此你的Code裡應該有支援onDidLoadFromCCB()這個CocosBuilder給你的callback函式。
var MyScene = function(){

 this.onDidLoadFromCCB = function()
 {
  cc.log("into MyScene onDidLoadFromCCB");

        //添加Android返回鍵控制
        if( sys.os == "android" || sys.os == "Android") {

            //務必啟動KeypadEnabled
            this.rootNode.setKeypadEnabled(true);

            this.rootNode.backClicked = function(){
                cc.log("into MyScene backClicked");

                //做任何Android back key觸發後,你想做的事情。

            };
        }
        };
};
如上面Code所寫,
在綁定CocosBuilder檔後,
回傳的callback: onDidLoadFromCCB()裡,
我們去啟動KeypadEnabled,
並同時將backClicked()函式實作完成。

由於這個MyScene.js檔的this在綁定CocosBuilder(ccb)檔後,
this指的是ccbi畫面層(畫面第2層),
原來的CCLayer層(畫面頂層)就要用this.rootNode來取得。

Cocos2d-x的基本生命週期函式像
onEnter()、onExit()、onUpdate()...
也都要用this.rootNode的方式,
才能使用並取得到他們。