본문 바로가기

프로그래밍/C/C++/API

[C/C++/API] 함수포인터 사용과 예제

함수 포인터란?

기본적으로 사람들이 자주 사용하는 변수 포인터와 같은 개념이다.

하지만 다른게 있다면 인자를 받을 수 있고 함수포인터를 사용함으로서 게임 프로그래밍에 분기 조절을 쉽게 할 수 있다.

함수포인터를 사용하지 않고(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 라도 해서

한번씩 돌려 보기를 권장한다.