안녕하세요. 안영기입니다..
이번에 출품한 '대변 파이터' 소스와 무삭제 원판입니다...
무삭제판에서 달라진 점은 그냥 게임해 보시면 아실테고..
제 소스는 주석이 없는 관계로..(스스로는 Self Document라고 우김)
소스와 class 계층 구조를 여기서 설명 하겠습니다...
SHITFGHT.PAS : 이 게임의 메인 프로그램으로 모든 객체의 정의가 있습니다.
SUBPRO.PAS : 게임에 쓰이는 저수준 그래픽 라이브러리입니다.
거의 어셈블리어로 짜여졌습니다.
KEYBOARD.PAS : 저수준 키보드 제어 라이브러리입니다.
HANSUB.PA S : 조합형 한글 출력 루틴입니다. 저는 6 * 2 * 2 벌을 썼습니다.
'또다른..' 때부터 사용한 겁니다.
TMFUNIT.PAS : 음악 출력 루틴입니다. TMF 1.0 포맷을 지원하며 동생이 C 로
만든 것을 다시 Pascal로 옮겼습니다. ( 버그도 잡고.. )
먼저, 소스는 Boland Pascal 7.0 입니다.
6.0 가지신 분은 선조로 부터 계승 받는 'inherited' 명령어를 손보셔야
할겁니다. 그리고 'assigned'라는 명령어도 고쳐야 할 겁니다.
방법은, 'inherited' 경우에는 선조의 class 명을 다 써 주시면 될 겁니다.
그? ?고 'assigned(x)'는 'x </pre><pre> nil'로 바꾸시면 될 거고..
계층은 다음과 같습니다..
TTile ( 기본적인 타일의 속성을 가집니다. )
│
TCharacter ( 화면에 나오는 기본적인 캐릭터를 위한 class 입니다.)
│
├─────┐
│ TObject ( 총알이나 아이템에 대한 class 입니다. )
│
TEnemy ( 적들의 움직임 등을 나타낸 class 입니다. )
│
TFriend ( 주인공의 움직임 등을 나타낸 class 입니다. )
그리고 멤버 함수는 다음과 같습니다.
constructor init;
// 생성자 함수
destructor done; virtual;
// 소멸자 함수
function isValid : boolean; virtual;
// 만약 객체가 유효하지 않다면 거짓을 돌림
function returnX : integer;
// X 좌표 돌림
function returnY : integer;
// Y 좌표 돌림
function returnCenterX : integer;
// 실제 캐릭터의 중심 X 좌표를 돌림
function returnCenterY : integer;
// 실제 캐릭터의 중심 Y 좌표를 돌림
procedure moveXY;
// (x1,y1) 만큼 상대 좌표로 캐릭터를 이동
procedure warpXY;
// (x,y) 로 절대 좌표 ? 絹?
procedure displayImage; virtual;
// 캐릭터 출력
function chechCrash;
// 충돌 체크
function AImoving : boolean; virtual;
// 움직임을 정의
procedure jumpAction;
// 뛰는 동작 정의
procedure shootWeapon(vx, vy : integer); virtual;
// 쏘는 동작 정의
procedure shootSpecialWeapon;
// 특수 무기 정의
procedure setLevel(level : byte);
// 레벨을 설정
function getLevel : byte;
// 현 레벨을 돌림
실제 캐릭터를 움직이는 부분에 주석을 붙이면 다음과 같습니다.
for i := MAX_ENEMY downto MIN_OBJECTS do begin // 모든 객체에 대해서
if assigned(objects[i]) then // 객체가 있다면
with objects[i]^ do begin // 그 객체에서
if AImoving then begin // 움직이는데 문제가 없으면
if isValid then begin // 객체가 유효하면
jumpAction; // 뛰는 동작을 하고
displayImage; // 화면에 출력하고
end else b egin // 유효하지 않으면 소멸
dispose(objects[i],done); objects[i] := nil;
end;
end else begin // 움직임이 안되면 소멸
dispose(objects[i],done); objects[i] := nil;
end;
end;
end;
간단하죠.. 이것이 OOP 의 위력이라고 할 수 있습니다.
아니.! 엄연히 총알과 주인공은 다른데 어떻게 같은 함수를 쓰는가 하고
의문을 가지시는 분이 있을는지 모르겠는데, 뒤에 'virtual' 이란
인자가 붙은 함수는 후손에서 재정의가 가? ?하므로 이렇게 되는 겁니다.
이런 식의 단순 상속만으로도 슈팅 게임은 만들어집니다.
만약 이해가 안되시면 소스를 더 잘 분석해 보시고... 나아가서는
더 많은 상속을 통해 다른 기능도 넣을 수 있을 겁니다.
또, 아이템이나 다른 것들을 추가 할 때도 상속 받은 후 가상 메쏘드 부분만
손대 주면 금방 새로운 캐릭터가 탄생하죠..
OOP는 여러모로 생산성이 좋은 프로그래밍 방법입니다.
사실 저도 RPG 에서는 많이 썼어도 슈팅에 쓰는 것은 처음입니다.
( 슈팅을 만든 것도 처음이군요..^^; )
소스에 주석이 없어서 중요한 부분 만 장황하게 설명했는데.. 실제
파스칼을 쓰시는 분이 얼마나 될지 의문이군요.. 주로 C 와 비교하게
되는데 서로 서로 장단점이 많은 언어입니다...
유럽에는 Pascal을 더 많이 쓴 다죠. 하지만 국내에서는 한물간 언어죠.. ^^;
어쨌든 이 소스가 게제동 회원 님들의 게임 제작에 도움이 되었으면 하는
바램입니다. 다음에 소스를 공개 할 때는 여러분들이 잘 이해하기 쉬운
C++로 해보도록 노력하겠습니다. 그리고 '데자뷰'의 소스도 기대해 주시고..
그리고, 소스에 대한 질문은 받지 않겠습니다. 스스로 분석하세요..
또, 게제동 이외의 곳에 올릴 때는 저의 허락을 받아 주세요.. ^^;
그럼... SMgal.. ( 이 내용은 source.cap 에 포함되어 있습니다. )