#ifndef STAGE_STATE_H
#define STAGE_STATE_H
class StageState
{
public:
virtual ~StageState() = 0 {}
};
class StageRunning : public StageState
{
};
class StagePaused : public StageState
{
};
class StageCompleted : public StageState
{
};
class StageQuit : public StageState
{
};
#endif
class Stage // abstract base class
{
StageState *_state; // on the heap
protected:
// advance frame
static void FrameAdvance(Min::Timer &, uint delay, uint &frame, uint &nextFrame);
public:
Stage() { _state = new StageRunning; }
virtual ~Stage() { delete _state; }
// draw contents
virtual void Draw() = 0;
// play the game
virtual void Play() = 0;
// handle key presses
virtual void HandleKeys(const SDL_Event &) = 0;
// set the state
void SetState(StageState *newState) { delete _state; _state = newState; }
// returns the state of the Stage
StageState *State() const { return _state; }
};
void Story::HandleKeys(const SDL_Event &event)
{
if( event.key.keysym.sym == SDLK_ESCAPE )
{
if( dynamic_cast<StagePaused*>(State()) ) // if the game is paused
SetState(new StageRunning);
if( dynamic_cast<StageRunning*>(State()) )
SetState(new StagePaused);
}
}