報錯信息 解決方法

http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece76310438a21580edb206795834e68d4e419ce3b4655023ba3ed287341588ed27d1757f81701b9a66132200250f6c08edf0a8efdcf68&p=c372e70e85cc43ff57ee967e4c0d85&newp=8b2a9715d9c043af12b8c238464798231615d70e3cddd31e&user=baidu&fm=sc&query=ccNodeLoadersIterator&qid=e275094c0000590a&p1=32

cocos2dx javascript 手動綁定 jsb

MLGB 官方的例子是錯的

http://www.cocos2d-x.org/wiki/How_to_bind_C++_to_Javascript

if (!p) {
        p = (js_type_class_t* )malloc(sizeof(_js_global_type_ht));
        p->type = typeId;
        p->jsclass = jsb_class;
        p->proto = jsb_prototype;
        p->parentProto = NULL;
        HASH_ADD_INT(_js_global_type_ht, type, p);
    }

 

這裏應該是

if (!p) {
        p = (js_type_class_t* )malloc(sizeof(js_type_class_t));
        p->type = typeId;
        p->jsclass = jsb_class;
        p->proto = jsb_prototype;
        p->parentProto = NULL;
        HASH_ADD_INT(_js_global_type_ht, type, p);
    }

 

花了我兩天時間!!!我日!!!!
另外還有個例子的 typo

JS_GetProperty(cx, obj, "JS", &nsval);

    if (nsval == JSVAL_VOID) {
        ns = JS_NewObject(cx, NULL, NULL, NULL);
        nsval = OBJECT_TO_JSVAL(ns);
        JS_SetProperty(cx, obj, "JSB", &nsval);
    }

 

應該是

JS_GetProperty(cx, obj, "JSB", &nsval);

    if (nsval == JSVAL_VOID) {
        ns = JS_NewObject(cx, NULL, NULL, NULL);
        nsval = OBJECT_TO_JSVAL(ns);
        JS_SetProperty(cx, obj, "JSB", &nsval);
    }

 

Cocos2dx Javascript JSB 多次執行 runscript

多次執行,如果照例子的寫法,因爲內存沒清理乾淨,會有各種各樣的錯誤。
需要如下編寫

click_counter++;
    ScriptingCore*  sc = ScriptingCore::getInstance();
   
    sc->cleanup();
    
    //
    if (click_counter<=1){
        sc->addRegisterCallback(register_all_cocos2dx);
        sc->addRegisterCallback(register_all_cocos2dx_extension);
        sc->addRegisterCallback(register_cocos2dx_js_extensions);
        sc->addRegisterCallback(register_all_cocos2dx_extension_manual);
        sc->addRegisterCallback(jsb_register_chipmunk);
        sc->addRegisterCallback(JSB_register_opengl);
        sc->start();
        CCScriptEngineProtocol *pEngine = ScriptingCore::getInstance();
        CCScriptEngineManager::sharedManager()->setScriptEngine(pEngine);
    } else {
        sc->start();
    }
    
    ScriptingCore::getInstance()->runScript("MoonWarriors-jsb.js");

 

關鍵點1:reset 來清除內存,start 裏面有個簡化版的清除內存,清除的不夠乾淨。
關鍵點2:setScriptEngine只能第一次執行,因爲裏面又一次清除了內存,還清除的不夠乾淨。
目前這個寫法還有部分內存泄露,但已經不影響執行,待更新。

NodeJS websocket

哪個更好用我不確認,反正 socket.io 不好用。
這貨不能指定使用 websocket,而是一大堆有的沒的。底層是自己的格式,不支持瀏覽器原生的 websocket,只能客戶端也用 socket.io。

我最後用的 ws
戳這裏

啓動代碼超級簡單,需要更多的內容估計要自己寫了

var WebSocketServer = require('ws').Server;
global.wss = new WebSocketServer({port: init_param.port});
wss.on('connection', function(ws) {
    console.log('someone connected');
    //用請求的path來區分服務類型
    var room_id = parseInt(ws.upgradeReq.url.replace('/',''));
    table_id = find_serve_table(room_id);

    logic_server = logic_servers[table_id];
    server_gods[room_id][table_id].link_counter++;
    ws.table_id = table_id;

    var game_client = new GameClient(ws,logic_server);
    ws.on('message', function(message) {
        game_client.onMessage(JSON.parse(message));
    })
    .on('close',function(code, message){
        server_gods[room_id][this.table_id].link_counter--;
        game_client.onClose(code,message);
    });
});

 

幾個關鍵點,

  1. onconnect之後,可以在ws上增加成員變量來標記這個鏈接,要不尤其是onclose時候不好處理。
  2. 用path區分類型,例如ws://www.example.com:8080/user,ws.upgradeReq.url拿到的就是user,這樣就可以在一個主邏輯守護進程和 端口下,監聽路由到不同的邏輯去

cocos2d-x JSB 報錯雜記

assert(ccNodeLoadersIterator != this->mCCNodeLoaders.end())

1. 如果readNodeGraphFromFile 時發生,
CCB 文件添加了 custom class;JS 型 CCB 發佈到了 C 當中。(還不完全確認)

2. addChild時發生
在 layer 中添加 layer了,
應該

CCScene *pScene = pDirector->getRunningScene();
pScene->addChild(xxx);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章