Cocos2d-x 3.1 Lua Binding

Cocos2d-x 3.1 Lua Binding
참고:http://www.cocos2d-x.org/docs/manual/code-ide/binding-custom-class-to-lua/en
바 인 딩 이 필요 한 C + 클래스 추가
xcode 에서 my 폴 더 를 cocos2d 로 끌 어 옵 니 다.libs. xcodeproj 중
HNLuaTest.h
//
//  HNLuaTest.h
//  cocos2d_libs
//
//  Created by Eleven Chen on 14-8-5.
//
//

#ifndef __cocos2d_libs__HNLuaTest__
#define __cocos2d_libs__HNLuaTest__

#include "cocos2d.h"
#include <string>


class Test : public cocos2d::Ref
{
public:

    static std::string helloMsg();

    static Test* create();

    bool init();
    static cocos2d::Vec2 left();
};

#endif /* defined(__cocos2d_libs__HNLuaTest__) */

HNLuaTest.cpp
//
//  HNLuaTest.cpp
//  cocos2d_libs
//
//  Created by Eleven Chen on 14-8-5.
//
//

#include "HNLuaTest.h"
using namespace cocos2d;

std::string Test::helloMsg()
{
    return "Hello from  HNLuaTest::helloMsg()";
}

Test* Test::create()
{
    return new Test();
}

bool Test::init()
{
    return true;
}

Vec2 Test::left()
{
    return Vec2(0, 0);
}

ini 파일 작성
tolua 디 렉 터 리 에 들 어가 기: $(PROJECT ROOT) / frameworks / cocos2d - x / tools / tolua
그 전에 README 파일 을 보고 환경 을 설치 하 세 요.
README 파일 에 안 드 로 이 드 ndk r9b 로 컴 파일 해 야 한다 고 언급 되 어 있 습 니 다. 컴 파일 할 때 C + std 4.7 의 헤더 파일 을 사 용 했 기 때 문 입 니 다. r9b 는 4.7 을 포함 하고 저 는 r9d 를 사 용 했 습 니 다. 4.6 과 4.8 만 사 용 했 습 니 다.나 는 *. ini 파일 안의 4.7 을 4.8 로 바 꾸 어 번역 했다.
cocos2dx 새로 만 들 기custom. ini 파일, 그리고 다른 파일 에서 코드 를 복사 해서 수정 합 니 다. 코드 안의 모든 설정 에 상세 한 설명 이 있 습 니 다.
clang_headers = -I%(clangllvmdir)s/lib/clang/3.3/include 
# the prefix to be added to the generated functions. You might or might not use this in your own
# templates
prefix = cocos2dx_custom

# 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 = cc

# the native namespace in which this module locates, this parameter is used for avoid conflict of the same class name in different modules, as "cocos2d::Label" <-> "cocos2d::ui::Label".
cpp_namespace = 

android_headers = -I%(androidndkdir)s/platforms/android-14/arch-arm/usr/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
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/editor-support -I%(cocosdir)s/cocos/platform/android

cocos_flags = -DANDROID

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/cocos/my/HNLuaTest.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 = Test.*

# 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 = Test

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

# 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

genbings. py 작성
편 의 를 위해 매번 바 인 딩 할 때 cocos2d - x 의 바 인 딩 코드 를 생 성하 지 않 아 도 됩 니 다. genbindings_custom.py 파일 을 새로 만 든 다음 genbindings.py 코드 를 복사 하여 아래 부분 을 복사 합 니 다.
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'), \
                    'custom.ini': ('custom', 'lua_custom_auto'), \
                    'cocos2dx_custom.ini' : ('cocos2dx_custom', 'lua_cocos2dx_custom_auto'), \
                    }

... 로 바꾸다
 cmd_args = {'cocos2dx_custom.ini' : ('cocos2dx_custom', 'lua_cocos2dx_custom_auto'), \
                    }

genbindings 실행custom.py
 ./genbindings_custom.py 

생 성 된 코드 는  cocos/scripting/lua-bindings/auto
mac 와 ios 의 통합
  • 생 성 된 hpp 와 cpp 를 cocos2d 로 끌 어 옵 니 다.lua_bings. xcodeproj / auto 중
  • cocos2d 에서lua_bings. xcodeproj 의 Build Settings 에 헤더 파일 검색 을 설정 하고 추가 my
  • 안 드 로 이 드 통합
  • 폴 더 에 Android. mk 파일 을 추가 합 니 다. 다음 내용
  • LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    
    LOCAL_MODULE := cocos_custom_static
    
    LOCAL_MODULE_FILENAME := libmy
    
    LOCAL_SRC_FILES := \
    HNLuaTest.cpp
    
    LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) \
    $(LOCAL_PATH)./
    
    LOCAL_C_INCLUDES := $(LOCAL_PATH) \
    $(LOCAL_PATH)./
    
    LOCAL_CFLAGS += -Wno-psabi
    LOCAL_EXPORT_CFLAGS += -Wno-psabi
    
    LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static
    
    include $(BUILD_STATIC_LIBRARY)
    
    $(call import-module,.)
    
  • lua - bings 폴 더 의 Android. mk 파일 을 열 고 다음 내용 을 추가 합 니 다
    LOCAL_SRC_FILES := manual/CCLuaBridge.cpp \
                                #  
                                auto/lua_cocos2dx_custom_auto.cpp \
                                ../../../external/lua/tolua/tolua_event.c \
                                #  
    
  • Lua 에 등록 하기
    수정 my
        //register custom function
        //LuaStack* stack = engine->getLuaStack();
        //register_custom_function(stack->getLuaState());
        LuaStack *stack = engine->getLuaStack();
        auto L = stack->getLuaState();
        if (L)
        {
            lua_getglobal(L, "_G");
            register_all_cocos2dx_custom(L);
            lua_settop(L, 0);
        }
    
    #if (COCOS2D_DEBUG>0)
        if (startRuntime())
            return true;
    #endif
        engine->executeScriptFile(ConfigParser::getInstance()->getEntryFile().c_str());
        return true;
    

    여 기 는 원래 코드 주석 방법 대로 할 수 없습니다. 그러면 오류 가 발생 할 수 있 습 니 다.
    그리고 모두 AppDelegate.cpp 이 함수 안의 tolua_module 줄 이 잘못 되 었 습 니 다.
    원인 은:
  • auto engine = LuaEngine::getInstance();
  • _defaultEngine->init();
  • executeScriptFile(“Deprecated.lua”);
  • _stack->clean();
  • lua_settop(_state, 0);

  • LuaEngine 이 초기 화 될 때 3 개의 lua 파일 을 실행 하여 stack 을 비 웁 니 다.lua_rawget(L,-2); 함수 에서 tolua_module 후 창고 에 원소 가 하나 밖 에 없어 서 lua_pushstring(L,name); 오류 가 발생 합 니 다.
    스 택 에 lua_rawget(L,-2); 을 넣 고 다시 실행 _G 하면 모듈 이 register_all_cocos2dx_custom(L); 에 없 으 면 _G 에 추가 하면 전역 방문 이 가능 하 다.
    cocos code ide build custom runtime
    테스트
     -- test custom
     local msg = cc.Test:helloMsg()
     print(msg)
    

    출력
    귀속 시 자신의 네 임 스페이스 사용
    열기: cocos2d - x / tools / bings - generator / targets / lua / conversions. yaml 파일 은 ns 에 있 습 니 다.map 자신의 네 임 스페이스 추가:
      ns_map:
        "cocos2d::extension::": "cc."
        "cocos2d::ui::": "ccui."
        "cocos2d::": "cc."
        "spine::": "sp."
        "cocostudio::": "ccs."
        "cocosbuilder::": "cc."
        "CocosDenshion::": "cc."
        #         
        "hunuo::": "hn."
    

    좋은 웹페이지 즐겨찾기