Quick-Cocos2dx-Community lua绑定,lua调用C++ 类

前端之家收集整理的这篇文章主要介绍了Quick-Cocos2dx-Community lua绑定,lua调用C++ 类前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

http://www.jb51.cc/article/p-csyjushk-rm.html


这里有篇文章,看三和四。


按上面操作,文件都不缺少的,可以直接看 2. 和 3 .

记住:player3 来打开项目, 的类格式化后,放到他的源代码路径下面, 解释生成的lua 也要放到 api下面

player3 重新生成就可以了


player3 最后打开可能会出现, a nil value。


其实,我们用cocos2d-x-3.10,


D:\cocos\setup\Cocos2d-x\cocos2d-x-3.10\tools\tolua

genbindings.py **.ini 来转换成 lua能够调用的 类。


其实就是通过D:\cocos\setup\Cocos2d-x\cocos2d-x-3.10\tools\tolua下提供:README.mdown.的说明来配置,最后生成lua api函数。——这里不妨称这一套东西为c++ 转成 lua 的 解释器或者解释工具,转换工具也成。


我的环境:

win 7 64 位,Sublime Text 3,Quick-Cocos2dx-Community3.6(桌面快捷方式player3) vs 2013

Quick-Cocos2dx-Community 3.6 我没有转换成功,就用

cocos2d-x-3.10 转换,成功了

========================================================

以上才只是编译环境简单说明:

Quick-Cocos2dx-Community 最好,现在这个下面试试, 我的是在

G:\Game\Quick-Cocos2dx-Community\tools\tolua

下面,按住shift + 右键点击选择 “在此处打开命令窗口”直接运行 python genbindings.py。 试试你的Quick-Cocos2dx-Community 能不能转换。


如果不行,也没有关系,这个时候,需要cocos2d-x 引擎来处理, 我的是cocos2d-x-3.10。

1. 把自己的类,.h .cpp 放到G:\ademo\frameworks\runtime-src\Classes 这个下面 “runtime-src\Classes”, 这里的工程是G:\下的ademo,

(名字有点怪, demo 前面加个a 是便于player3 打开项目是 目录 在最上面。)


接下来是cocos2d-x-3.10解压安装目录下

D:\cocos\setup\Cocos2d-x\cocos2d-x-3.10\tools\tolua

cocos2dx.ini ,genbindings.py 各复制一份 修改名称


修改下面的配置 :Pet.ini Pet.py


  1. [Pet]
  2.  
  3. prefix = Pet
  4. target_namespace =
  5.  
  6. android_headers = -I%(androidndkdir)s/platforms/android-14/arch-arm/usr/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.7/libs/armeabi-v7a/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.7/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi-v7a/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.8/include
  7. android_flags = -D_SIZE_T_DEFINED_
  8.  
  9. clang_headers = -I%(clangllvmdir)s/lib/clang/3.3/include
  10. clang_flags = -nostdinc -x c++ -std=c++11 -U __SSE__
  11.  
  12. cocos_headers = -I%(cocosdir)s/cocos -I%(cocosdir)s/cocos/editor-support -I%(cocosdir)s/cocos/platform/android
  13.  
  14. cocos_flags = -DANDROID
  15.  
  16. cxxgenerator_headers =
  17.  
  18. extra_arguments = %(android_headers)s %(clang_headers)s %(cxxgenerator_headers)s %(cocos_headers)s %(android_flags)s %(clang_flags)s %(cocos_flags)s %(extra_flags)s
  19.  
  20. # what headers to parse
  21. headers = %(cocosdir)s/cocos/scripting/lua-bindings/auto/Pet.h
  22.  
  23. #headers = G:/aatestlua/frameworks/runtime-src/Classes/Pet.h
  24.  
  25. # what classes to produce code for. You can use regular expressions here. When testing the regular
  26. # expression,it will be enclosed in "^$",like this: "^Menu*$".
  27. classes = Pet
  28.  
  29. # what should we skip? in the format ClassName::[function function]
  30. # ClassName is a regular expression,but will be used like this: "^ClassName$" functions are also
  31. # regular expressions,they will not be surrounded by "^$". If you want to skip a whole class,just
  32. # add a single "*" as functions. See bellow for several examples. A special class name is "*",which
  33. # will apply to all class names. This is a convenience wildcard to be able to skip similar named
  34. # functions from all classes.
  35.  
  36. skip =
  37. rename_functions =
  38.  
  39. rename_classes =
  40.  
  41. # for all class names,should we remove something when registering in the target VM?
  42. remove_prefix =
  43.  
  44. # classes for which there will be no "parent" lookup
  45. classes_have_no_parents =
  46.  
  47. # base classes which will be skipped when their sub-classes found them.
  48. base_classes_to_skip =
  49.  
  50. # classes that create no constructor
  51. # Set is special and we will use a hand-written constructor
  52. abstract_classes =
  53.  
  54. # Determining whether to use script object(js object) to control the lifecycle of native(cpp) object or the other way around. Supported values are 'yes' or 'no'.
  55. script_control_cpp = no

注意:headers = %(cocosdir)s/cocos/scripting/lua-bindings/auto/Pet.h

我使用绝对路径没有成功。

我就顺便把自己的类Pet.h 放到成才 lua 格式c++ 类同一目录下(runtime-src\Classes自己的c++类)


%(cocosdir)s/cocos/scripting/lua-bindings/auto/ 就是这个目录


下面看Pet.py

这个里面 改的地方不多:

  1. try:
  2.  
  3. tolua_root = '%s/tools/tolua' % project_root
  4. output_dir = '%s/cocos/scripting/lua-bindings/auto' % project_root
  5.  
  6. cmd_args = {
  7. #'cocos2dx.ini' : ('cocos2d-x','lua_cocos2dx_auto'),\
  8. 'Pet.ini' : ('Pet','lua_pet_auto'),\
  9. #'cocos2dx_assetsmanager.ini' : ('cocos2dx_assetsmanager','lua_cocos2dx_assetsmanager_auto'),\
  10. #'cocos2dx_extension.ini' : ('cocos2dx_extension','lua_cocos2dx_extension_auto'),\
  11. #'cocos2dx_ui.ini' : ('cocos2dx_ui','lua_cocos2dx_ui_auto'),\
  12. #'cocos2dx_studio.ini' : ('cocos2dx_studio','lua_cocos2dx_studio_auto'),\
  13. #'cocos2dx_spine.ini' : ('cocos2dx_spine','lua_cocos2dx_spine_auto'),\
  14. #'cocos2dx_physics.ini' : ('cocos2dx_physics','lua_cocos2dx_physics_auto'),\
  15. #'cocos2dx_experimental_video.ini' : ('cocos2dx_experimental_video','lua_cocos2dx_experimental_video_auto'),\
  16. #'cocos2dx_experimental.ini' : ('cocos2dx_experimental','lua_cocos2dx_experimental_auto'),\
  17. #'cocos2dx_controller.ini' : ('cocos2dx_controller','lua_cocos2dx_controller_auto'),\
  18. #'cocos2dx_cocosbuilder.ini': ('cocos2dx_cocosbuilder','lua_cocos2dx_cocosbuilder_auto'),\
  19. #'cocos2dx_cocosdenshion.ini': ('cocos2dx_cocosdenshion','lua_cocos2dx_cocosdenshion_auto'),\
  20. #'cocos2dx_3d.ini': ('cocos2dx_3d','lua_cocos2dx_3d_auto'),\
  21. #'cocos2dx_audioengine.ini': ('cocos2dx_audioengine','lua_cocos2dx_audioengine_auto'),\
  22. #'cocos2dx_csloader.ini' : ('cocos2dx_csloader','lua_cocos2dx_csloader_auto'),\
  23. }
  24. target = 'lua'
  25. generator_py = '%s/generator.py' % cxx_generator_root
  26. for key in cmd_args.keys():
  27. args = cmd_args[key]
  28. cfg = '%s/%s' % (tolua_root,key)
  29. print 'Generating bindings for %s...' % (key[:-4])
  30. command = '%s %s %s -s %s -t %s -o %s -n %s' % (python_bin,generator_py,cfg,args[0],target,output_dir,args[1])
  31. _run_cmd(command)
  32.  
  33. if platform == 'win32':
  34. with _pushd(output_dir):
  35. _run_cmd('dos2unix *')


只需要 在cmd_args = { }中 把不需要的 注释掉,这样 解释起来 快点


tolua_root = '%s/tools/tolua' % project_root
output_dir = '%s/cocos/scripting/lua-bindings/auto' % project_root

这里的两个目录,上面的是 我修改 .ini 和 .py 的目录,下面的是 生成的目录, 我们需要 解释的类放的目录, 上面有提到这个目录

好了贴一下这个配置,以免有遗漏的地方

  1. #!/usr/bin/python
  2.  
  3. # This script is used to generate luabinding glue codes.
  4. # Android ndk version must be ndk-r9b.
  5.  
  6.  
  7. import sys
  8. import os,os.path
  9. import shutil
  10. import ConfigParser
  11. import subprocess
  12. import re
  13. from contextlib import contextmanager
  14.  
  15.  
  16. def _check_ndk_root_env():
  17. ''' Checking the environment NDK_ROOT,which will be used for building
  18. '''
  19.  
  20. try:
  21. NDK_ROOT = os.environ['NDK_ROOT']
  22. except Exception:
  23. print "NDK_ROOT not defined. Please define NDK_ROOT in your environment."
  24. sys.exit(1)
  25.  
  26. return NDK_ROOT
  27.  
  28. def _check_python_bin_env():
  29. ''' Checking the environment PYTHON_BIN,which will be used for building
  30. '''
  31.  
  32. try:
  33. PYTHON_BIN = os.environ['PYTHON_BIN']
  34. except Exception:
  35. print "PYTHON_BIN not defined,use current python."
  36. PYTHON_BIN = sys.executable
  37.  
  38. return PYTHON_BIN
  39.  
  40.  
  41. class CmdError(Exception):
  42. pass
  43.  
  44.  
  45. @contextmanager
  46. def _pushd(newDir):
  47. prevIoUsDir = os.getcwd()
  48. os.chdir(newDir)
  49. yield
  50. os.chdir(prevIoUsDir)
  51.  
  52. def _run_cmd(command):
  53. ret = subprocess.call(command,shell=True)
  54. if ret != 0:
  55. message = "Error running command"
  56. raise CmdError(message)
  57.  
  58. def main():
  59.  
  60. cur_platform= '??'
  61. llvm_path = '??'
  62. ndk_root = _check_ndk_root_env()
  63. # del the " in the path
  64. ndk_root = re.sub(r"\"","",ndk_root)
  65. python_bin = _check_python_bin_env()
  66.  
  67. platform = sys.platform
  68. if platform == 'win32':
  69. cur_platform = 'windows'
  70. elif platform == 'darwin':
  71. cur_platform = platform
  72. elif 'linux' in platform:
  73. cur_platform = 'linux'
  74. else:
  75. print 'Your platform is not supported!'
  76. sys.exit(1)
  77.  
  78. if platform == 'win32':
  79. x86_llvm_path = os.path.abspath(os.path.join(ndk_root,'toolchains/llvm-3.3/prebuilt','%s' % cur_platform))
  80. if not os.path.exists(x86_llvm_path):
  81. x86_llvm_path = os.path.abspath(os.path.join(ndk_root,'toolchains/llvm-3.4/prebuilt','%s' % cur_platform))
  82. else:
  83. x86_llvm_path = os.path.abspath(os.path.join(ndk_root,'%s-%s' % (cur_platform,'x86')))
  84. if not os.path.exists(x86_llvm_path):
  85. x86_llvm_path = os.path.abspath(os.path.join(ndk_root,'x86')))
  86.  
  87. x64_llvm_path = os.path.abspath(os.path.join(ndk_root,'x86_64')))
  88. if not os.path.exists(x64_llvm_path):
  89. x64_llvm_path = os.path.abspath(os.path.join(ndk_root,'x86_64')))
  90.  
  91. if os.path.isdir(x86_llvm_path):
  92. llvm_path = x86_llvm_path
  93. elif os.path.isdir(x64_llvm_path):
  94. llvm_path = x64_llvm_path
  95. else:
  96. print 'llvm toolchain not found!'
  97. print 'path: %s or path: %s are not valid! ' % (x86_llvm_path,x64_llvm_path)
  98. sys.exit(1)
  99.  
  100. project_root = os.path.abspath(os.path.join(os.path.dirname(__file__),'..','..'))
  101. cocos_root = os.path.abspath(os.path.join(project_root,''))
  102. cxx_generator_root = os.path.abspath(os.path.join(project_root,'tools/bindings-generator'))
  103.  
  104. # save config to file
  105. config = ConfigParser.ConfigParser()
  106. config.set('DEFAULT','androidndkdir',ndk_root)
  107. config.set('DEFAULT','clangllvmdir',llvm_path)
  108. config.set('DEFAULT','cocosdir',cocos_root)
  109. config.set('DEFAULT','cxxgeneratordir',cxx_generator_root)
  110. config.set('DEFAULT','extra_flags','')
  111.  
  112. # To fix parse error on windows,we must difine __WCHAR_MAX__ and undefine __MINGW32__ .
  113. if platform == 'win32':
  114. config.set('DEFAULT','-D__WCHAR_MAX__=0x7fffffff -U__MINGW32__')
  115.  
  116. conf_ini_file = os.path.abspath(os.path.join(os.path.dirname(__file__),'userconf.ini'))
  117.  
  118. print 'generating userconf.ini...'
  119. with open(conf_ini_file,'w') as configfile:
  120. config.write(configfile)
  121.  
  122.  
  123. # set proper environment variables
  124. if 'linux' in platform or platform == 'darwin':
  125. os.putenv('LD_LIBRARY_PATH','%s/libclang' % cxx_generator_root)
  126. if platform == 'win32':
  127. path_env = os.environ['PATH']
  128. os.putenv('PATH',r'%s;%s\libclang;%s\tools\win32;' % (path_env,cxx_generator_root,cxx_generator_root))
  129.  
  130.  
  131. try:
  132.  
  133. tolua_root = '%s/tools/tolua' % project_root
  134. output_dir = '%s/cocos/scripting/lua-bindings/auto' % project_root
  135.  
  136. cmd_args = {
  137. #'cocos2dx.ini' : ('cocos2d-x',args[1])
  138. _run_cmd(command)
  139.  
  140. if platform == 'win32':
  141. with _pushd(output_dir):
  142. _run_cmd('dos2unix *')
  143.  
  144. print '---------------------------------'
  145. print 'Generating lua bindings succeeds.'
  146. print '---------------------------------'
  147.  
  148. except Exception as e:
  149. if e.__class__.__name__ == 'CmdError':
  150. print '---------------------------------'
  151. print 'Generating lua bindings fails.'
  152. print '---------------------------------'
  153. sys.exit(1)
  154. else:
  155. raise
  156.  
  157.  
  158. # -------------- main --------------
  159. if __name__ == '__main__':
  160. main()


接下来, 开始 按住 shift键 右键 单击当前 文件夹 空白 选中 “当前窗口打开命令窗口”


输入: python Pet.py

成功是 会出现 lua binding succeeds.

接下来 会出现 四个文件

D:\cocos\setup\Cocos2d-x\cocos2d-x-3.10\cocos\scripting\lua-bindings\auto

lua格式的c++ 类 lua_pet_auto.hpp lua_pet_auto.cpp

D:\cocos\setup\Cocos2d-x\cocos2d-x-3.10\cocos\scripting\lua-bindings\auto\api

lua_pet_auto_api.lua Pet.lua

这里需要注意:有的 没有生成Pet.lua 是因为你的 .ini 下面 class=Pet 没有指定要生成的类。


2. 需要用 vs 2013 来检验 ,调用 。 本文开头的链接 将的很清楚,这里就不啰嗦了。


可能到最后,vs 2013 打开运行 没有问题,但是 lua 直接用player3 打开工程 会有问题******(a nil value).

  1. function MainScene:ctor()
  2. cc.ui.UILabel.new({
  3. UILabelType = 2,text = "Hello,World",size = 64})
  4. :align(display.CENTER,display.cx,display.cy)
  5. :addTo(self)
  6.  
  7.  
  8. pet = Pet:new()
  9. print(strhello);
  10. strhello = pet:getTestText();
  11. local mPet = pet:addTo(self)
  12.  
  13. print("===============调用成功===================")
  14.  
  15. cc.ui.UILabel.new({
  16. UILabelType = 2,text = strhello,size = 32})
  17. :align(display.CENTER,display.cy + 100)
  18. :addTo(self)
  19.  
  20. end
你要确保你的vs工程下面libluacocos2d -auto :lua_pet_auto.cpp 和lua_pet_auto.hpp 存在。

这个我是放在player3 源代码 路径下的:G:\Game\Quick-Cocos2dx-Community\cocos\scripting\lua-bindings\auto

可以直接 右键属性, c++ 头文件路径导入 绝对路径G:\ademo\frameworks\runtime-src\Classes\

Pet.h Pet.cpp

这里配置成功后, 后面需要打开的另一个工程就不需要配置了。


你的工程 下(这里我的是ademo) 下面 右键属性G:\Game\Quick-Cocos2dx-Community\cocos\scripting\lua-bindings\auto

lua_pet_auto.cpp 和lua_pet_auto.hpp 存在

G:\Game\Quick-Cocos2dx-Community\cocos\scripting\lua-bindings\auto\api

lua_pet_auto_api.lua Pet.lua存在

就是 把cocos2d-x-3.10 下成才的东西player3 在放置一下,因为你是用player3吗,对吧!


注意:你用的是player3 ,但此时,为什么没有成功,这是为什么呢? 嘿嘿。


虽说你的 lua_pet_auto.cpp 和lua_pet_auto.hpp 也放到player3 的资源目录下啦(G:\Game\Quick-Cocos2dx-Community\cocos\scripting\lua-bindings\auto

lua_pet_auto_api.lua Pet.lua

也在G:\Game\Quick-Cocos2dx-Community\cocos\scripting\lua-bindings\auto\api 下了。


为什么呢?

—— vs 打开工程 重新构建 ,build all 。 把所有的东西 整合。

因为 你用的player3 ,是编译生成好的 。


3. 那好,我们来操作....

G:\Game\Quick-Cocos2dx-Community\quick\player

找到 proj.win32 vs 打开 解决方案player.sln 重新 生成解决方案。


返回到上级目录 :G:\Game\Quick-Cocos2dx-Community\quick\player

win32 文件夹 ,就是 你的player3(桌面没有的 ,右键桌面快捷方式)


重新生成解决方案后,打开看看,是不是成功了。


注意:vs 打开 解决方player.sln 下 项目libluacocos2d 和你工程的 应该是一样的, 这也是上面我们提到的你会用到的。

只需要player3 工程 下 class 右键添加

G:\Game\Quick-Cocos2dx-Community\quick\player\Classes\Pet.h Pet.cpp 这里是从你的工程下 “\frameworks\runtime-src\Classes” 下哪来的

这也是 为什么 开始 让你 Quick-Cocos2dx-Community 下试试 能不能运行成功的原因, 成功了,就不需要cocos2d-x-3.10 来生成


直接 在G:\Game\Quick-Cocos2dx-Community\tools\tolua 生成, 后面不要 复制过来复制过去了。


好了完了。


补充:

http://www.cocoachina.com/bbs/read.PHP?tid=200145

vs 调用 自己的类注意事项:

  1. bool AppDelegate::applicationDidFinishLaunching()
  2. {
  3. LuaEngine * lua_engine = LuaEngine::getInstance();
  4. ScriptEngineManager::getInstance()->setScriptEngine(lua_engine);
  5. lua_State* luaState = lua_engine->getLuaStack()->getLuaState();
  6. if (L)
  7. {
  8. lua_getglobal(luaState,"_G");
  9. register_all_Pet(luaState);
  10. lua_settop(luaState,0);
  11. }
  12. //register custom function
  13. //LuaStack* stack = engine->getLuaStack();
  14. //register_custom_function(stack->getLuaState());
  15. //FileUtils::getInstance()->setResourceEncryptKeyAndSign("test","XXTEA");
  16. }

这里补上资源:http://download.csdn.net/detail/bible521125/9539325

或者 官方文档:
http://www.cocos.com/doc/tutorial/show?id=2547


其他文档
http://my.oschina.net/guyson/blog/338375

以上仅供参考,欢迎留言指正错误! 附上邮箱:545625405@qq.com

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