*Love 프레임워크 구조

 

Love 프레임워크는 C++ 로 작성되었다. love를 다운로드 받은 폴더를 보면 C++의 SDL2이나 OpenAL 라이브러리 등 C++의 dll이 사용되었다. Lua의 스크립트로 love 프레임워크를 직접 구동하는 방식으로 빠른 속도를 보여준다. lua도 스크립트지만 속도가 빠른 언어라서 상성이 좋다.

 

* 실행환경

 

- 이 포스팅의 코드를 실행하기 위해서 루아와 Love 프레임워크 그리고 atom 텍스트 에디터의 설치가 필요하다. 설치는 아래의 링크를 참고한다.

*링크 - 루아(Lua) 프레임워크 | Love 2D 게임엔진 설치와 테스트 | 윈도우10 (tistory.com)

 

루아(Lua) 프레임워크 | Love 2D 게임엔진 설치와 테스트 | 윈도우10

게임 개발환경 설치 Love2 는 루아(Lua)에서 사용할 수 있는 2D게임 엔진이다. Love 2D 게임엔진을 사용해 게임을 제작하기 위해서는 루아와 러브 프레임워크를 설치해야 한다. 1) 첫번째 루아를 설치

digiconfactory.tistory.com

* Love 의 게임루프

 

게임루프를 게임 프로그래밍의 기본 원리다. 모든 게임은 게임루프라는 구조의 무한루프를 돌고 있다. 게임이 시작되면 초기화 후에 update -> draw -> event handling -> update -> draw ... 의 형태를 갖는 무한루프가 실행되는데 이를 Game Loop 라고 한다. 세부적인 구현에 차이가 있겠지만 모든 비디오게임의 기본 구조는 아래 그림과 같은 게임루프가 기본이다.

 

윈도우 프로그램과도 비슷하다. 창이 열리면 마우스를 클릭하거나 키보드를 입력할 때 event 를 처리하고 event 결과에 따라 게임내용을 update 해서 새로운 내용의 그림을 그려준다. (draw)

 

출처: 알 스웨이가트의  파이게임 베이식

그러면 이 구조를 만들어야 하는데 love 게임엔진이 미리 준비한 메소드를 오버라이드 해서 손쉽게 사용할 수 있다.

 

-- 초기화 블록
function love.load()

end

-- 게임 업데이트
function love.update(dt)

end

-- 게임 draw
function love.draw()

end

 

게임 업데이트에 dt 라는 매개변수가 있는 것을 볼 수 있다. 이는 dt (delta-time)이라는 특별한 매개변수이다. dt는 마지막에 호출된 이후의 시간을 반환하는데 프로세서의 성능에 따라 차이가 있다. 아래와 같이 테스트해볼 수 있다.

 

 

temp는 dt 값을 의미하는데 love 의 문서상에는 0.01 정도라고 하는데 테스트 환경에서는 0.0069 정도가 일관되게 나왔다. (6.9밀리 세컨 약 1000분의 7초다) 프레임으로는 142 FPS 정도 나오는데 143Hz인 테스트 환경의 모니터 주사율과 거의 일치했다.

 

주사율을 60으로 바꿔서 테스트하니 값이 바뀌었다. 다시 계산을 해보니 주사율 60에 근사한 59.88 Hz가 나온 것으로 봐서는 dt 값이 특정한 값으로 설정되어 있는게 아니라 프로세서의 성능 범위 안에서 모니터 주사율과 상관이 있는 것으로 보인다. 

 

 

도형 그리기

SDL2 라이브러리에는 기본 도형에 대한 그리기 함수들이 포함되어 있다. love에서도 사용할 수 있는데 2D 그래픽의 매개변수 형식은 비슷하다. 도형이 좀 지루하게 보이지만 캐릭터에 대한 확실한 개념을 잡기에는 도형이 좋다. 도형의 좌표와 크기를 스프라이트로 바꾸면 바로 게임 캐릭터가 된다.

 

닌텐도의 영웅 콧수염 아저씨도 메모리에 좌표와 사이즈를 가진 스프라이트다

아래의 코드는 사각형(rectanlge)을 출력한다. 매개변수는 mode, x, y, width, height 로 다른 gui 의 매개변수와 크게 차이가 없다. fill 모드로 100, 100 좌표에 너비 200 높이 100의 사각형을 그린다. 크기의 단위는 pixel 이다. love.draw() 함수에 구현한다. x, y 좌표가 우상단에서 좌하향하는 것에 주의한다. SDL2 를 사용한 대부분의 2D 그래픽에서 사용하는 좌표는 우상단 좌표가 0, 0 이다. 너비와 높이에도 똑같이 적용한다. 너비를 늘리면 오른쪽으로 늘어나고 높이를 늘리면 아래쪽으로 늘어난다.

 

function love.draw()
  love.graphics.rectangle("fill", 100, 100, 200, 100)
end

사각형이 fill (채우기) 모드로 그려진 것을 볼 수 있다. 단순히 한번 그려진게 아니라 현재 테스트 환경에서 1초에 144번 그려지고 있는 게임 루프에 들어와 있는 것이다. 여기에 키보드나 마우스의 이벤트를 도형의 좌표와 연결시키면 캐릭터 처럼 조작할 수 있을 것이다.

 

mode를 "fill" 이 아니라 "line" 으로 주면 아래와 같이 선으로 그린다. default color는 흰색임도 알 수 있다.

 

 

Love 게임엔진의 좌표(coordinate) 체계에 대하여 설명하면 타이틀바 아래 왼쪽 모서리가 0, 0이다.

 

x=0, y=0 이라고 표현하는게 좋겠다. x가 증가하면 오른쪽으로 도형이 이동하고 y가 증가하면 도형은 아래쪽으로 이동한다. 이 단순한 좌표 체계에 익숙해질 필요가 있다.

 

 

 

아래와 같이 x 좌표를 update마다 1씩 증가시키면 1초에 144px 만큼 오른쪽으로 이동하는 것을 볼 수 있다. 정확히는 이동하는 것 처럼 보인다. 매초 144번씩 전체 화면을 지우고 1px 오른쪽에 새로 도형을 그리는 반복 작업이니까. 이 원리를 알면 2D 게임의 원리에 적응이 수월하다. 게임의 알고리즘은 자세히 알면 알수록 좋다. 이 단순함이 다양한 패턴으로 반복되는 과정에서 화려한 그래픽이 탄생하는 것이니까.

 

 

rectangle 메소드는 단순하지만 love 게임엔진이 제공하는 유용한 도구이다. 아래 링크에는 게임제작에 사용가능한 다양한 함수의 사용법을 정리해놓았다. 다른 온라인 documentation 보다 웹사이트의 디자인에 대하여도 신경을 쓴 흔적이 보인다. 각 레퍼런스를 찾기 쉽게 웹문서의 이름도 love.graphics.rectangle 로 들어갈 수 있다.

 

뭔가 같은 파이썬의 Pygame 보다 웹의 디자인이 좋으니까 라이브러리도 마음에 든다.

 

링크 Love 2d 게임엔진 wiki - love.graphics.rectangle - LOVE (love2d.org)

 

rectangle 함수의 사용법이 나와있다.

웬문서에 나와있는 사용법만 잘 읽어도 게임을 만들 수 있다. 내용이 많기 때문에 하루아침에 다 볼수는 없을 것이다. 요즘같이 다양한 프레임워크와 수만개의 레퍼런스가 개발되있는 시대에 함수 이름을 암기해서 프로그램을 개발하는 사람은 아마 없을 것이다.

(혹시 천재가 있을지도 모르니까...)

 

필요할 때 내가 원하는 모듈을 검색해서 사용할 정도의 능력이면 충분하다. 물론 많이 사용하는 함수는 금방 손이 기억할 것이다. 시간이 될때 documentation 을 열심히 읽어두자. 중요한 것은 테스트를 해서 코드를 정리해 두는 것도 하나의 방법이다. love 의 경우 함수마다 간단한 예제코드가 있으니 참고한다.

 

1번 튜토리얼은 여기까지다.

 

2번째 튜토리얼은 원 그리기를 활용한 초보자 튜토리얼을 계속 진행한다. 

공유하기

facebook twitter kakaoTalk kakaostory naver band