多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > Cocos2d-x-3.x版 Js Binding 的手動綁定實現

Cocos2d-x-3.x版 Js Binding 的手動綁定實現

來源:程序員人生   發布時間:2015-04-13 08:42:52 閱讀次數:4078次

網上流傳的是1份2.x版本的,現在已更新到3.x,經過千辛萬苦,終究調試成功。

1 .首先定義待綁定的類

AnimationKoo.h #ifndef __AnimationKoo_H__ #define __AnimationKoo_H__ namespace ls{ class AnimationKoo{ public: virtual void funcTest(); static AnimationKoo * create(); }; } #endif // __AnimationKoo_H__ AnimationKoo.cpp #include "cocos2d.h" #include "cocos2d_specifics.hpp" #include " AnimationKoo.h" void ls::AnimationKoo::funcTest(){ CCLOG("binding test..."); } ls::AnimationKoo * ls::AnimationKoo::create() { AnimationKoo * ret = new AnimationKoo(); return ret; }

定義類在ls命名空間,我們測試funcTest方法

 

2,添加綁定代碼到AppDelegate 的類

applicationDidFinishLaunching方法里面,添加sc->addRegisterCallback(register_all_ls);//手動綁定的類

編寫 jsb_ls_auto.h ,以下

#include "jsapi.h" #include "jsfriendapi.h" #include "ScriptingCore.h" void js_register_ls_Animationkoo(JSContext* cx, JS::HandleObject global); void js_cocos2d_Animationkoo_finalize(JSFreeOp *fop, JSObject *obj); bool js_cocos2dx_Animationkoo_create(JSContext *cx, uint32_t argc, jsval *vp); static bool js_is_native_obj(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_AnimationkooFuncTest_getDescription(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_Animationkoo_constructor(JSContext *cx, uint32_t argc, jsval *vp); void register_all_ls(JSContext* cx, JS::HandleObject obj);

沒錯,就是這么坑爹,需要寫這么多東西。

 

下面是它的實現

jsb_ls_auto.cpp


#include "cocos2d.h" #include "koogame/Animationkoo.h" #include "jsapi.h" #include "jsb_ls_auto.h" #include "cocos2d_specifics.hpp" // 定義 js 真個類型 JSClass *jsb_LsLeafsoar_class; JSObject *jsb_LsLeafsoar_prototype; // 實現 ls 命名空間下的類綁定 void register_all_ls(JSContext* cx, JS::HandleObject obj) { JS::RootedObject ns(cx); get_or_create_js_obj(cx, obj, "ls", &ns); // 實現綁定 Leafsoar 類,它的定義后文給出 js_register_ls_Animationkoo(cx, ns); } void js_cocos2d_Animationkoo_finalize(JSFreeOp *fop, JSObject *obj) { CCLOGINFO("jsbindings: finalizing JS object %p (Node)", obj); } bool js_cocos2dx_Animationkoo_create(JSContext *cx, uint32_t argc, jsval *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); if (argc == 0) { ls::AnimationKoo* ret = ls::AnimationKoo::create(); jsval jsret = JSVAL_NULL; do { if (ret) { js_proxy_t *jsProxy = js_get_or_create_proxy<ls::AnimationKoo>(cx, (ls::AnimationKoo*)ret); jsret = OBJECT_TO_JSVAL(jsProxy->obj); } else { jsret = JSVAL_NULL; } } while (0); args.rval().set(jsret); return true; } JS_ReportError(cx, "js_cocos2dx_Animationkoo_create : wrong number of arguments"); return false; } static bool js_is_native_obj(JSContext *cx, uint32_t argc, jsval *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); args.rval().setBoolean(true); return true; } bool js_cocos2dx_AnimationkooFuncTest_getDescription(JSContext *cx, uint32_t argc, jsval *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); JS::RootedObject obj(cx, args.thisv().toObjectOrNull()); js_proxy_t *proxy = jsb_get_js_proxy(obj); ls::AnimationKoo* cobj = (ls::AnimationKoo *)(proxy ? proxy->ptr : NULL); JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_Node_getDescription : Invalid Native Object"); if (argc == 0) { cobj->funcTest(); /* std::string ret = cobj->funcTest(); jsval jsret = JSVAL_NULL; jsret = std_string_to_jsval(cx, ret); args.rval().set(jsret); */ return true; } JS_ReportError(cx, "js_cocos2dx_Node_getDescription : wrong number of arguments: %d, was expecting %d", argc, 0); return false; } bool js_cocos2dx_Animationkoo_constructor(JSContext *cx, uint32_t argc, jsval *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); bool ok = true; ls::AnimationKoo* cobj = new (std::nothrow) ls::AnimationKoo(); cocos2d::Ref *_ccobj = dynamic_cast<cocos2d::Ref *>(cobj); if (_ccobj) { _ccobj->autorelease(); } TypeTest<ls::AnimationKoo> t; js_type_class_t *typeClass = nullptr; std::string typeName = t.s_name(); auto typeMapIter = _js_global_type_map.find(typeName); CCASSERT(typeMapIter != _js_global_type_map.end(), "Can't find the class type!"); typeClass = typeMapIter->second; CCASSERT(typeClass, "The value is null."); // JSObject *obj = JS_NewObject(cx, typeClass->jsclass, typeClass->proto, typeClass->parentProto); JS::RootedObject proto(cx, typeClass->proto.get()); JS::RootedObject parent(cx, typeClass->parentProto.get()); JS::RootedObject obj(cx, JS_NewObject(cx, typeClass->jsclass, proto, parent)); args.rval().set(OBJECT_TO_JSVAL(obj)); // link the native object with the javascript object js_proxy_t* p = jsb_new_proxy(cobj, obj); AddNamedObjectRoot(cx, &p->obj, "ls::AnimationKoo"); if (JS_HasProperty(cx, obj, "_ctor", &ok) && ok) ScriptingCore::getInstance()->executeFunctionWithOwner(OBJECT_TO_JSVAL(obj), "_ctor", args); return true; } void js_register_ls_Animationkoo(JSContext* cx, JS::HandleObject global){ jsb_LsLeafsoar_class = (JSClass *)calloc(1, sizeof(JSClass)); jsb_LsLeafsoar_class->name = "AnimationKoo"; jsb_LsLeafsoar_class->addProperty = JS_PropertyStub; jsb_LsLeafsoar_class->delProperty = JS_DeletePropertyStub; jsb_LsLeafsoar_class->getProperty = JS_PropertyStub; jsb_LsLeafsoar_class->setProperty = JS_StrictPropertyStub; jsb_LsLeafsoar_class->enumerate = JS_EnumerateStub; jsb_LsLeafsoar_class->resolve = JS_ResolveStub; jsb_LsLeafsoar_class->convert = JS_ConvertStub; jsb_LsLeafsoar_class->finalize = js_cocos2d_Animationkoo_finalize; jsb_LsLeafsoar_class->flags = JSCLASS_HAS_RESERVED_SLOTS(2); static JSPropertySpec properties[] = { JS_PSG("__nativeObj", js_is_native_obj, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_PS_END }; static JSFunctionSpec funcs[] = { JS_FN("funcTest", js_cocos2dx_AnimationkooFuncTest_getDescription, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FS_END }; static JSFunctionSpec st_funcs[] = { JS_FN("create", js_cocos2dx_Animationkoo_create, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FS_END }; jsb_LsLeafsoar_prototype = JS_InitClass( cx, global, JS::NullPtr(), // parent proto jsb_LsLeafsoar_class, js_cocos2dx_Animationkoo_constructor, 0, // constructor properties, funcs, NULL, // no static properties st_funcs); // make the class enumerable in the registered namespace // bool found; //FIXME: Removed in Firefox v27 // JS_SetPropertyAttributes(cx, global, "Node", JSPROP_ENUMERATE | JSPROP_READONLY, &found); // add the proto and JSClass to the type->js info hash table TypeTest<ls::AnimationKoo> t; js_type_class_t *p; std::string typeName = t.s_name(); if (_js_global_type_map.find(typeName) == _js_global_type_map.end()) { p = (js_type_class_t *)malloc(sizeof(js_type_class_t)); p->jsclass = jsb_LsLeafsoar_class; p->proto = jsb_LsLeafsoar_prototype; p->parentProto = NULL; _js_global_type_map.insert(std::make_pair(typeName, p)); } }

這次要寫的更多了。

 

離成功就差1步了。cocos2d js中測試

                   var animationKoo =ls.AnimationKoo.create();

                   animationKoo.funcTest();

 

輸出binding test...,成功


生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 日本高清69 | 日本不卡在线观看免费v | 亚洲综合综合在线 | 最好免费高清视频在线看 | 中文字幕精品在线观看 | 麻豆国产成人精品午夜视频 | 91极品国产 | 黄色免费大全 | 免费观看福利视频 | 窝窝午夜看片成人精品 | 久久久久国产一级毛片高清版 | 国产日韩欧美在线一区二区三区 | 国产成人啪精品午夜在线播放 | 91日韩| 亚洲国产欧美日韩一区二区 | 2021国产精品一区二区在线 | 日本aaaa片毛片免费观看 | 中文字幕第8页 | 16欧美freesex呦交hd | 午夜影院在线免费 | 国产精品久久久久久福利漫画 | 动漫精品成人免费网站 | 亚洲精品国产福利一区二区三区 | 图片小说综合 | 久久久久国产视频 | 日本香蕉一区二区在线观看 | 国产精品久久久久影院色老大 | 最近手机中文字幕大全4 | 国产综合久久一区二区三区 | 日本一区二区网站 | 一级毛片真人不卡免费播 | 国产精品久久久久激情影院 | 日韩精品一区二区三区乱码 | 欧美抽搐一进一进一出 | 日本在线观看www | 国产91高跟丝袜 | 久久视频精品53在线观看 | 亚洲春色在线视频 | 精品国产福利在线观看网址2022 | 一区二区三区四区视频 | 国产亚洲综合成人91精品 |