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);
});
});
幾個關鍵點,
- onconnect之後,可以在ws上增加成員變量來標記這個鏈接,要不尤其是onclose時候不好處理。
- 用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);