1 / 43

Lua script cpp 서 사용하기

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

emelda
Download Presentation

Lua script cpp 서 사용하기

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Lua 5.1.2 버전 작성일 2007.07.16참고서적 – 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를 LuaStack에 넣는다. • 2.Lua는 Stack을 읽고 문자열 Name를 찾는다 • 3.Lua는 전역 테이블에서 Name의 값을 찾고 Name에 지정된값 “Creator”를 Stack에 넣는다. • 4.C++ 함수는 문자열 “Creator”를 Stack의 맨위에서 가져간다 다른 어떤것을 해도 과정이 복잡 해질 수 있어도 본질적으로는 같다.

  5. Lua Stack의 index • -1이 최상위이며, 1이 최하위 이다. • 양수값을 사용하려면 스택의 크기를 알아야 하므로음수 값을 사용 하는 것이 더 편하다.

  6. 기본적인 방법으로 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노출하여 사용할수 있다. 이 방법을 알아보자. 3. 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. Class를 사용하기 위해서 사용한다.Luabind를 책에는, 미사어구들을 붙여놨지만… 개인적으론, Lua의 지옥은 여기서 부터였다. Orz 4. LuaBind

  16. (0). Luabind설정하기 • Luabind를 사용하기 위해서 몇가지설정해야 할것들이 있다.Lua,Boost,Luabind와 관련된 파일들이다. • 직접 프로젝트에 추가시켜도 좋고(예제들은 직접적으로 프로젝트에 다 추가했음)옵션에서 한번 설정으로쉽게 하는 방법이 있다.개인적으로는 후자를 추천한다. • 지금 이곳에 적는 기준은 닷넷2003 기준이다.

  17. A.포함 디렉토리, 라이브러리 디렉토리 설정C. Luabind코드 추가 • 다음 페이지에 나오는 A 방법 또는 B 방법중 하나를 택해디렉토리 설정을 한다. • 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* 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개만 가능하다. 2개이상일경우에는컴파일시 에러를 내버린다.

More Related