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