报错信息 解决方法

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);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值