2013-10-03 1 views
2

내 게임 엔진 용 인터페이스는 HTML 및 자바 스크립트와 비슷한 마크 업 언어와 루아를 사용하여 만들어졌습니다. 따라서 시각적 요소에는 마우스 이동 또는 클릭과 같은 UI 이벤트에 대한 핸들러가 있으며 핸들러가 실행될 때마다 엔진이 컴파일되었는지 여부를 확인하고 그렇지 않은 경우 luaL_loadstring을 통해 컴파일합니다. 요소 복제 또는 할당 (this.onclick = that.onclick)으로 핸들러를 공유 할 수 있습니다.루아 C API를 통해 루아 코드를 실행하기 전에 환경 테이블을 어떻게 설정합니까?

실행하기 전에 루아 코드 청크의 환경을 어떻게 설정합니까? 아이디어는 요소 및 이벤트 관련 데이터를 청크에서 사용할 수있게 만들고 부모 UI 요소의 환경에 연결하는 것입니다. Lua 5.2 changeslua_setfenv을 제거 했으므로이를 수행하는 방법을 모르겠습니다. 함수 lua_load은 환경을 지정할 수 있지만 코드를로드하고 실행하지 않는 용도로만 사용됩니다. reference manual에서

+1

버전 5.2라고 생각합니다. – Simple

답변

7

:

당신은 다른 환경 덩어리를로드로드 (또는 LoadFile과 같은 지시어)를 사용할 수 있습니다. (C에서 청크를로드 한 다음 첫 번째 상위 값의 값을 변경해야합니다.)

업 값 설정은 lua_setupvalue으로 완료됩니다.

기능 lua_load : 당신의 질문의 끝에서,

luaL_loadfile(L, "file.lua");  /* load and compile handler */ 
lua_getglobal(L, "my_environment"); /* push environment onto stack */ 
lua_setupvalue(L, -2, 1);   /* pop environment and assign to upvalue#1 */ 
/* any other setup needed */ 
lua_pcall(L, ...);     /* call handler */ 

또한 : 그래서, 먼저 코드를로드 한 후 새로운 환경을 누르고 lua_setupvalue 당신이 전에 lua_setfenv라고 한 것과 같은 방법을 호출 환경을 지정할 수는 있지만 코드를로드하고 실행하지 않는 용도로만 사용됩니다.

실제로는 그렇지 않습니다. load (루아 함수)를 사용하면 환경을 지정할 수 있지만 lua_load (C 함수)은 그렇지 않습니다.

또한 "코드를로드하고 실행하지 않는 데에만 사용되지만"luaL_loadstring과 동일합니다. 실제로는 luaL_loadstring은 그 주위의 래퍼입니다. lua_load은 맞춤형 로더 (예 : 네트워크 또는 압축 파일에서 코드로드)를 구현하는 데 사용할 수있는 하위 수준 API 함수입니다. 따라서 lua_pcall으로 코드를 실행하기 전에 luaL_loadstring 코드를로드하는 것이 편한 경우, lua_load을 잘 알고 있어야합니다.

+0

만나서 반갑습니다. – lhf

+0

아직 테스트하지 못했지만 솔루션을 구현했습니다. 감사! – jorgander

+0

루아 5.3에서 어떻게합니까? lua_setupvalue()는 코드를 시도 할 때 항상 NULL을 반환합니다. :-( – Stigma