顯示具有 bug 標籤的文章。 顯示所有文章
顯示具有 bug 標籤的文章。 顯示所有文章

[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,
應該都會遭遇此問題。

關鍵字︰
乱码,中文

[cocos2dx - 3.0篇]Bug List

文章撰寫日期︰2013/09/20 14:29
cocos2dx使用版本︰v 3.0 alpha 0
cocosBuilder使用版本︰v3.0 alpha5

底下列出cocos2dx3.0 pre-alpha0在使用上遇過的BUGs,我使用JSB做為開發工具。

[cocos2dx端]

1. 在Samsung S(i9000)無法繪製cocos2dx view,螢屏全黑。
顯示錯誤log如下:
W/cocos2dx/nativeactivity.cpp(7186)engine_draw_frame : No display.

[JSB端]

1. 粒子系統繪製有問題

2. CCEditBox在Android端會crash(Android 4.1.2 Saumsung SII)
3. XMLHttpRequest無法使用BufferArray。
4. 針對CocosBuilder裡的Node做setContentSize()產生未預期效果。
5. 目前還沒有下載網路端文字以外資源的實際方法。

[HTML5端]

1. CCEditBox在Web上使用getText(),
如果CCEditBox為空時,會取到PlaceHolder字串。
2. CocosBuilder 3.0 alpha5 使用Timeline上的callback,
在HTML5上接收無響應。
3. CCLabelTTF設定Dimensions時,斷行方式僅會以"\n"或遇到空白時才斷行。
4. CCSprite沒有getTexture()方法。

[cocos2dx-JSB篇]callbackNode.setCallback is not a function錯誤

文章撰寫日期︰2013/08/28 11:48
cocos2dx使用版本︰v 2.1.4
cocosBuilder使用版本︰v 3.0 alpha 5

一、問題

今天在Cocos2d-x2.1.4使用JSB,
cocosBuilder上使用CCControlButton這個Extension元件時,
回報我callbackNode.setCallback is not a function的錯誤。

二、解決辦法

cocos2dx2.1.4版還沒有針對CCControlButton做JSB Binding的支援,
如果要使用的同鞋,
建議直接放棄2.1.4版,
不然就是不要使用CCControlButton這個元件...

因為我曾試過要修改2.1.4版做CCControlButton的Binding,
但改版工程實在太皓大...

下列是改版工程動到的Code...
CCControlButton異動部份

=====JSB Biding端====
scripting/javascript/bindings/jsb_cocos2dx_extension_manual.cpp
scripting/javascript/bindings/js_bindings_config.h
scripting/javascript/bindings/js/jsb_cocos2d_extension.js
scripting/javascript/bindings/ScriptingCore.h
scripting/javascript/bindings/ScriptingCore.cpp
scripting/javascript/bindings/js/jsb_cocosbuilder.js
scripting/javascript/bindings/cocos2d_specifics.cpp

extensions/GUI/CCControlExtension/CCControl.cpp


=====觸控事件=====
extensions/CCBReader/CCBAnimationManager.h

extensions/CCBReader/CCBAnimationManager.cpp
extensions/CCBReader/CCBReader.cpp
extensions/CCBReader/CCBReader.h
extensions/CCBReader/CCNodeLoader.cpp

如果仍要改的同鞋,
我提供github上的參考連結︰
1. 官網討論串
2. dumganhar(James Chen)針對cocos2dx3.0版的Binding修改記錄

三、總結

cocos2d-x2.1.4版在C++端趨於成熟,
而在JSB端像個初生兒...

[cocos2dx-JSB篇]javascript裡使用XmlHttpRequest中文顯示成亂碼問題

文章撰寫日期︰2013/08/21 11:38
cocos2dx使用版本︰v 2.1.4
cocosBuilder使用版本︰v 3.0 alpha 5

一、問題

這幾天遇到了使用XMLHttpRequest元件時,
C++傳來的UTF-8格式中文字到Javascript端產生亂碼,
但英文、數字沒問題的BUG。


二、解決辦法

PO文到官網論壇,
網友建議重新編制成BASE64碼,
後來經cocos2dx開發者James Chen協助下,
我修改了XMLHttpRequest.CPP檔,
讓中文從C++端傳給Javascript端得以正常顯示。

[cocos2dx篇]CCLayerColor沒有顯示

文章撰寫日期︰2013/08/08 17:51
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

今天遇到在cocosBuilder裡使用CCLayerColor,
但在畫面上卻沒有顯示的問題。

二、解決辦法

經爬文後發現cocos2dx\layers_scenes_transitions_nodes\CCLayer.cpp底下
init()有問題。

原本的Code︰
bool CCLayerColor::init()
{
    CCSize s = CCDirector::sharedDirector()->getWinSize();
    return initWithColor(ccc4(0,0,0,0), s.width, s.height);
}
需改成
bool CCLayerColor::init()
{
    CCSize s = CCDirector::sharedDirector()->getWinSize();
    return initWithColor(ccc4(0,0,0,255), s.width, s.height);
}
問題解決。

[cocosBuilder篇]CocosBuilder設定Sprite為invisible無效

文章撰寫日期︰2013/04/14 16:00
文章修改時間︰2013/06/30 09:52
文章撰寫日期︰文章修改次數︰2
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

今天在使用cocosBuilder時,
執行程式遇到了unsupported property now的錯誤。


二、解決辦法

我使用的
cocosBuilder版本為2.1
cocos2d-x版本為2.0.4

原來是因為這一版的CCBReader(cocos2d-x官方內建的cocosBuilder解析器),
官方忘了將物件visible的屬性判斷寫進來。

只要在libs\extentions\CCBReader\CCBAnimationManager.cpp的setAnimatedProperty函式
加上以下的code即可解決
            //加入以下的code
            else if (strcmp(pPropName, "visible") == 0)
            {
                bool visible = ((CCBValue*)pValue)->getBoolValue();
                ((CCSprite*)pNode)->setVisible(visible);
            }
這是cocos2d-x 2.0.4版CCBAnimationManager.cpp->setAnimatedProperty函式最後的樣子
void CCBAnimationManager::setAnimatedProperty(const char *pPropName, CCNode *pNode, CCObject *pValue, float fTweenDuraion)
{
    if (fTweenDuraion > 0)
    {
        // Create a fake keyframe to generate the action from
        CCBKeyframe *kf1 = new CCBKeyframe();
        kf1->autorelease();
        kf1->setValue(pValue);
        kf1->setTime(fTweenDuraion);
        kf1->setEasingType(kCCBKeyframeEasingLinear);
        
        // Animate
        CCActionInterval *tweenAction = getAction(NULL, kf1, pPropName, pNode);
        pNode->runAction(tweenAction);
    }
    else 
    {
        // Just set the value
        
        if (strcmp(pPropName, "position") == 0)
        {
            // Get position type
            CCArray *array = (CCArray*)getBaseValue(pNode, pPropName);
            int type = ((CCBValue*)array->objectAtIndex(2))->getIntValue();
            
            // Get relative position
            CCArray *value = (CCArray*)pValue;
            float x = ((CCBValue*)value->objectAtIndex(0))->getFloatValue();
            float y = ((CCBValue*)value->objectAtIndex(1))->getFloatValue();
            
            pNode->setPosition(getAbsolutePosition(ccp(x,y), type, getContainerSize(pNode->getParent()), pPropName));
        }
        else if (strcmp(pPropName, "scale") == 0)
        {
            // Get scale type
            CCArray *array = (CCArray*)getBaseValue(pNode, pPropName);
            int type = ((CCBValue*)array->objectAtIndex(2))->getIntValue();
            
            // Get relative scale
            CCArray *value = (CCArray*)pValue;
            float x = ((CCBValue*)value->objectAtIndex(0))->getFloatValue();
            float y = ((CCBValue*)value->objectAtIndex(1))->getFloatValue();
            
            setRelativeScale(pNode, x, y, type, pPropName);
        }
        else 
        {
            // [node setValue:value forKey:name];

            // TODO only handle rotation, opacity, displayFrame, color
            if (strcmp(pPropName, "rotation") == 0)
            {
                float rotate = ((CCBValue*)pValue)->getFloatValue();
                pNode->setRotation(rotate);
            }
            else if (strcmp(pPropName, "opacity") == 0)
            {
                int opacity = ((CCBValue*)pValue)->getByteValue();
                (dynamic_cast(pNode))->setOpacity(opacity);
            }
            else if (strcmp(pPropName, "displayFrame") == 0)
            {
                ((CCSprite*)pNode)->setDisplayFrame((CCSpriteFrame*)pValue);
            }
            else if (strcmp(pPropName, "color") == 0)
            {
                ccColor3BWapper *color = (ccColor3BWapper*)pValue;
                ((CCSprite*)pNode)->setColor(color->getColor());
            }
            //加入以下的code
            else if (strcmp(pPropName, "visible") == 0)
            {
                bool visible = ((CCBValue*)pValue)->getBoolValue();
                ((CCSprite*)pNode)->setVisible(visible);
            }
            else
            {
                CCLog("unsupported property name is %s", pPropName);
                CCAssert(false, "unsupported property now");
            }
        }
    }
}

記得,
除了專案裡的extension\CCBReader\CCBAnimationManager.cpp要改以外,
cocos2dx安裝目錄底下extensions/CCBReader\CCBAnimationManager.cpp也要改,
Android那邊才會顯示正常。

[Android篇]Back鍵無法關閉cocos2d-x遊戲

文章撰寫日期︰2013/03/20 17:30
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

按下Android的返回鍵,
有時候關的掉遊戲,
有時候關不掉。

二、解決辦法

查文後得知Cocos2dxActivity.java裡的onKeyDown是假的,
觸控權早已交到了Cocos2dxGLSurfaceView.java的onKeyDown手上...

再追下去,
發現backKey交給了Native,
也就是cpp那邊會呼叫backKey按下去後的實作。

後來,
知道要實作init函式,
並將setKeypadEnabled(true);
然後再寫一個
void DoorAnimationScene::keyBackClicked(){
    CCLog("into DoorAnimationScene::keyBackClicked()");
    CCDirector::sharedDirector()->end();
}

結束。

[Android篇]使用CCLabelTTF換行會漏字(最後一個字不見)的問題

文章撰寫日期︰2013/03/20 10:35
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

針對CCLabelTTF設定setDimensions,
想要做到文字過長會自動換行的效果,
在IOS上能正常顯示,
Android上卻會被截掉每一行的最後一個字元的問題。

請參見下圖示意的題目的部份
畫面在IOS上的樣子
畫面在Android上的樣子
可以看到,
"一條尾巴"後面的"逗號"在Android上不見了。

二、解決方法

與Cocos2dX開發人員詢問後,
發現此問題是2.0.x的一個bug,
已經在cocos2d-x 2.1.x獲得改善,
可參見它們的更新LOG #1610。
Bug   #1610: fix a bug that CCLabelTTF will lost a character at the end of a line
 
解決方法是將cocos2d-x在Android上的一個類別
Cocos2dxBitmap.java line 298

while (pString.indexOf(i++) == ' ') {
 ;
}
改成
while (pString.indexOf(i) == ' ') {
          ++i;
}
記得,
cocos2dx/cocos2dx/platform/android/java/src/org/cocos2dx/lib/Cocos2dxBitmap.java也要改掉。

免得之後建立的新Android-Cocos2dx專案又遇到同樣的問題。