함수 포인터란?
기본적으로 사람들이 자주 사용하는 변수 포인터와 같은 개념이다.
하지만 다른게 있다면 인자를 받을 수 있고 함수포인터를 사용함으로서 게임 프로그래밍에 분기 조절을 쉽게 할 수 있다.
함수포인터를 사용하지 않고(switch, if, 등) 게임 분기를 조절하려 한다면 아래와 같은 방법으로 사용 할 수 있을 것이다.
void Process(int State)
{
switch(State) {
case 0:
MainMenu();
break;
case 1:
PlayGame();
break;
case 2:
EndGame();
break;
}
}
여기서 생기는 의문점 함수포인터로 분기조절을 어떻게 할건데? 라는 의문이 생겨야된다.....(안생기면 말고..ㅡ.ㅡ..)
함수포인터로 분기조절을 한다는 말은 함수포인터 배열을 만들어서 분기를 조절한다는 뜻이다.
설명은 길게 해봤자 머리만 아프니깐 아래에 소스를 보자.
#include <stdio.h>
#include <windows.h>
enum {
STATE_MAIN,
STATE_PLAY,
STATE_END
};
enum {
STAGE_1,
STAGE_2,
STAGE_3,
STAGE_4,
STAGE_5
};
#define MAX_STATE 3
#define MAX_STAGE 5
boolean m_bPlayGame = FALSE;
typedef void (*pfFunction)(int Num, int val1, int val2); // 함수 포인터
// State
void MainMenu(int Num, int val1, int val2)
{
printf("Main Menu! StateNum: %d ,val1: %d, val2: %d\n", Num, val1, val2);
}
void PlayGame(int Num, int val1, int val2)
{
printf("Play Game! StateNum: %d ,val1: %d, val2: %d\n\n", Num, val1, val2);
}
void EndGame(int Num, int val1, int val2)
{
printf("End Game! StateNum: %d ,val1: %d, val2: %d\n", Num, val1, val2);
}
// Stage
void GameStage1(int Num, int val1, int val2)
{
printf("Play Game! StageNum: %d ,val1: %d, val2: %d\n", Num, val1, val2);
}
void GameStage2(int Num, int val1, int val2)
{
printf("Play Game! StageNum: %d ,val1: %d, val2: %d\n", Num, val1, val2);
}
void GameStage3(int Num, int val1, int val2)
{
printf("Play Game! StageNum: %d ,val1: %d, val2: %d\n", Num, val1, val2);
}
void GameStage4(int Num, int val1, int val2)
{
printf("Play Game! StageNum: %d ,val1: %d, val2: %d\n", Num, val1, val2);
}
void GameStage5(int Num, int val1, int val2)
{
printf("Play Game! StageNum: %d ,val1: %d, val2: %d\n\n", Num, val1, val2);
}
int main()
{
int i, j;
pfFunctionp StateSel[MAX_STATE]; // 함수포인터형 변수 선언
pfFunctionp StageSel[MAX_STAGE]; // 함수포인터형 변수 선언
// State
pStateSel[0] = MainMenu;
pStateSel[1] = PlayGame;
pStateSel[2] = EndGame;
// Stage
pStageSel[0] = GameStage1;
pStageSel[1] = GameStage2;
pStageSel[2] = GameStage3;
pStageSel[3] = GameStage4;
pStageSel[4] = GameStage5;
for(i=0; i<MAX_STATE; ++i) {
pStateSel[i](i, i*10, i*20);
Sleep(1000);
if(i == STATE_PLAY)
m_bPlayGame = TRUE;
if(m_bPlayGame == TRUE) {
for(j=0; j<MAX_STAGE; ++j) {
pStageSel[j](j+1, j*10, j*20);
Sleep(1000);
}
}
m_bPlayGame = FALSE;
}
}
결과 화면
소스가 길어보이지만 간단하게 State를 MainMenu, PlayGame, EndGame로 나누고 Stage를 5개 만들어 준것 밖에 없다.
그리고 for문을 돌면서 i, j 값에 맞게 State와 Stage를 함수포인터 배열에 대입해준것 뿐이다.
솔직히 switch, if 등이 더 편하지 않느냐? 라고 생각하는 사람들 꼭 있을거다.
그럼 나도 반문해보자!
자... 제작하려는 게임이 슈팅 게임이고 Stage가 100개가 있다.
switch, if등으로 처리 하고 싶은 생각이 드시는지...? ^^;;
아무리 프로그래밍이 노가다 일지라도 난 노가다는 싫다.. 그러므로 함수포인터 사용..ㅎㅎ
위에 소스는 win32 콘솔 어플리케이션을 만들어서 작성하면 바로 사용해볼 수 있는 소스이니 한번씩 ctrl+c, ctrl+v 라도 해서
한번씩 돌려 보기를 권장한다.
'프로그래밍 > C/C++/API' 카테고리의 다른 글
[C/C++/API] Virtual 키워드 (1) | 2012.07.02 |
---|---|
[C/C++/API] MFC가 아닌 소스에서 CString Class 사용 하기 (0) | 2010.05.27 |
[C/C++/API] new, delete 연산자와 포인터를 이용한 고차원 배열 동적 할당 (9) | 2010.01.28 |
[C/C++/API] C++ Programming Style Guide-line (0) | 2009.12.15 |
[C/C++/API] assert() 조건 검사 / 강제 종료 (0) | 2009.12.04 |