lua script cpp 서 사용하기

43
Lua 5.1.2 버버 버버버 2007.07.16 버버버버 – Programing Game AI by Example 작작작 : 10thP 작작작

Upload: avram-murphy

Post on 03-Jan-2016

74 views

Category:

Documents


4 download

DESCRIPTION

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 는 서로 다르다 . - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Lua  script  cpp 서 사용하기

Lua 5.1.2 버전작성일 2007.07.16참고서적 – Programing Game AI by Example작성자 : 10thP 김성재

Page 2: Lua  script  cpp 서 사용하기

Lua 와 Cpp 간의 인터페이스 하는 원리

Page 3: Lua  script  cpp 서 사용하기

1. C / C++ 과 인터페이스 하기

직접적으로 data 를 소통 할 수 없을 만큼 Cpp 과 Lua 는 서로 다르다 .

그래서 Lua 와 Cpp 는 virtual stack 을 사용해 data 를 간접적으로 주고 받는다 .

Virtual stack 은 스크립트의 요구에 따라커지거나 줄어 들수 있다 . ( 기본크기는 20 이다 . Lua.h 에 정의되어있음 )

Page 4: Lua  script  cpp 서 사용하기

Lua 와 Cpp 가 data 를 주고받는과정

Name = “Creator”

1. c++ 함수는 문자열 Name 를 Lua Stack 에 넣는다 .

2.Lua 는 Stack 을 읽고 문자열 Name 를 찾는다

3.Lua 는 전역 테이블에서 Name 의 값을 찾고 Name 에 지정된값 “ Creator” 를 Stack 에 넣는다 .

4.C++ 함수는 문자열 “ Creator” 를 Stack 의 맨위에서 가져간다

다른 어떤것을 해도 과정이 복잡 해질 수 있어도 본질적으로는 같다 .

Page 5: Lua  script  cpp 서 사용하기

Lua Stack 의 index

-1 이 최상위이며 , 1 이 최하위 이다 . 양수값을 사용하려면 스택의 크기를 알아야 하므로

음수 값을 사용 하는 것이 더 편하다 .

Page 6: Lua  script  cpp 서 사용하기

기본적인 방법으로 data 를 뽑아내기 .위 방법을 함수화 하여 쉽게 data 를 뽑아내기 .

Page 7: Lua  script  cpp 서 사용하기

2. Lua Script 로 부터 전역변수 얻어오기

Page 8: Lua  script  cpp 서 사용하기

2. Lua Script 로 부터 전역변수 얻어오기

이전 구문이 위의 내용으로 축약이 가능하다 Data 를 뽑는 기능은 이미 만들어져 있는 함수들이 있다 .

( 제대로 안돌아가는 부분은 개인적으로 수정했음 )

지원하는 함수

Page 9: Lua  script  cpp 서 사용하기

2. Lua Script 로 부터 전역변수 얻어오기

1 번 예제를 살펴보고 , 사용한다0 번 예제와 같은 방식이 궁금하다면LuaHelperFunction.h 를 살펴보자Script 파일은 “ Script.lua” 이다 .

1 번 예제서 다음과 데이터들을 뽑아내는 예제가 있다 . 정수 , 실수 (double), 문자 , 문자열 , bool Table , Associate Table 로 부터 data 뽑기이것을 활용하면 최소한 게임의 속성값들에 대한 조율이 가능하다 .

Page 10: Lua  script  cpp 서 사용하기

Cpp 에서 사용하는 함수를 Lua 노출하여 사용할수 있다 .이 방법을 알아보자 .

Page 11: Lua  script  cpp 서 사용하기

3. Cpp 의 함수를 Lua 에서사용하기

Page 12: Lua  script  cpp 서 사용하기

3. Cpp 의 함수를 Lua 에서사용하기

일반적으로 Lua 에서 사용되는 함수는 위와 같이return 자료형 int, 인자 lua_State*, 이어야 하며 return 값은 Lua 에서 return 받을 인자의 개수 이다 .

Page 13: Lua  script  cpp 서 사용하기

3. Cpp 의 함수를 Lua 에서사용하기

Lua 에서 인자를 넘겨주는 함수라 해도방금전에 설명했던 함수형태와 같다 .

인자값은 위와 같이 Lua Stack 을 이용해값을 전달받고 사용한다 .

Page 14: Lua  script  cpp 서 사용하기

3. Cpp 의 함수를 Lua 에서사용하기

Page 15: Lua  script  cpp 서 사용하기

Class 를 사용하기 위해서 사용한다 .Luabind 를 책에는 , 미사어구들을 붙여놨지만…

개인적으론 , Lua 의 지옥은 여기서 부터였다 . Orz

Page 16: Lua  script  cpp 서 사용하기

(0). Luabind 설정하기

Luabind 를 사용하기 위해서 몇가지설정해야 할것들이 있다 .Lua,Boost, Luabind 와 관련된 파일들이다 .

직접 프로젝트에 추가시켜도 좋고( 예제들은 직접적으로 프로젝트에 다 추가했음 )

옵션에서 한번 설정으로쉽게 하는 방법이 있다 .개인적으로는 후자를 추천한다 .

지금 이곳에 적는 기준은 닷넷 2003 기준이다 .

Page 17: Lua  script  cpp 서 사용하기

A. 포함 디렉토리 , 라이브러리 디렉토리 설정C. Luabind 코드 추가

다음 페이지에 나오는 A 방법 또는 B 방법중 하나를 택해디렉토리 설정을 한다 .

Luabind 코드를 Lib 로 만들어 사용하는방법소스코드를 프로젝트에 직접 추가하여사용하는 방법중 하나를 택하여 쓴다 .

Page 18: Lua  script  cpp 서 사용하기

A. 프로젝트에 직접 추가하는 방법

내용 ../common; ../common/boost_1_33_1; ../common/luabind; ../common/lua5_1_2_Win32_vc7_lib/

include

Page 19: Lua  script  cpp 서 사용하기

A. 프로젝트에 직접 추가하는 방법

내용 ../common/lua5_1_2_Win32_vc7_lib

Page 20: Lua  script  cpp 서 사용하기

B. 한방에 해결하는 방법

Page 21: Lua  script  cpp 서 사용하기

B. 포함 파일

Page 22: Lua  script  cpp 서 사용하기

B. 라이브러리 파일

Page 23: Lua  script  cpp 서 사용하기

C. Luabind 코드 추가하기

A, 나 B 방법을 통해 , 폴더를 지정했으리라생각한다 . 다음은 할것은 아래에 있다 .

\Common\Luabind\src 에 있는 모든 소스를추가해서 사용하던지 , 이 소스를 lib 로 만들어 사용해야한다 .\Common\lua5_1_2_Win32_vc7_lib\LuaBindFiles.lib 로 만들어 놨으니 이것을 추가해도된다 .예제는 이것을 사용한다( #pragma comment (lib,”LuaBindFiles.lib”) )

Page 24: Lua  script  cpp 서 사용하기

C. Luabind 코드 추가하기이전 방법을 택했으면 , 이부분은 건너 뛰어도 좋다

( 소스를 추가 하는 방법 )

Page 25: Lua  script  cpp 서 사용하기

(1). 함수 노출

Page 26: Lua  script  cpp 서 사용하기

(1). 함수 노출

일단 본문 부터 살펴보자

module 내의 구문이 함수 노출 하는 부분

lua_State*

인자 데이터형

Page 27: Lua  script  cpp 서 사용하기

(1). 함수 노출

각 함수가 어떻게 노출되고 있는지 , 이전 페이지를 살펴보며확인해 보기 바란다 .

Page 28: Lua  script  cpp 서 사용하기

(1). 함수 노출

스크립트

소스와

실행

부분

Page 29: Lua  script  cpp 서 사용하기

(2). Class 노출

Page 30: Lua  script  cpp 서 사용하기

(2). Class 노출

어떤 class 객체의 이름이 instance 라고 하자이 객체는 attribute 라는 멤버 변수를 가졌고 , method() 라는 메소드 ( 멤버함수 ) 를 가졌다고 예를 들자 . 이들을 접근 하는 방법은 다음과 같다 .

멤버 변수 접근법 instance.attribute

메소드 접근법 instance:method()

Page 31: Lua  script  cpp 서 사용하기

(2).Class 노출 예제

Page 32: Lua  script  cpp 서 사용하기

(2). 노출된 Class 의 내용

Page 33: Lua  script  cpp 서 사용하기

(2). 노출된 Class 의 내용

Page 34: Lua  script  cpp 서 사용하기

(2). 예제 Script 내용

Page 35: Lua  script  cpp 서 사용하기

(3).Script 에서 Class 정의하기

Page 36: Lua  script  cpp 서 사용하기

(3).Script 에서 Class 정의하기

Lua Script 에서 Class 를 정의하면모든 class 는 접근권한이 기본적으로public 이다 .

Page 37: Lua  script  cpp 서 사용하기

(3).Script 에서 Class 정의하기

Page 38: Lua  script  cpp 서 사용하기

(3). Animal class 정의

스크립트 소스임

Page 39: Lua  script  cpp 서 사용하기

(3).Animal class 를 상속받는 Pet class

스크립트 소스임

Page 40: Lua  script  cpp 서 사용하기

아직 작성하지 못한부분

스크립트를 이용해 FSM 을 만든 예제가 있으나 아직 추가 하지 못했음 .

차후에 다시 작성하여 자료를 올리도록 하겠음 (luabind::object 를 사용하는 부분 )

Page 41: Lua  script  cpp 서 사용하기

D. 주의 사항

개인적으로 아직도 경험이 부족하지만Luabind 를 class 와 연동해서 사용할때

#define LUABIND_NO_RTTI 닷넷 2003 은 위 define 문을 꼭 써주자 .(2005 는 상관없음 )

또한 다른 코드들과 엉켜서 같이 컴파일되면 , 해괴한 컴파일 오류를 볼수있음(libcmt.lib 를 무시하는것으로 어떤것은 해결이되지만 , 안되는 경우도 있음 )

Page 42: Lua  script  cpp 서 사용하기

D. 주의 사항

Class , 함수 , 변수 등등 너무 많은 것들을( 대략 400 라인정도 ) Luabind 를 이용해

노출해주면 아래와 같은 Error 를 볼수있다 .( 아직 해결책은 찾지 못했음 )

Page 43: Lua  script  cpp 서 사용하기

D. 주의 사항

luabind::object 를 사용해서 연관테이블로함수를 사용할경우 인자값은 1 개만 가능하다 .

2 개이상일경우에는컴파일시 에러를 내버린다 .