それで、私は SDL を使用して小さな Pong ゲームのクローンを書いています。次のセットアップがあります。
SlimGame
FSM クラスとイベント ハンドラ クラスから継承する一般的なゲーム クラスがあります。
// DEFINITION
class SlimGame : public SlimFSM, public SlimEventHandler {
protected:
bool running; // indicates if the game is running
public:
bool isRunning() { return this->running; }
void setRunning(bool r) { this->running = r; }
void run(); // encapsulates the game loop
};
// IMPLEMENTATION
void SlimGame::run() {
SDL_Event event;
this->setRunning(true);
while(this->isRunning()) {
while(SDL_PollEvent(&event)) {
this->handleEvent(&event);
std::cout << "MAIN LOOP Running: " << this->isRunning(); << endl;
}
// ...
}
}
FSM クラスは奇妙な動作とは関係ありませんが、イベント ハンドラー クラスは次のようになります。
// DEFINITION
class SlimEventHandler {
public:
SlimEventHandler() { }
virtual ~SlimEventHandler() { }
void handleEvent(SDL_Event *event);
virtual void onExit();
};
// IMPLEMENTATION
void SlimEventHandler::handleEvent(SDL_Event *event) {
switch(event->type) {
case SDL_QUIT:
this->onExit();
break;
}
}
void SlimEventHandler::onExit() {
std::cout << "PARENT onExit!" << std::endl;
}
そして、PongGame
から継承するクラス自体がSlimGame
あります(したがって、 and から間接的SlimFSM
にSlimEventHandler
):
// DEFINITION
class PongGame : public SlimGame {
public:
PongGame();
~PongGame();
void onExit();
};
// IMPLEMENTATION
void PongGame::onExit() {
this->setRunning(false);
std::cout << "CHILD onExit!" << std::endl;
}
したがって、このセットアップでゲームを次のように実行すると、うまく起動します。
int main(int argc, char **argv) {
PongGame game;
// setup
game.run();
// tear down
return 0;
}
ただし、イベント処理は想定どおりには機能しません。ウィンドウを閉じるボタンをクリックすると、SDL_QUIT
イベントが発生し、メソッドhandleEvent
が呼び出されます。onExit
これは問題ありませんが、クラスの継承されたメソッドではなく、メソッド自体が独自に呼び出してPongGame
いるため、次のことがわかります。
PARENT onExit!
代わりにコンソールで
CHILD onExit!
PongGame
の仮想空の実装の代わりに、派生メソッドを呼び出すべきではありませんSlimEventHandler
か?