430 likes | 622 Views
Lua 5.1.2 버전 작성일 2007.07.16 참고서적 – Programing Game AI by Example 작성자 : 10thP 김성재. Lua script cpp 서 사용하기. Lua 와 Cpp 간의 인터페이스 하는 원리. 1. C / C++ 과 인터페이스 하기. 1. C / C++ 과 인터페이스 하기. 직접적으로 data 를 소통 할 수 없을 만큼 Cpp 과 Lua 는 서로 다르다 .
E N D
Lua 5.1.2 버전 작성일 2007.07.16참고서적 – Programing Game AI by Example작성자 : 10thP김성재 Lua script cpp서 사용하기
Lua와 Cpp간의 인터페이스 하는 원리 1. C / C++과 인터페이스 하기
1. C / C++과 인터페이스 하기 • 직접적으로 data를 소통 할 수 없을 만큼 Cpp과 Lua는 서로 다르다. • 그래서 Lua와 Cpp는 virtual stack을 사용해 data를 간접적으로 주고 받는다. • Virtual stack은 스크립트의 요구에 따라커지거나 줄어 들수 있다. (기본크기는20이다. Lua.h에 정의되어있음)
Lua와 Cpp가 data를 주고받는과정 • Name = “Creator” • 1. c++함수는 문자열 Name를 LuaStack에 넣는다. • 2.Lua는 Stack을 읽고 문자열 Name를 찾는다 • 3.Lua는 전역 테이블에서 Name의 값을 찾고 Name에 지정된값 “Creator”를 Stack에 넣는다. • 4.C++ 함수는 문자열 “Creator”를 Stack의 맨위에서 가져간다 다른 어떤것을 해도 과정이 복잡 해질 수 있어도 본질적으로는 같다.
Lua Stack의 index • -1이 최상위이며, 1이 최하위 이다. • 양수값을 사용하려면 스택의 크기를 알아야 하므로음수 값을 사용 하는 것이 더 편하다.
기본적인 방법으로 data를 뽑아내기. 위 방법을 함수화 하여 쉽게 data를 뽑아내기. 2. Lua Script로 부터전역변수 얻어오기
2. Lua Script로 부터전역변수 얻어오기 • 이전 구문이 위의 내용으로 축약이 가능하다 • Data를 뽑는 기능은 이미 만들어져 있는 함수들이 있다.(제대로 안돌아가는 부분은 개인적으로 수정했음) 지원하는 함수
2. Lua Script로 부터전역변수 얻어오기 • 1번 예제를 살펴보고, 사용한다0번 예제와 같은 방식이 궁금하다면LuaHelperFunction.h를 살펴보자Script 파일은 “Script.lua”이다. • 1번 예제서 다음과 데이터들을 뽑아내는 예제가 있다. • 정수, 실수(double), 문자, 문자열, bool • Table , Associate Table로 부터data 뽑기 이것을 활용하면 최소한 게임의 속성값들에 대한 조율이 가능하다.
Cpp에서 사용하는 함수를 Lua노출하여 사용할수 있다. 이 방법을 알아보자. 3. Cpp의 함수를 Lua에서사용하기
3. Cpp의 함수를 Lua에서사용하기 • Lua에서 사용할 함수를 등록하는 부분(두 함수의 색이 다른것은신경쓰지말것) • 함수 등록시, 첫 인자는 LuaState, 둘째는 Lua서 사용할 함수이름, 셋째는 Cpp에 있는 함수이름
3. Cpp의 함수를 Lua에서사용하기 일반적으로 Lua에서 사용되는 함수는 위와 같이return 자료형int, 인자 lua_State*, 이어야 하며 return 값은 Lua에서 return 받을 인자의 개수 이다.
3. Cpp의 함수를 Lua에서사용하기 • Lua에서 인자를 넘겨주는 함수라 해도방금전에 설명했던 함수형태와 같다. • 인자값은 위와 같이 Lua Stack을 이용해값을 전달받고 사용한다.
Class를 사용하기 위해서 사용한다.Luabind를 책에는, 미사어구들을 붙여놨지만… 개인적으론, Lua의 지옥은 여기서 부터였다. Orz 4. LuaBind
(0). Luabind설정하기 • Luabind를 사용하기 위해서 몇가지설정해야 할것들이 있다.Lua,Boost,Luabind와 관련된 파일들이다. • 직접 프로젝트에 추가시켜도 좋고(예제들은 직접적으로 프로젝트에 다 추가했음)옵션에서 한번 설정으로쉽게 하는 방법이 있다.개인적으로는 후자를 추천한다. • 지금 이곳에 적는 기준은 닷넷2003 기준이다.
A.포함 디렉토리, 라이브러리 디렉토리 설정C. Luabind코드 추가 • 다음 페이지에 나오는 A 방법 또는 B 방법중 하나를 택해디렉토리 설정을 한다. • Luabind코드를 Lib 로 만들어 사용하는방법소스코드를 프로젝트에 직접 추가하여사용하는 방법중 하나를 택하여 쓴다.
A.프로젝트에 직접 추가하는 방법 • 내용 • ../common; • ../common/boost_1_33_1; • ../common/luabind; • ../common/lua5_1_2_Win32_vc7_lib/include
A.프로젝트에 직접 추가하는 방법 • 내용 • ../common/lua5_1_2_Win32_vc7_lib
C. Luabind코드 추가하기 • A, 나 B 방법을 통해, 폴더를 지정했으리라생각한다. 다음은 할것은 아래에 있다. • \Common\Luabind\src에 있는 모든 소스를추가해서 사용하던지, 이 소스를 lib로 만들어 사용해야한다.\Common\lua5_1_2_Win32_vc7_lib\LuaBindFiles.lib로 만들어 놨으니 이것을 추가해도된다.예제는 이것을 사용한다( #pragma comment (lib,”LuaBindFiles.lib”) )
C. Luabind코드 추가하기 이전 방법을 택했으면, 이부분은 건너 뛰어도 좋다 (소스를 추가 하는 방법) • 단점이 소스가 길어지면, 컴파일 하는데 2분이 걸리기도 한다.debug 폴더 용량이,100메가를 넘기도 한다.(simple soccer를 스크립트로 바꾸는데 겪었던 경험)
(1). 함수 노출 일단 본문 부터 살펴보자 인자 데이터형 Return 형 lua_State* module 내의 구문이 함수 노출 하는 부분
(1). 함수 노출 각 함수가 어떻게 노출되고 있는지, 이전 페이지를 살펴보며확인해 보기 바란다.
(1). 함수 노출 스크립트 소스와 실행 부분
(2). Class 노출 • 어떤 class 객체의 이름이 instance라고 하자이 객체는 attribute 라는 멤버 변수를 가졌고, method() 라는 메소드(멤버함수)를 가졌다고 예를 들자. 이들을 접근 하는 방법은 다음과 같다. • 멤버 변수 접근법 • instance.attribute • 메소드 접근법 • instance:method()
(3).Script에서 Class 정의하기 • Lua Script에서 Class를 정의하면모든 class는 접근권한이 기본적으로public 이다.
(3).Script에서 Class 정의하기 • 이전까지와 별다른 내용은 없다.
(3). Animal class 정의 스크립트 소스임
(3).Animal class를 상속받는 Pet class 스크립트 소스임
아직 작성하지 못한부분 • 스크립트를 이용해 FSM을 만든 예제가 있으나 아직 추가 하지 못했음. • 차후에 다시 작성하여 자료를 올리도록 하겠음(luabind::object 를 사용하는 부분)
D. 주의 사항 • 개인적으로 아직도 경험이 부족하지만Luabind를 class와 연동해서 사용할때 #define LUABIND_NO_RTTI 닷넷2003은 위 define문을 꼭 써주자.(2005는 상관없음) • 또한 다른 코드들과 엉켜서 같이 컴파일되면, 해괴한 컴파일 오류를 볼수있음(libcmt.lib를 무시하는것으로어떤것은해결이되지만, 안되는 경우도 있음)
D. 주의 사항 • Class , 함수, 변수 등등 너무 많은 것들을(대략 400라인정도) Luabind를 이용해노출해주면 아래와 같은 Error를 볼수있다.(아직 해결책은 찾지 못했음)
D. 주의 사항 • luabind::object를 사용해서 연관테이블로함수를 사용할경우인자값은1개만 가능하다. 2개이상일경우에는컴파일시 에러를 내버린다.