메가드라이브 게임 만들기 #5 - 팩맨을 메가드라이브로 제멋대로 이식
도트 먹기 게임의 샘플 프로그램을 만들어, 블로그에 공개하려고 생각하고 있었습니다만, 좀처럼 오리지널 게임을 만들기가 어렵습니다. 아주 좋아하는 게임인 팩맨을 먼저 연구하여, 메가드라이브로 이식해 보기로 했습니다. 전파신문사의 "ALL ABOUT NAMCO"와 Root 씨가 개발한 유선당의 "DOTEAT"가 엄청나게 도움이 되었습니다.
<프로그래밍의 메인 부분>
프로그램의 메인 부분입니다.
Hard_int() 함수를 실행한 뒤, white 안에서 영구적으로 루프를 돌리는 것입니다만, 루프의 제일 마지막에 VDP_waitVSync()를 실행하는 것으로, 60분의 1초가 1사이클이 됩니다. 변수 game.state의 내용으로, 게임의 각 씬에 대응한 함수가 실행됩니다. 처리는 60분의 1초 이내에 행할 필요가 있어서, 그것을 조금이라도 오버하면 1사이클 늦게 처리 지연이 발생합니다.
알기 쉽게, 열거형으로 게임의 씬(GAME_SCENE)을 정의하고 있습니다.
<각 씬의 함수 일람>
프로그램의 내용은, 씬별로 준비한 함수에 채워넣고 있습니다.
이 메인 함수와 각 씬의 함수가, 프로그램의 기본 구조가 되어 있습니다.
아직 C언어는 공부한지 2년 정도입니다만, 저의 프로그램의 방침은 우선 전체의 기본적인 구조를 설계하고, 거기에서부터 세부의 설계를 해나간다는 것입니다.
이것은 ?체 제작과 마찬가지로, 먼저 컨트롤 패널 등의 세부를 만들어 버리면 나중에 기본 구조인 ?체를 만들 떼에 큰 문제가 일어나거나 전체의 밸런스가 나빠지거나 합니다. 우선 전체의 큰 윤곽(?체)를 만들고 나서, 컨트롤 패널 등의 세부를 설계하는 편이 보다 좋게 만들 수 있다고 생각합니다.
<함수 일람>
SGDK는 C++이 아니고 C언어이므로, 클래스는 사용할 수 없습니다. 하지만 클래스와 같은 구조를 상정하고, 함수를 Hard, Game, Round, Player, Enemy, Fruit, Panel, Sprite, Collision 과 같이 나누었습니다.
<Hard_함수, Game_함수 일람>
게임 전체를 관리하는 함수입니다.
<Round_함수 일람>
라운드(각 판)을 관리하는 함수입니다.
<Player_함수 일람>
플레이어(팩맨)의 조작과 움직임, 도트를 먹는 처리를 행하는 함수입니다.
<Enemy_함수 일람>
몬스터의 처리를 행하는 함수입니다.
<Fruit_함수 일람>
과일을 관리하는 함수입니다.
<Panel_함수 일람>
스코어 패널(화면 우측)에 스코어 표시나 잔기 표시를 행합니다.
<Sprite_함수 일람>
스프라이트의 표시, 우선순위의 설정 등을 행하고 있습니다.
<Colli_함수 일람>
충돌 판정을 행하는 함수입니다.
<변수>
변수는 위의 구조체 7개입니다.
구조상, 어떤 함수에서도 액세스할 수 있지만, 기본적으로 player는 Player_함수로부터만, enemy는 Enemy_함수로부터만 조작할 수 있도록 하고 있습니다.
이런 느낌으로 구조 설계를 하고 있습니다.
팩맨만 계속 들여다보고 있었더니, 어제 업무 관계로 읽어야만 하는 서류에 이런 일러스트가 눈에 띄었습니다. 어떻게 봐도 팩맨이군요!