2013-06-11 3 views
-2

C++에서 간단한 게임을위한 함수 포인터를 사용하여 간단한 이벤트 인터페이스를 구현하려고합니다. 이는 allegro lib의 이벤트 인터페이스를 개선하기 위해 수행됩니다. 따라서 다음 코드를 작성했지만 작동하지 않습니다.함수 포인터를 사용하는 C++ 이벤트 처리 인터페이스

typedef void (*event_handler)(int); //type for the event handler 
const int TESTKEY_A = 1; // example Key as event arg 

class Game 
{ 
     private: 
       bool is_running ; 
     protected: 
       event_handler on_key_down[2]; 
     public: 
       void run(); 
       void do_events(int e) ; 
       void stop() {is_running = false;} 
}; 
void Game::run() 
{ 
    is_running=true; 
    while(is_running) 
     do_events(1); 
} 

void Game::do_events(int e) 
{ 
    if(e==1) 
    { 
     for(int i = 0; i < 2 ;i++) 
      on_key_down[i](TESTKEY_A); 
    } 
} 

class Pong_Game : public Game 
{ 
     public: 
       Pong_Game(); 
       void On_Key_Down_Player1(int key) { return;} 
       void On_Key_Down_Player2(int key) { return;} 
}; 

Pong_Game::Pong_Game() 
{ 
    on_key_down[0] = &this->On_Key_Down_Player1; 
    on_key_down[1] = &this->On_Key_Down_Player2; 
} 

int main() 
{ 
    Game *my_game = new Pong_Game(); 
    my_game->run(); 
    return 0; 
} 

컴파일러 로그 :

Compiler: Default compiler 
Executing g++.exe... 
g++.exe "U:\Eigene Dateien\eventhandler.cpp" -o "U:\Eigene Dateien\eventhandler.exe" -I"C:\Dev-Cpp\lib\gcc\mingw32\3.4.2\include" -I"C:\Dev-Cpp\include\c++\3.4.2\backward" -I"C:\Dev-Cpp\include\c++\3.4.2\mingw32" -I"C:\Dev-Cpp\include\c++\3.4.2" -I"C:\Dev-Cpp\include" -L"C:\Dev-Cpp\lib" 
U:\Eigene Dateien\eventhandler.cpp: In constructor `Pong_Game::Pong_Game()': 
U:\Eigene Dateien\eventhandler.cpp:45: error: ISO C++ forbids taking the address of a bound member function to form a pointer to member function. Say `&Pong_Game::On_Key_Down_Player1' 
U:\Eigene Dateien\eventhandler.cpp:45: error: cannot convert `void (Pong_Game::*)(int)' to `void (*)(int)' in assignment 
U:\Eigene Dateien\eventhandler.cpp:46: error: ISO C++ forbids taking the address of a bound member function to form a pointer to member function. Say `&Pong_Game::On_Key_Down_Player2' 
U:\Eigene Dateien\eventhandler.cpp:46: error: cannot convert `void (Pong_Game::*)(int)' to `void (*)(int)' in assignment 

Execution terminated 

편집 : - 변경된 코드 - 추가 컴파일러 로그

감사합니다!

+0

어떻게 작동하지 않는지 알려주세요 *! – Nick

+0

"작동하지 않습니다." 방법? 컴파일러 오류? 링커 오류? 추락? 예기치 않은 동작 (및 예상되는 동작) 우리는 여기서 마술사가 아닙니다. – Angew

+0

언급 한 바와 같이 현재 직면하고있는 문제에 대한 자세한 내용을 제공하고 누군가 대답 할 수 있습니다. –

답변

1
  1. 멤버 함수를 사용하여 "일반"함수 포인터를 초기화하고 있습니다. 멤버 함수는 함수와 함께 전달 된 T *this이 숨겨져 있다는 점에서 일반 함수와 다릅니다.
  2. 이것은 함수 포인터를 사용하는 것보다 상속에 의해 구현되는 "이벤트 처리기"인터페이스를 사용하면 더 잘 해결 될 수 있습니다. 이 같은

뭔가 : 코멘트를로

class Game 
{ 
    private: 
     bool is_running ; 
    public: 
     void run(){is_running=true; while(is_running) do_events(1);} 
     void do_events(int e) {if(e==1) On_Key_Down(TESTKEY_A);} 
     void stop() {is_running = false;} 

     virtual void On_Key_Down(int key) = 0; 
     ... other event handlers here ... 
}; 

class Pong_Game : public Game 
{ 
    public: 
     void Pong_Game() {} 
     void On_Key_Down(int key) { // handle key event...} 
     ... other event handlers here ... 
}; 

: 이것은 (

class Player 
{ 
    public: 
    enum moves { move_up, 
       move_down, 
       move_left, 
       move_right, 
       move_jump, 
       move_shoot, ... }; 

    ... 
    virtual void On_Key_Down(int key) = 0; 
    ... 
}; 

class Player_A 
{ 
    public: 
    ... 
    virtual moves On_Key_Down(int key) { if (key == 'W') return move_up; ... } 
} 

class Player_B 
{ 
    public: 
    ... 
    virtual moves On_Key_Down(int key) { if (key == 'I') return move_up; ... } 
} 


class Pong_Game : public Game 
{ 
    private: 
     vector<Player *> players; 
    public: 

     void Pong_Game() {} 
     void On_Key_Down(int key) 
     { 
      for(p : players) { 
       Player::moves m = p->On_key_down(); 
       ... 
      } 
     } 
     ... other event handlers here ... 
}; 

: 당신은 "선수 당 이벤트 처리"를 구현할 수 있습니다, 여러 플레이어를 커버하려면 방금 해킹당한 것입니다. "움직임"이 어딘가 다른 곳에 배치하는 것이 더 좋을 수 있으며, 정확한 구조는 "지금 당장 생각할 수있는 것"입니다. class Player_A_Pong : public Player_A이나 거래가 필요합니다. "선수 A의 라켓이 여기에 있고, 선수 B의 라켓이 여기에 있습니다 ..."- 그걸 다루는 다른 방법이있을지라도).

+0

해답을 제공해 주셔서 감사합니다.하지만 이벤트에 두 개 이상의 이벤트 핸들러를 추가하려면 어떻게해야합니까? – Kris

+0

두 개 이상의 이벤트 처리기가있는 시나리오를 설명해주십시오. –

+0

잘못된 설명입니다. 나는 나의 모범을 조정했으며, 나의 목적과 문제가 무엇인지 이제는 더 분명하게 알기를 바랍니다. – Kris

관련 문제