cococos 2 dx tolua++使用でよくあるエラー


手順:1、必要なライブラリとキットのインストール、および関連環境変数の構成は、cococos 2 d-x-3.0 rc 0toolstoluaREADMEに従ってください.mdownはやらなければならない(注意:できるだけREADME.mdownで言った同じndkバージョン(9シリーズが望ましい)、そうでなければ変更する必要がある、NDKの各バージョンリンク)2、c++クラスを書く(私がテストしたのはcococos 2 d-x-3.0 rc 0testslua-empty-testprojectClassesカスタム.cpp)
注意:あなたの書く方法は必ずpublicを要して、さもなくばluaにコンパイルしないで、attempt to call method“方法名”(a nil value)注意:xcodeがc++クラスを書く時、もし経路を含んで必ず書き終わるならば、xcodeは間違いを報告しないで、しかしtoluaはまた問題になります!(TranslationUnitLoadError: Error parsing translation unit.)
注意:カスタムカテゴリに自分で定義したnamespaceがある場合は、走ります.batを見てoutput logの最後の行を見ると、このようなエラーが見つかります.
Exception: The namespace (Evo::TalkWidget) conversion wasn’t set in ‘ns_map’ section of the conversions.yaml
conversionsを探してyamlというファイルは、/tools/bindings-generator/targets/luaの下に位置し、文字エディタで直接開いて見るべきです.
自分で注文したnamespaceをns_に追加mapの変数の中で、それは.iniのcpp_namespace作用
追加する内容は次のとおりです.
ns_map: “cocos2d::extension::”: “cc.” “cocos2d::ui::”: “ccui.” “cocos2d::”: “cc.” “spine::”: “sp.” “cocostudio::”: “ccs.” “cocosbuilder::”: “cc.” “CocosDenshion::”: “cc.” 3、生成されたpythonスクリプトを書いて、あなたは書くことができなくて、大丈夫です.私たちはひょうたんに従って瓢箪を描きます1)ディレクトリcococos 2 d-x-3.0 rc 0toolstoluaに入って、genbindingsをコピーします.py、genbindingsと名付けられました_myclass.py 2)生成ディレクトリを我々のプロジェクトに作成しgenbindingsを開くmyclass.pyハンドル
output_dir = '%s/cocos/scripting/lua-bindings/auto' % project_root

に改心
output_dir = '%s/tests/lua-empty-test/project/Classes/auto' % project_root

3)コマンドパラメータを修正し、
cmd_args = {'cocos2dx.ini' : ('cocos2d-x', 'lua_cocos2dx_auto'), \
                    'cocos2dx_extension.ini' : ('cocos2dx_extension', 'lua_cocos2dx_extension_auto'), \
                    'cocos2dx_ui.ini' : ('cocos2dx_ui', 'lua_cocos2dx_ui_auto'), \
                    'cocos2dx_studio.ini' : ('cocos2dx_studio', 'lua_cocos2dx_studio_auto'), \
                    'cocos2dx_spine.ini' : ('cocos2dx_spine', 'lua_cocos2dx_spine_auto'), \
                    'cocos2dx_physics.ini' : ('cocos2dx_physics', 'lua_cocos2dx_physics_auto'), \
                    }
  
cmd_args = {'myclass.ini' : ('myclass', 'lua_myclass_auto') }
4)      myclass.ini   ,          。    ,         , cocos2dx_spine.ini  。
[myclass]
# the prefix to be added to the generated functions. You might or might not use this in your own
# templates
prefix = myclass

# create a target namespace (in javascript, this would create some code like the equiv. to `ns = ns || {}`)
# all classes will be embedded in that namespace
target_namespace =

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
android_flags = -D_SIZE_T_DEFINED_

clang_headers = -I%(clangllvmdir)s/lib/clang/3.3/include
clang_flags = -nostdinc -x c++ -std=c++11

cocos_headers = -I%(cocosdir)s/cocos -I%(cocosdir)s/cocos/2d -I%(cocosdir)s/cocos/base -I%(cocosdir)s/cocos/ui -I%(cocosdir)s/cocos/physics -I%(cocosdir)s/cocos/2d/platform -I%(cocosdir)s/cocos/2d/platform/android -I%(cocosdir)s/cocos/math/kazmath -I%(cocosdir)s/extensions -I%(cocosdir)s/external -I%(cocosdir)s/cocos/editor-support -I%(cocosdir)s

cocos_flags = -DANDROID -DCOCOS2D_JAVASCRIPT

cxxgenerator_headers =

# extra arguments for clang
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

# what headers to parse
headers = %(cocosdir)s/tests/lua-empty-test/project/Classes/HelloWorldScene.h

# what classes to produce code for. You can use regular expressions here. When testing the regular
# expression, it will be enclosed in "^$", like this: "^Menu*$".
classes = HelloWorld

# what should we skip? in the format ClassName::[function function]
# ClassName is a regular expression, but will be used like this: "^ClassName$" functions are also
# regular expressions, they will not be surrounded by "^$". If you want to skip a whole class, just
# add a single "*" as functions. See bellow for several examples. A special class name is "*", which
# will apply to all class names. This is a convenience wildcard to be able to skip similar named
# functions from all classes.

skip =

rename_functions =

rename_classes =

# for all class names, should we remove something when registering in the target VM?
remove_prefix =

# classes for which there will be no "parent" lookup
classes_have_no_parents =

# base classes which will be skipped when their sub-classes found them.
base_classes_to_skip = Ref ProcessBase

# classes that create no constructor
# Set is special and we will use a hand-written constructor
abstract_classes =

# 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'.
script_control_cpp = no
          
[myclass]
prefix = myclass
target_namespace =
headers = %(cocosdir)s/tests/lua-empty-test/project/Classes/HelloWorldScene.h
classes = HelloWorld
skip =
abstract_classes =

4、次は自動的にコードを生成して、コマンドラインツールを開けて、cdはcococos 2 d-x-3.0 rc 0toolstoluaの下で、打ち込みます
python genbindings_myclass.py

リターン運転.前に問題がなければcococos 2 d-x-3.0 rc 0testslua-empty-testprojectClassesにフォルダautoを1つ増やしてlua_を生成しますmyclass_auto.cppとlua_myclass_auto.hpp加入拉如工程
5、私たちが生成したmoduleをスクリプトエンジンの初期化時にluaに追加します.AppDelegateを編集します.cpp、luaを含むmyclass_auto.hppヘッダファイル、
LuaEngine* engine = LuaEngine::getInstance();

あとに加わる
register_all_myclass(engine->getLuaStack()->getLuaState());

6、コンパイル運転.これでHelloWorldというクラスがluaにエクスポートされます.
最後の呼び出し
 local hello = HelloWorld:create()
    local sceneGame = cc.Scene:create()
    sceneGame:addChild(hello)
    cc.Director:getInstance():runWithScene(sceneGame)