이번에는 C++에서 작성한 루아 글루 함수를 루아 스크립트에서 활용하는 방법을 알아 볼까 합니다.
루아 글루 함수가 유용하게 쓰이려면,
루아 스크립트에서 함수에 전달한 매개변수들을 루아 글루 함수에서 가져올 수 있어야 한다.
루아는 루아 스택을 통해서 매개변수들을 전달한다.
루아 글루 함수의 매개변수는 루아가 지원하는 어떠한 자료 형식이라도 가능하다.
루아의 모든 수치들은 C++에서 double이되며, 문자열은 널 종료 문자열이 된다.
테이블이나 사용자 자료(userdata) 형식도 매개 변수로 사용될 수 있지만, 이 부분은 설명하지 않겠다.
먼저, 루아 스택으로 부터 데이타를 가지고 오는 함수들을 알아 보자.
int luaL_optint (lua_State* L, int narg, int d);
long luaL_optlong (lua_State* L, int narg, long d);
lua_Integer luaL_optinteger (lua_State* L, int narg, lua_Integer d);
lua_Number luaL_optnumber (lua_State* L, int narg, lua_Number d);
const char* luaL_optstring (lua_State* L, int narg, const char *d);
const char* luaL_optlstring (lua_State* L, int narg, const char* d, size_t* l);
int luaL_checkint(lua_State* L, int narg);
lua_Integer luaL_checkInteger(lua_State* L, int narg);
lua_Number luaL_checkNumber(lua_State* L, int narg);
const char* luaL_checkstring(lua_State* L, int narg);
const char* luaL_checklstring(lua_State* L, int narg, size_t* len);
http://www.lua.org/manual/5.1/ 에 나와있는 것들중에 관련 있어 보이는 함수들의 원형을 나열했습니다.
루아 래퍼런스 매뉴얼인데, 인자값들의 용도에 대해서 자세히 설명이 되어 있지 않네요 ㅠㅠ
L : 루아 환경 변수 포인터
narg : 스택에서 몇번째 인자인지
d : 오류 발생시 처리 값
l : 문자열의 크기
이상의 인자에 대한 정리는 예제 소스를 실행 해보면서 제가 추측한 것 입니다.
틀릴 수도 있으니 양해 바랍니다. ~
이제 영문 자료(자료를 마구 받다보니 출처를 까먹음 ㅠㅠ)를 참조하여 작성한 예제를 보여주고
설명 할까 하네요 ^^*
// 게임의 NPC 이름을 등록하고 삭제하는 프로그램을 루아와 연동하여 처리
// 시스템 헤더 포함
#include <iostream>
#include <list>
using namespace std;
// 루아 헤더 포함
extern "C" {
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
}
// NPC Name List
list<const char*> gpNPCName;
int gIndxNPC;
// NPC 이름을 찾아서 지우는 함수
int _FindDelNPC(const char* pName)
{
list<const char*>::iterator p = gpNPCName.begin();
while (p != gpNPCName.end())
{
if(0 == stricmp(*p, pName))
{
gpNPCName.erase(p);
return 0;
}
p++;
}
return -1; // 실패시
}
// 리스트에 NPC 이름을 등록
extern "C" int _addNPC(lua_State* pLuaState)
{
const char* pName = luaL_optstring(pLuaState, 1, 0);
gpNPCName.push_back(pName);
printf("addNPC Name : %s\n",pName);
return 0;
}
// NPC 이름을 삭제 함수
extern "C" int _deleteNPC(lua_State* pLuaState)
{
int nChkIndx = -1;
const char* pName = luaL_optstring(pLuaState, 1, 0);
nChkIndx = _FindDelNPC(pName);
if(-1 == nChkIndx)
{
printf("Can't find Name : %s\n", pName);
return 0;
}
printf("deleteNPC Name : %s\n", pName);
return 0;
}
// 루아글루 함수 등록을 위한 배열
static luaL_reg LuaGlue[] =
{
{"addNPC", _addNPC},
{"deleteNPC", _deleteNPC},
{NULL, NULL}
};
// 현재 등록된 NPC 이름 출력
void ViewNPC()
{
cout << endl;
list<const char*>::iterator p = gpNPCName.begin();
while (p != gpNPCName.end())
{
cout << "Now NPC : " << *p << endl;
p++;
}
cout << endl;
}
int main(void)
{
puts("Lua Console (basic) (c) 2004 Charles River Media");
puts("Enter Lua commands at the prompt, [QUIT] to exit\n\n");
// 루아 환경 생성 및 설정
lua_State *pLuaState = lua_open();
luaopen_base(pLuaState);
luaopen_io(pLuaState);
luaopen_string(pLuaState);
luaopen_math(pLuaState);
luaopen_debug(pLuaState);
luaopen_table(pLuaState);
// 루아 글루 함수 등록
for(int i=0; LuaGlue[i].name; i++)
{
lua_register(pLuaState, LuaGlue[i].name, LuaGlue[i].func);
}
lua_dofile(pLuaState, "D:\\lua_scr\\luaNPC.lua");
ViewNPC();
lua_close(pLuaState);
return 0;
}
======= 예제에 대한 설명 =======
1. 헤더 파일 포함
시스템 헤더와 루아 헤더 파일을 포함.
정리 09 참조~ (링크)
2. 해당 NPC를 찾아서 리스트에서 삭제하는 함수
해당 NPC의 이름을 인자값으로 받아와 반복자를 이용해서 처음 부터 끝까지 검색하는 도중
인자값과 동일한 이름을 발견할 경우 해당 목록을 리스트에서 삭제한다.
성공하면 0을 실패시는 -1을 반환 한다.
3. NPC 등록 루아 글루 함수
리스트에 해당 NPC를 추가 한다. 순서는 자동적으로 리스트의 맨끝으로 이동한다.
luaL_optstring(pLuaState, 1, 0); 함수를 이용하여 스크립트로 부터 문자열 인자값을 받아오고
gpNPCName.push_back(pName); 함수를 이용하여 리스트에 추가 시킨다.
4. NPC 삭제 루아 글루 함수
NPC 이름을 인자 값으로 받아서,
내부적으로는 _FindDelNPC()함수를 호출하여 해당 NPC를 찾은 후 리스트에서 삭제 시킨다.
5. 루아 글루 함수 등록을 위한 배열
루아 글루 함수 등록을 위해
루아 스크립트에서 상용될 이름과 루아 글루 함수의 이름을 쌍으로 하는 배열 묶음 쌍을 맞춘다.
6. 현재 등록된 NPC 이름 표시
리스트의 반복자를 이용하여 리스트의 처음 부터 끝까지 순차적으로 읽어나가며 화면에 출력한다.
7. 루아 환경 생성 및 설정
루아 환경을 생성(환경 변수 생성)하고 환경 변수에 루아 환경을 설정 한다.
8. 루아 글루 함수 등록
루아 글루 함수는 lua_register()로 등록 된다.
인자로 '루아 환경 변수', '스크립트에서의 이름',' C++에서의 함수'를 받는다.
9. 스크립트 파일 적재 및 실행 함수
lua_dofile(pLuaState, "D:\\lua_scr\\luaNPC.lua"); 함수를 이용하여 루아 스크립트 파일을 실행한다.
루아 스크립트 내부적으로는 NPC 이름의 추가 및 삭제 함수들이 호출 되어 있다.
10. 루아 환경 해제
루아 환경을 생성 했으면, 필요 없을 시에는 lua_close() 함수로 해제 한다.
11. 루아 스크립트 파일
-- Simple lua script
-- New C functions exposed to lua
-- addNPC("NPC Name")
-- deleteNPC("NPC Name")
print("Simple Lua Program!!")
addNPC("Joe")
addNPC("Sue")
addNPC("Kan")
addNPC("Babo")
deleteNPC("Sue")
12. 전체 실행 결과
......
'[ Programing ] > Lua Scirpt' 카테고리의 다른 글
[Lua] 날짜와 시간 함수. (0) | 2022.04.11 |
---|---|
Lua - 루아 스크립트 함수를 C++에서 호출하여 활용 (0) | 2022.03.06 |
Lua - C++ 연동 간단한 예제 (0) | 2022.03.06 |
Lua - C++과의 연동 (0) | 2022.03.06 |
Lua - 표준 라이브러리 (0) | 2022.03.06 |