cocos2d中间层创建(一)

前端之家收集整理的这篇文章主要介绍了cocos2d中间层创建(一)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

首先编辑jsb中间层,主要是在AppDelegate中进行注册单例,在js中进行调用

jsb_lcm_api.h:

  1. //
  2. // jsb_lcm_api.h
  3. // MoonWarriors
  4. //
  5. // Created by xiaohei on 2/21/17.
  6. //
  7. //
  8.  
  9. #ifndef __LCM__jsb_lcm_api__
  10. #define __LCM__jsb_lcm_api__
  11.  
  12. #include "jsapi.h"
  13. #include "jsfriendapi.h"
  14. #include "js_bindings_lcm_api.h"
  15.  
  16. extern JSClass *js_cocos2dx_LCMAPI_class;
  17. extern JSObject *js_cocos2dx_LCMAPI_prototype;
  18. ///
  19. /// @brief LCM API
  20. ///
  21. void js_register_LCMAPI(JSContext* cx,JSObject* global );
  22.  
  23. void register_all_LCMAPI(JSContext* cx,JSObject* obj);
  24.  
  25. #endif /* defined(__LCM__jsb_lcm_api__) */


jsb_lcm_api.cpp:
  1. //
  2. // jsb_lcm_api.cpp
  3. // MoonWarriors
  4. //
  5. // Created by xiaohei on 2/21/17.
  6. //
  7. //
  8.  
  9. #include "jsb_lcm_api.h"
  10.  
  11. ///
  12. /// @brief JS Internal Header Files
  13. ///
  14. #include "jsapi.h"
  15. #include "ScriptingCore.h"
  16. #include "cocos2d_specifics.hpp"
  17. #include "cocos2d.h"
  18. #include "AppDelegate.h"
  19.  
  20. static bool empty_constructor(JSContext *cx,uint32_t argc,jsval *vp) {
  21. return false;
  22. }
  23.  
  24. JSClass *js_cocos2dx_LCMAPI_class;
  25. JSObject *js_cocos2dx_LCMAPI_prototype;
  26. extern JSObject *jsb_cocos2d_ActionInterval_prototype;
  27.  
  28. bool js_cocos2dx_extension_LCMAPI_getLTotalBalance(JSContext *cx,jsval *vp)
  29. {
  30. jsval *argv = JS_ARGV(cx,vp);
  31. JSObject *obj = JS_THIS_OBJECT(cx,vp);
  32. js_proxy_t *proxy = jsb_get_js_proxy(obj);
  33. LCMJSB::LCMAPI* cobj = (LCMJSB::LCMAPI *)(proxy ? proxy->ptr : NULL);
  34. JSB_PRECONDITION2( cobj,cx,false,"Invalid Native Object");
  35. if (argc == 0)
  36. {
  37. std::string ret = cobj->getLTotalBalance();
  38. jsval jsret = std_string_to_jsval(cx,ret);
  39. JS_SET_RVAL(cx,vp,jsret);
  40. return true;
  41. }
  42. JS_ReportError(cx,"wrong number of arguments: %d,was expecting %d",argc,0);
  43. return false;
  44. }
  45.  
  46. bool js_cocos2dx_extension_LCMAPI_lcmNotifyEveryday(JSContext *cx,jsval *vp)
  47. {
  48. jsval *argv = JS_ARGV(cx,vp);
  49. JSObject *obj = JS_THIS_OBJECT(cx,vp);
  50. js_proxy_t *proxy = jsb_get_js_proxy(obj);
  51. LCMJSB::LCMAPI* cobj = (LCMJSB::LCMAPI *)(proxy ? proxy->ptr : NULL);
  52. JSB_PRECONDITION2( cobj,"Invalid Native Object");
  53. if (argc == 6)
  54. {
  55. int hour = JSVAL_TO_INT(argv[0]);
  56. int min = JSVAL_TO_INT(argv[1]);
  57. JSString *str = JSVAL_TO_STRING(argv[2]);
  58. JSStringWrapper strWrap(str);
  59. std::string title = strWrap.get();
  60. JSString *str2 = JSVAL_TO_STRING(argv[3]);
  61. JSStringWrapper strWrap2(str2);
  62. std::string txt = strWrap2.get();
  63. JSString *str3 = JSVAL_TO_STRING(argv[4]);
  64. JSStringWrapper strWrap3(str3);
  65. std::string icon = strWrap3.get();
  66. int code = JSVAL_TO_INT(argv[5]);
  67. cobj->lcmNotifyEveryday(hour,min,title,txt,icon,code);
  68. JS_SET_RVAL(cx,JSVAL_VOID);
  69. return true;
  70. }
  71. JS_ReportError(cx,6);
  72. return false;
  73. }
  74.  
  75. void js_register_LCMAPI(JSContext *cx,JSObject *global) {
  76. js_cocos2dx_LCMAPI_class = (JSClass *)calloc(1,sizeof(JSClass));
  77. js_cocos2dx_LCMAPI_class->name = "LCMAPI";
  78. js_cocos2dx_LCMAPI_class->addProperty = JS_PropertyStub;
  79. js_cocos2dx_LCMAPI_class->delProperty = JS_DeletePropertyStub;
  80. js_cocos2dx_LCMAPI_class->getProperty = JS_PropertyStub;
  81. js_cocos2dx_LCMAPI_class->setProperty = JS_StrictPropertyStub;
  82. js_cocos2dx_LCMAPI_class->enumerate = JS_EnumerateStub;
  83. js_cocos2dx_LCMAPI_class->resolve = JS_ResolveStub;
  84. js_cocos2dx_LCMAPI_class->convert = JS_ConvertStub;
  85. js_cocos2dx_LCMAPI_class->finalize = js_cocos2dx_LCMAPI_finalize;
  86. js_cocos2dx_LCMAPI_class->flags = JSCLASS_HAS_RESERVED_SLOTS(4);
  87. static JSPropertySpec properties[] = {
  88. {0,JSOP_NULLWRAPPER,JSOP_NULLWRAPPER}
  89. };
  90. static JSFunctionSpec funcs[] = {
  91. JS_FN("continueProcessing",js_cocos2dx_extension_LCMAPI_continueProcessing,JSPROP_PERMANENT | JSPROP_ENUMERATE),JS_FN("LUpdateBalance",js_cocos2dx_extension_LCMAPI_LUpdateBalance,JS_FN("checkBalanceEnoughForPay",js_cocos2dx_extension_LCMAPI_checkBalanceEnoughForPay,2,JS_FN("setLExtraData",js_cocos2dx_extension_LCMAPI_setLExtraData,JS_FN("getLAccessToken",js_cocos2dx_extension_LCMAPI_getLAccessToken,JS_FN("getLUserStringInfo",js_cocos2dx_extension_LCMAPI_getLUserStringInfo,JS_FN("getLIdFromUser",js_cocos2dx_extension_LCMAPI_getLIdFromUser,JS_FN("getLTotalBalance",js_cocos2dx_extension_LCMAPI_getLTotalBalance,JS_FN("getLPaidBalance",js_cocos2dx_extension_LCMAPI_getLPaidBalance,JS_FN("getLFreeBalance",js_cocos2dx_extension_LCMAPI_getLFreeBalance,JS_FN("getLIsShowBalance",js_cocos2dx_extension_LCMAPI_getLIsShowBalance,JS_FN("setLMenuBarVisible",js_cocos2dx_extension_LCMAPI_setLMenuBarVisible,JS_FN("showLCustomerService",js_cocos2dx_extension_LCMAPI_showLCustomerService,JS_FN("lcmlogout",js_cocos2dx_extension_LCMAPI_lcmlogout,JS_FN("lcmLogin",js_cocos2dx_extension_LCMAPI_lcmLogin,JS_FN("lcmNotifyClean",js_cocos2dx_extension_LCMAPI_lcmNotifyClean,JS_FN("lcmNotifyEveryday",js_cocos2dx_extension_LCMAPI_lcmNotifyEveryday,6,JS_FS_END
  92. };
  93. static JSFunctionSpec st_funcs[] = {
  94. JS_FN("getInstance",js_cocos2dx_extension_LCMAPI_getInstance,JS_FS_END
  95. };
  96. js_cocos2dx_LCMAPI_prototype = JS_InitClass(
  97. cx,global,NULL,js_cocos2dx_LCMAPI_class,empty_constructor,// constructor
  98. properties,funcs,// no static properties
  99. st_funcs);
  100. TypeTest<LCMJSB::LCMAPI> t;
  101. js_type_class_t *p;
  102. std::string typeName = t.s_name();
  103. if (_js_global_type_map.find(typeName) == _js_global_type_map.end())
  104. {
  105. p = (js_type_class_t *)malloc(sizeof(js_type_class_t));
  106. p->jsclass = js_cocos2dx_LCMAPI_class;
  107. p->proto = js_cocos2dx_LCMAPI_prototype;
  108. p->parentProto = jsb_cocos2d_ActionInterval_prototype;
  109. _js_global_type_map.insert(std::make_pair(typeName,p));
  110. }
  111.  
  112. }
  113.  
  114. void register_all_LCMAPI(JSContext* cx,JSObject* obj)
  115. {
  116. JS::RootedValue nsval(cx);
  117. JS::RootedObject ns(cx);
  118. JS_GetProperty(cx,obj,"LCMJSB",&nsval);
  119. if (nsval == JSVAL_VOID) {
  120. ns = JS_NewObject(cx,NULL);
  121. nsval = OBJECT_TO_JSVAL(ns);
  122. JS_SetProperty(cx,nsval);
  123. } else {
  124. JS_ValueToObject(cx,nsval,&ns);
  125. }
  126. obj = ns;
  127. js_register_LCMAPI(cx,obj);
  128. }

AppDelegate.cpp 中进行注册
  1. #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
  2. #include "../SDK/lcm9.3/LCMJS/jsb_lcm_api.h"
  3. #include "../SDK/lcm9.3/LCMJS/js_bindings_lcm_api.h"
  4. #endif
  5.  
  6. ScriptingCore* sc = ScriptingCore::getInstance();
  7. #if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32) && (CC_TARGET_PLATFORM != CC_PLATFORM_MAC)
  8. //lcm
  9. sc->addRegisterCallback(register_all_LCMAPI);
  10. #endif


js中进行调用
  1. if (g_targetOS != TargetOS.WINDOWS && g_targetOS != TargetOS.MACOS && MobageTool.isAvailable()) {
  2. LCMJSB.LCMAPI.getInstance().lcmNotifyClean();
  3. LCMJSB.LCMAPI.getInstance().lcmNotifyEveryday(12,__getClientMsg(371),client_msg_hash[354].n,"icon",1);
  4. LCMJSB.LCMAPI.getInstance().lcmNotifyEveryday(18,client_msg_hash[356].n,2);
  5. }

猜你在找的Cocos2d-x相关文章