이 문서는 Cocos2d-x 3.15.1 기반에서 C++ 클래스를 자동화된 방식으로 JavaScript에 바인딩하는 절차를 설명합니다. 실습은 test 디렉터리 내에서 진행됩니다.
1. 테스트 디렉터리로 이동
다음 경로로 이동합니다:
/Users/사용자명/cocos2d-x-3.15.1/tools/bindings-generator/test
2. 설정 파일 수정: test.ini
바인딩 생성기의 동작을 제어하기 위해 test.ini 파일을 수정합니다. 아래는 주요 항목에 대한 설명입니다.
[SpriteWithHue]
name = SpriteWithHue
prefix = autoSpriteWithHuebindings
classes = SpriteWithHue
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 \
-I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/include \
-I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.9/include
android_flags = -D_SIZE_T_DEFINED_
cocos_flags = -DANDROID
clang_headers = -I%(clangllvmdir)s/lib/clang/%(clang_version)s/include
clang_flags = -nostdinc -x c++ -std=c++11 -U __SSE__
cocos_headers = -I%(cocosdir)s/cocos -I%(cocosdir)s/cocos/platform/android -I%(cocosdir)s/external
simple_test_headers = -I%(cocosdir)s/cocos -I%(cocosdir)s/cocos/gameJsb
extra_arguments = %(android_headers)s %(clang_headers)s %(android_flags)s %(clang_flags)s %(cocos_headers)s %(cocos_flags)s %(simple_test_headers)s %(extra_flags)s
headers = %(cocosdir)s/cocos/gameJsb/CCSpriteWithHue.h
target_namespace =
remove_prefix =
skip =
base_objects =
abstract_classes =
classes_have_type_info = no
rename =
rename_functions =
rename_classes =
classes_have_no_parents =
base_classes_to_skip =
script_control_cpp = yes
주요 설정 항목 설명
- name: 설정 블록의 이름입니다.
- prefix: 생성되는 출력 파일들의 접두사로,
autoSpriteWithHuebindings.cpp,autoSpriteWithHuebindings.js등의 이름을 형성합니다. - classes: 바인딩할 C++ 클래스 이름. 정규 표현식 사용 가능.
- headers: 바인딩 대상 헤더 파일의 경로.
- extra_arguments: 컴파일러 및 플랫폼 관련 인수들로, Clang과 Android NDK 설정 포함.
- cocos_headers: Cocos2d-x 핵심 헤더 파일 위치를 지정하여 include 오류 방지.
- cocos_flags: 플랫폼 조건부 컴파일을 위한 매크로 정의.
- target_namespace: JS에서 사용될 네임스페이스 (비워두면 기본 네임스페이스 사용).
- rename_functions: 예시)
SqliteCpp::[sqlite3_execCpp=sqlite3_exec]— 함수 이름 재정의. - skip: 바인딩에서 제외할 클래스나 메서드 지정.
- script_control_cpp: 스크립트 객체가 네이티브 객체의 수명 주기를 제어할지 여부.
yes추천.
추가적인 설정 예제는 다음 파일들을 참고하세요:
cocos2dx.inicocos2dx_extension.initest.ini
3. Python 스크립트 설정: test.py
스크립트 실행 전, NDK 경로 설정이 올바른지 확인하세요. 사용 중인 NDK 버전(예: android-ndk-r9b)에 맞게 경로를 조정해야 합니다. 경로 누락 시 컴파일 오류 발생 가능.
4. 바인딩 스크립트 실행
터미널에서 다음 명령어를 실행:
./test.py
실행 권한이 없다면 먼저 다음과 같이 권한을 부여하세요:
chmod a+x ./test.py
성공 시 다음과 같은 메시지가 출력됩니다:
Generating javascript bindings succeeds
5. 생성된 파일 확인
다음 디렉터리로 이동하여 생성된 파일을 확인합니다:
cocos2d-x-3.15.1/tools/bindings-generator/test/simple_test_bindings
여기에는 자동 생성된 .cpp, .hpp, .js 파일들이 포함되어 있습니다.
6. 프로젝트에 파일 통합
생성된 바인딩 파일들을 실제 프로젝트에 추가합니다:
.cpp및.hpp파일 →Desktop/JsGameDemo/frameworks/cocos2d-x/cocos/scripting/js-bindings/auto/.js파일 →.../js-bindings/auto/api/
C++ 소스 코드(CCSpriteWithHue.cpp 등)는 cocos 디렉터리 내 임의의 위치에 배치할 수 있습니다.
7. 바인딩 초기화 등록
자체적으로 생성된 등록 함수를 애플리케이션 시작 시 호출해야 합니다. 예를 들어:
sc->addRegisterCallback(register_all_autoSpriteWithHuebindings);
이 코드는 스크립트 컨텍스트 초기화 과정 중에 삽입되어야 합니다.
8. JavaScript에서 사용 예시
JS 코드에서 새로 바인딩된 클래스를 다음과 같이 사용할 수 있습니다:
for (var i = 0; i < 10; i++) {
var alien = SpriteWithHue.create(res.playerStand);
alien.setAnchorPoint(0, 0.5);
alien.setPosition(cc.p(10 + 130 * i, 400));
alien.setHue(i);
this.addChild(alien, 20);
}
실행 결과, 각 스프라이트가 서로 다른 색조(Hue) 값을 가지며 화면에 표시됩니다.