본문 바로가기

[ C/ C++ 프로그래밍 ]/[ 루아 ]

[ 루아 ] 루아, 좀더 알아보기 [ 참고 및 출처 ] 루아를 이용한 민첩하고 효과적인 게임 개발 ○ 함수 함수는 게임 개발 스크립트의 행동을 조직화하는 기본적인 수단이다. 함수는 하나의 식별(실제로는 하나의 변수)를 통해서 호출할 수 있는 루아 코드 블록으로, 작업에 필요한 매개변수를 전달받거나 작업의 결과를 돌려기도 한다. 함수들이 정의되어 있는 스크립트 파일을 dofile 등을 dofile 등을 이용해서 불러 올때, 그 함수들을이 실제로 실행되는 것은 아니고, 함수의 코드를 메모리에 올리고 그것을 함수 이름 변수에 배정하는 작업만 한다. - 단일 인수 fuctin SetName ( myString ) print(" ") print(" Your Name is : ", myString ) print(" ") end ※ myString는.. 더보기
[ 루아 ] 루아 입문 [ 참고 및 출처 ] 루아를 이용한 민첩하고 효과적인 게임 개발 이미 "예제로 배우는 루아책"을 통해서 앞에서 변수, 연산자등 문법에 대해서 공부했다. 여기서는 간단하게 복습하고 넘어간다. 루아 스크립트 : 루아를 담은 텍스트 파일, 확장자는 보통 .lua 탭 , 줄바꿈, 들여쓰기 등을 이용한 텍스트 포매팅 상관하지 않음 ==> 사람이 보기 쉽게 하기 위해서 명령들 사이의 빈칸은 중요 =>변수 이름과 함수 호출을 구분하기 위해 청크(chunk) : 루아에서 하나의 명령 또는 일련의 명령등(스크립트 파일 전체 등), 작을 수도 있고(print 명령하나), 수 메가바이트이상(스크립트파일 등) 될수도 있다. dofile : 주어진 스크립트 파일을 즉시 실행, 경로 구분에는 역슬래시 하나가 아니라 두개(\\)를.. 더보기
[ 루아 ] 게임 개발에서 루아의 역할 [ 참고 및 출처 ] 루아를 이용한 민첩하고 효과적인 게임 개발 '접착제'언어로 사용할 때 빛을 발한다. 루아처럼 핵심 언어의 함수와 연동함으로써 확장될 수 있는 스크립팅 언어를 그런 접착제 언어로 사용할 수 있는데, 핵심은 성능 상의 이점이 있는 C++로 속도가 중요한 함수를 작성하고, 그것을 루아에 '접착'함으로써 스크립트 프로그래머가 그런 C++함수를 사용할 수 있도록 만드는 것이다. 예) 디자이너가 3차원 물체를 게임 세계에 배치 할 있게 한다고 하면, 렌더링 시스템은 전적으로 C++로만 작성, 루아는 C++을 호출해서 특정 3차원 모형의 객체를 생성하고, 그것을 게임 세계의 특정 위치에 배치 한다. 그 3차원 물체의 애니메이션 역시 루아로 제어한다. 물체를 실시간으로 변환하는데 필요한 복잡한 수.. 더보기
[ 루아 ] 스크립팅 언어란? [ 참고 및 출처 ] 루아를 이용한 민첩하고 효과적인 게임 개발 스크립팅 언어는 컴퓨터의 기능성을 사람이 손쉽게 사용할 수 있도록 하는 수단이다. 원래 스크립팅 언어는 일괄적인 명령 수행 도구로 쓰였다. ==> 초기의 스크립팅 언어를 일괄(Batch)언어 또는 작업 제어(job-control)언어라고 불렀던 이유도 여기에서 비롯된다 ex) MS-DOS 시절의 *.bat 파일 스크립팅 언어들은 빠른 개발을 위해 쓰이며( 실행속도와 효율은 조금 희생하더라도), 비 프로그래머가 읽고 쓰기 쉬운 텍스트 기반 구문을 채용하는 경우가 많다. 핵심은, 일정한 교양을 갖춘 사용자라면 프로그래머의 개입 없이도 스스로 그크립트를 작성하고 사용할 수 있다는 점이다. 스크립팅 언어의 능력을 확장하기 위해, 다른 어떤 저수준 .. 더보기
[ 루아 ] 왜 루아인가? [ 참고 및 출처 ] 루아를 이용한 민첩하고 효과적인 게임 개발 스크립팅 언어는 소프트웨어 언제니어가 작성한, 컴파일된 코드 위의 한 계층에 놓인다. 그러한 스크립팅 언어는 실행시점에서 컴파일되는 경우가 많으며, 또한 프로그래머나 게임 디자이너가 자료를 조작, 처리하기 쉬운 단순한 언어인 경우가 일반적이다. ○ 스크립팅 언어를 사용하는 이유?? 디자이너 관점에서 볼 때, 스크립팅 언어로 게임을 개발한다는 것은 기술과 게임플레이 코드 사이의 매우 명확한 경계를 만드는 것이라 할수 있다. 스크립트를 사용하는 프로젝트에서는 저 수준의 실제 작동부를 C++ 같은 핵심 언어가 담당하고 인터페이스 처리, 자료 관리, 인공지능, 사건 처리 등의 고수준 작업은 스크립팅 언어가 담당하는 경우가 많다. 이러한 책임의 분리.. 더보기
[ 루아 ] C++ 연동 - 루아에서 C++ 호출하기 [ 참고 및 출처 ] 루아를 이용한 민첩하고 효과적인 게임 개발 루아에서 사용자가 정의한 C++ 함수를 호출할려면 lua_register 함수를 이용하면 된다. void lua_register ( lua_State *L, const cha* name, lua_CFunction f ); name : 루아에서 쓰일 함수의 이름 f : C++에서 정의한 함수 이름 ※ 루아는 모든 함수 호출에서 각각 함수에 대한 lua state를 사용한다. 함수로 넘어가는 인수가 여럿이어도 C++쪽 함수 정의부에서는 lua_State 값 한 개의 인수만 받아오면 된다. lua state의 stack에서 값을 꺼내오는 함수들은 lua_tonumber, lua_tointeger, ... 등과 같음 함수들을 이용해서 원하는 개수만.. 더보기
[ 루아 ] C++ 연동 - 2 -루아를 이용한 환경설정 - ㅇ lua state lua state를 이용하여 C++과 루아 사이의 통신을 한다. ==> 함수나 코드의 입력과 결과 관리 역시 lua state를 이용 lua state는 Stack으로 관리 한다. C++에서 lua state에 값을 넣으려면 정해진 방식을 통해야 한다. 이를 위해 사용하는 lua push 함수들은 다음과 같다. void lua_pushnil( lua_State *L ); // nil을 스택에 넣는 함수 void lua_pushnumber( lua_State *L, lua_Number n ); // 숫자값을 스택에 넣는다. void lua_pushlstring( lua_State *L, const char *s, size_T l); /// 입력한 길이 만큼 스택에 넣는다. void l.. 더보기
[ 루아 ] C++ 연동 - 1 루아 스크립트만 만들어지는 프로젝트는 극히 드물다. 일반적으로 C/C++로 주요 기능이 구현되어 있는 바탕 위에 루아가 내장되어, 아래 단에서 C/C++로 구현된 핵심 기능을 이용하여 루아로 빠르게 시나리오를 수정하거 새로운 시나리오를 만들어 내는 데 주로 사용된다. 혹은, 스크립트만 구현한 기능의 성능이 예상보다 느려서 취약한 부분을 대체하기 위하여 C/C++과 연동할 수 있고, 루아에서는 제공되지 않거나 구현 가능해도 너무 복잡한 부분을 C/C++에서 보다 쉽게 구현하여 결과를 루아 쪽으로 넘길 수도 있다. 그럼 일단 C++과 루아가 교시을 하려면 우선 변수들을 주고 받을 수 있어야 하는데 이를 담당하는 것이 lua state(루아상태)라는 구조체이다. 이 lua stat를 이용하여 C++로 작성된 .. 더보기
[ 루아 ] 코루틴 코루틴은 흔히 다른 언어에서 말하는 스레드(thread)와 비슷한 개념이다. 코루틴은 스레드와 같이 자기 자신만의 지역변수와 스택 그리고 실행 순서를 가지고 독립적으로 실행된다. 스레드와 코루틴은 큰 차이는 코루틴의 실행 모델은 비선점(non - preemptive ) 형이라는 것이다. 즉 한번 루틴이 실행되면 그 실행이 끝날 때까지 외부의 조작에 의해 실행이 중단되지 않는다는 뜻이다. 쉽게 한번 CPU Time 을 정유하면 실행이 끝나기 전에는 다른 루틴은 CPU Time을 쓸 수 없다는 말이다. 코루틴을 사용하기 위해서는 제공하는 라이브리 함수를 사용해야 한다. ㅇ 코루틴의 기본 - coroutine.create 코루틴을 생성하기 위해서 coroutine.create(f)라는 함수를 호출해야함, 매개.. 더보기
[ 루아 ] 클래스 캡슐화 루아는 캡슐화를 위해 접근제한자 같은 장치를 따로 지원하지 않는다. 대신 루아에서는 함수를 숫자처럼 변수에 담을 있다는 점과 변수의 범위를 이용하는 방법으로 비슷하게 구현 가능하다 소스 다운 -- Error --[[print(objTriangle.getWidth)__]]-- 위의 부분을 주석을 해제하고 실행하면 에러가 발생한다. Figure 클래스의 GetWidth()는 바깥으로 드러나 있지 않은 내부 멤버 함수 즉, 캡슐화가 되어 있기 떄문이다. private으로 선언한 함수와 마찬가지가 되는 것이다. 방법은 함수의 선언을 지역변수에 할당하고, 이 지역변수에 접근할 수 있는 길을 열어 주느냐 아니냐에 따라 private, public 같은 접근 제한자의 기능을 구현할 수 있는 것이다. 출처 및 참고 :.. 더보기