[App 개발] OpenGL 을 이용한 게임 만들기 (1) - 2D 맵
본문
Mac OS X 뿐만 아니라 여러 다양한 플랫폼에서 산업 표준으로 이용되고 있는 OpenGL 을 이용한 게임 제작이 한창입니다. MS 의 DirectX 는 윈도우 플랫폼에서는 막강하지만, 다른 곳에서는 쓸 수 없다는 단점이 있지요. 여러 플랫폼을 동시 지원하는 것을 선호하는 오픈 소스 프로젝트에서는 OpenGL 이 애용되고 있습니다.
Mac OS 에서는 예전에는 주로 CopyBits 로 대표되는 화면 덤프 방법을 써 왔습니다. 일단 화면 밖에서 (off-screen) 다음 장면을 조성한 다음, 그것을 메인 화면에 덤프함으로써 화면 깜빡임이나 출렁거림을 없애는 기법입니다. X 에서는 Quartz 에서 비슷한 기법을 응용할 수도 있습니다만, OpenGL 이 하드웨어로 지원되고, Texture 를 비됴 메모리에서 관리하면서, 빠르고 편리하게 off screen 덤프를 할 수 있게 되었습니다.
- 2D 맵
게임의 비쥬얼한 측면은 비약적으로 발전했지만, 그 내부는 사실 대동소이합니다. 데이터 관리 측면에서 보면 사실 예전과 다를 바는 없습니다. 다만 예전보다 컴퓨터 속도가 증가하고 메모리 보유량도 커지면서 처리할 수 있는 레이어가 많이 늘어났을 뿐입니다.
게임을 조성하기 위해서는 일단 맵 데이터가 필요합니다. 주인공이 돌아다닐 배경입니다. 배경 중에는 주인공이 갈 수 있는 곳이 있고, 막혀있는 곳이 있지요. 맵 데이터는 배경에 어떤 것이 깔려 있는지, 그리고 그곳이 주인공이 지나갈 수 있는 곳인지 등의 정보를 담고 있어야 합니다.
가장 간단하게는 2 차원 배열을 이용하는 방법이 되겠습니다. 그리고 배경의 종류를 레이블로 지정하는 것이지요. 예를 들어 맨땅은 0, 수풀은 1, 벽은 2 등등으로 말이지요.
- 그림 데이터
프로그램에서는 맵을 읽어서 그 맵에 해당하는 그림 블럭을 off-screen 화면에 씌우는 작업이 필요합니다. 만약 화면이 맨땅으로 쭈욱 깔려있다면 맵 데이터 배열에는 모두 0 이 들어있겠지요. 그러면 프로그램에서는 맵 데이터를 읽고 (0) 그 값에 해당하는 그림 블럭을 가져다가 맵 데이터의 영역에 칠합니다. 따라서 게임 화면에서는 일정한 패턴이 반복되는 맨땅이 펼쳐지게 되는 것이지요.
- OpenGL 에서 구현하기
두 가지 단계를 거치게 됩니다. 먼저는 그림 데이터 (블럭 모음) 전체를 택스쳐로 등록하는 작업, 그리고 화면 랜더링시에 작은 조각들을 잘라 붙이는 작업이 되겠습니다. 여기서 요긴하게 쓰이는 함수는 glTexImage2D 와 glTexSubImage2D 가 되겠습니다. 이것을 사용하는 용법에 대해서는 애플 개발자 페이지의 TextureRange 라는 이름의 샘플 프로그램을 보시면 상세한 내용을 아실 수 있을 것입니다. 보통 OpenGL 의 텍스쳐는 크기가 8 의 배수로 되어야 하며, 512 가 최대값입니다만, 위의 함수를 이용하시면 크기를 자유롭게 조절하실 수 있으며, Raw 데이터를 곧바로 텍스쳐로 매핑하실 수 있기 때문에 편리합니다.
- 샘플 프로그램
울티마 패러티 프로그램이 있더군요. ㅡㅡ; (http://garote.bdmonkeys.net/) 다만 픽셀 데이터가 ResEdit 포맷으로 되어 있어서 저는 그것을 필요한 만큼만 잘라서 PNG 파일로 만든 다음 그것을 불러다가 사용하고 있습니다. 소스코드도 많이 참조를 했습니다만, 원래 PC 용으로 작성된 코드를 Glue 함수들을 이용하여 OS X 로 이식한 소스를 그대로 쓰지 않고, 일단 울티마 화면 배경만을 reproduce 하는 작업을 했습니다. Apple II 의 정취가 물씬 풍기는 그림 데이터이죠? ^^
샘플 프로그램을 실행해 보시고, Show Package Contents 하셔서 Resources 디렉토리에 있는 PNG 파일을 살펴보시면 대략 어떻게 프로그램을 구성했는지 이해하실 수 있을 것입니다. 물결 치는 애니메이션 효과는 간단하게 1/12 초마다 한 번씩 왼쪽으로 그림을 쉬프트했습니다.
자료의 출처는 다 밝혔으므로 따로 소스코드를 공개하지는 않겠습니다. (너무 지저분해서요. ㅠㅠ) 혹시 질문이 있으시면 따로 답변을 올리겠습니다.
프로그램은 당근 유니버설로 컴파일 했습니다. PPC 와 Intel 에서 모두 잘 돌았습니다. ^^
최신글이 없습니다.
최신글이 없습니다.
댓글목록 0