State stack system
This commit is contained in:
parent
a1d7a0d57f
commit
8412cbab72
@ -1,13 +1,18 @@
|
||||
Changelog for Photon
|
||||
$Id: CHANGELOG.txt,v 1.5 2005/08/09 07:30:14 cozman Exp $
|
||||
$Id: CHANGELOG.txt,v 1.6 2005/08/10 21:22:33 cozman Exp $
|
||||
|
||||
+ : New Features
|
||||
- : Feature Removal
|
||||
* : Minor Changes/Bugfixes
|
||||
! : Major Changes
|
||||
* : Minor Changes/Bugfixes
|
||||
|
||||
|
||||
0.0.2
|
||||
+ Code::Blocks and Dev-C++ support
|
||||
+ Addition of a State stack allowing for applications to fall back to the
|
||||
previous state when done with a particular state.
|
||||
* Fixed X11 fullscreen mode
|
||||
* Removed ALUT dependencies by adding custom WAV loading code
|
||||
|
||||
0.0.1 - Released 2005-08-08
|
||||
+ State-based design that allows easy creation of applications by simply
|
||||
|
@ -5,13 +5,13 @@
|
||||
// James Turk (jpt2433@rit.edu)
|
||||
//
|
||||
// Version:
|
||||
// $Id: Application.hpp,v 1.16 2005/08/08 21:39:41 cozman Exp $
|
||||
// $Id: Application.hpp,v 1.17 2005/08/10 21:22:33 cozman Exp $
|
||||
|
||||
#ifndef PHOTON_APPLICATION_HPP
|
||||
#define PHOTON_APPLICATION_HPP
|
||||
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <stack>
|
||||
#include <string>
|
||||
|
||||
#include <boost/utility.hpp>
|
||||
@ -297,13 +297,25 @@ public:
|
||||
|
||||
// Group: State Management
|
||||
public:
|
||||
// Function: setCurrentState
|
||||
// Set the current Application <State>.
|
||||
// Function: setState
|
||||
// Set the current Application <State>, removing all other <States>.
|
||||
//
|
||||
// Template Parameters:
|
||||
// StateT - Class derived from <State> to register.
|
||||
// StateT - Class derived from <State> to set as current.
|
||||
template<class StateT>
|
||||
void setCurrentState();
|
||||
void setState();
|
||||
|
||||
// Function: pushState
|
||||
// Push a new <State>, does not remove old <State>.
|
||||
//
|
||||
// Template Parameters:
|
||||
// StateT - Class derived from <State> to push.
|
||||
template<class StateT>
|
||||
void pushState();
|
||||
|
||||
// Function: popState
|
||||
// Pop the current <State>, returning to the prior <State> on the stack.
|
||||
void popState();
|
||||
|
||||
#ifdef PHOTON_USE_OPENAL
|
||||
// Group: AudioCore
|
||||
@ -416,6 +428,9 @@ private:
|
||||
static std::vector<InputListener*> listeners_;
|
||||
static std::vector<KeyCode> pressedKeys_;
|
||||
|
||||
// state system
|
||||
std::stack<StatePtr> stateStack_;
|
||||
|
||||
// Cores
|
||||
#ifdef PHOTON_USE_OPENAL
|
||||
std::auto_ptr<audio::AudioCore> audioCore_;
|
||||
@ -423,11 +438,42 @@ private:
|
||||
};
|
||||
|
||||
template<class StateT>
|
||||
void Application::setCurrentState()
|
||||
void Application::setState()
|
||||
{
|
||||
stateRender_->state_ = stateUpdate_->state_ = StatePtr(new StateT);
|
||||
StatePtr newState(new StateT);
|
||||
|
||||
// clear stack
|
||||
while(!stateStack_.empty())
|
||||
{
|
||||
// pop then resume
|
||||
stateStack_.pop();
|
||||
if(!stateStack_.empty())
|
||||
{
|
||||
stateStack_.top()->onResume();
|
||||
}
|
||||
}
|
||||
stateStack_.push(newState); // make newState the only state on stack
|
||||
|
||||
stateRender_->state_ = stateUpdate_->state_ = newState;
|
||||
}
|
||||
|
||||
template<class StateT>
|
||||
void Application::pushState()
|
||||
{
|
||||
StatePtr newState(new StateT);
|
||||
|
||||
// if a state is currently running, pause it
|
||||
if(!stateStack_.empty())
|
||||
{
|
||||
stateStack_.top()->onPause();
|
||||
}
|
||||
|
||||
stateStack_.push(newState); // push newState on top of stack
|
||||
|
||||
stateRender_->state_ = stateUpdate_->state_ = newState;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif //PHOTON_APPLICATION_HPP
|
||||
|
@ -5,7 +5,7 @@
|
||||
// James Turk (jpt2433@rit.edu)
|
||||
//
|
||||
// Version:
|
||||
// $Id: State.hpp,v 1.1 2005/08/08 19:19:25 cozman Exp $
|
||||
// $Id: State.hpp,v 1.2 2005/08/10 21:22:33 cozman Exp $
|
||||
|
||||
#ifndef PHOTON_STATE_HPP
|
||||
#define PHOTON_STATE_HPP
|
||||
@ -21,7 +21,7 @@
|
||||
|
||||
// Implement as many or as few of the members of State as needed (the only
|
||||
// necessary member being <render>) and make the state as current via
|
||||
// <Application::setCurrentState>. Once a state is made current it's
|
||||
// <Application::setState>. Once a state is made current it's
|
||||
// update and render methods will be called every frame until either a new
|
||||
// state is made current or the application ends.
|
||||
class State
|
||||
@ -30,7 +30,7 @@ class State
|
||||
public:
|
||||
// Function: State
|
||||
// A State's constructor is called whenever the state is made active via
|
||||
// <Application::setCurrentState>.
|
||||
// <Application::setState>.
|
||||
State() { };
|
||||
|
||||
// Function: ~State
|
||||
@ -51,6 +51,21 @@ public:
|
||||
// screen while the State is active should be drawn in render. Game logic
|
||||
// inside of render should be kept to a minimum for optimum performance.
|
||||
virtual void render()=0;
|
||||
|
||||
// Function: onPause
|
||||
// If a state is executing and a new state is pushed onto the stack via
|
||||
// <Application::pushState> the state will be paused until a time that it
|
||||
// is either unpaused or popped from the stack itself. When it is paused
|
||||
// the state management system will call onPause which may perform any
|
||||
// necessary work before the state goes idle.
|
||||
virtual void onPause() { };
|
||||
|
||||
// Function: onResume
|
||||
// If a state has been paused and is then made current again by the
|
||||
// state(s) pushed on top of it being popped, the state management system
|
||||
// will call onResume allowing the state to undo any work that had been
|
||||
// done in <onPause>.
|
||||
virtual void onResume() { };
|
||||
};
|
||||
|
||||
typedef photon::shared_ptr<State> StatePtr;
|
||||
|
@ -5,7 +5,7 @@
|
||||
// James Turk (jpt2433@rit.edu)
|
||||
//
|
||||
// Version:
|
||||
// $Id: entrypoint.hpp,v 1.8 2005/08/08 19:19:25 cozman Exp $
|
||||
// $Id: entrypoint.hpp,v 1.9 2005/08/10 21:22:33 cozman Exp $
|
||||
|
||||
|
||||
#ifndef PHOTON_ENTRYPOINT_HPP
|
||||
@ -33,7 +33,7 @@
|
||||
// Application::getInstance().createDisplay(800,600,32,0,0,false);
|
||||
//
|
||||
// // set current state
|
||||
// Application::getInstance().setCurrentState<MainMenu>();
|
||||
// Application::getInstance().setState<MainMenu>();
|
||||
//
|
||||
// // can also add any tasks here
|
||||
//
|
||||
|
@ -5,7 +5,7 @@
|
||||
// James Turk (jpt2433@rit.edu)
|
||||
//
|
||||
// Version:
|
||||
// $Id: Application.cpp,v 1.21 2005/08/10 05:36:58 cozman Exp $
|
||||
// $Id: Application.cpp,v 1.22 2005/08/10 21:22:33 cozman Exp $
|
||||
|
||||
#include "Application.hpp"
|
||||
|
||||
@ -389,6 +389,21 @@ double Application::getFramerate()
|
||||
{
|
||||
return 1/updateTask_->secPerFrame_;
|
||||
}
|
||||
|
||||
// States //////////////////////////////////////////////////////////////////////
|
||||
|
||||
void Application::popState()
|
||||
{
|
||||
stateStack_.pop(); // pop current state from stack
|
||||
|
||||
// if there is another state, resume it it
|
||||
if(!stateStack_.empty())
|
||||
{
|
||||
stateStack_.top()->onResume();
|
||||
stateRender_->state_ = stateUpdate_->state_ = stateStack_.top();
|
||||
}
|
||||
}
|
||||
|
||||
// AudioCore ///////////////////////////////////////////////////////////////////
|
||||
#ifdef PHOTON_USE_OPENAL
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
// James Turk (jpt2433@rit.edu)
|
||||
//
|
||||
// Version:
|
||||
// $Id: Audio_test.cpp,v 1.12 2005/08/08 21:39:41 cozman Exp $
|
||||
// $Id: Audio_test.cpp,v 1.13 2005/08/10 21:22:33 cozman Exp $
|
||||
|
||||
#include "photon.hpp"
|
||||
using namespace photon;
|
||||
@ -193,7 +193,7 @@ int PhotonMain(const StrVec& args)
|
||||
Kernel::getInstance().addTask(TaskPtr(new FPSDisplayTask()));
|
||||
|
||||
// register state and make active
|
||||
Application::getInstance().setCurrentState<MainState>();
|
||||
Application::getInstance().setState<MainState>();
|
||||
|
||||
// run until finished
|
||||
Kernel::getInstance().run();
|
||||
|
@ -5,7 +5,7 @@
|
||||
// James Turk (jpt2433@rit.edu)
|
||||
//
|
||||
// Version:
|
||||
// $Id: Font_test.cpp,v 1.10 2005/08/08 06:37:10 cozman Exp $
|
||||
// $Id: Font_test.cpp,v 1.11 2005/08/10 21:22:33 cozman Exp $
|
||||
|
||||
#include "photon.hpp"
|
||||
using namespace photon;
|
||||
@ -56,7 +56,7 @@ int PhotonMain(const StrVec& args)
|
||||
Kernel::getInstance().addTask(TaskPtr(new FPSDisplayTask()));
|
||||
|
||||
// set current state
|
||||
Application::getInstance().setCurrentState<MainState>();
|
||||
Application::getInstance().setState<MainState>();
|
||||
|
||||
// run until finished
|
||||
Kernel::getInstance().run();
|
||||
|
@ -5,7 +5,7 @@
|
||||
// James Turk (jpt2433@rit.edu)
|
||||
//
|
||||
// Version:
|
||||
// $Id: Image_test.cpp,v 1.10 2005/08/08 06:37:10 cozman Exp $
|
||||
// $Id: Image_test.cpp,v 1.11 2005/08/10 21:22:33 cozman Exp $
|
||||
|
||||
#include "photon.hpp"
|
||||
using namespace photon;
|
||||
@ -67,7 +67,7 @@ int PhotonMain(const StrVec& args)
|
||||
Kernel::getInstance().addTask(TaskPtr(new FPSDisplayTask()));
|
||||
|
||||
// set current state
|
||||
Application::getInstance().setCurrentState<MainState>();
|
||||
Application::getInstance().setState<MainState>();
|
||||
|
||||
// run until finished
|
||||
Kernel::getInstance().run();
|
||||
|
@ -5,7 +5,7 @@
|
||||
// James Turk (jpt2433@rit.edu)
|
||||
//
|
||||
// Version:
|
||||
// $Id: Input_test.cpp,v 1.8 2005/08/08 19:24:31 cozman Exp $
|
||||
// $Id: Input_test.cpp,v 1.9 2005/08/10 21:22:33 cozman Exp $
|
||||
|
||||
#include "photon.hpp"
|
||||
using namespace photon;
|
||||
@ -120,7 +120,7 @@ int PhotonMain(const StrVec& args)
|
||||
Kernel::getInstance().addTask(TaskPtr(new FPSDisplayTask()));
|
||||
|
||||
// set current state
|
||||
Application::getInstance().setCurrentState<MainState>();
|
||||
Application::getInstance().setState<MainState>();
|
||||
|
||||
// run until finished
|
||||
Kernel::getInstance().run();
|
||||
|
@ -5,7 +5,7 @@
|
||||
// James Turk (jpt2433@rit.edu)
|
||||
//
|
||||
// Version:
|
||||
// $Id: Pen_test.cpp,v 1.7 2005/08/08 06:37:10 cozman Exp $
|
||||
// $Id: Pen_test.cpp,v 1.8 2005/08/10 21:22:33 cozman Exp $
|
||||
|
||||
#include "photon.hpp"
|
||||
using namespace photon;
|
||||
@ -80,7 +80,7 @@ int PhotonMain(const StrVec& args)
|
||||
Kernel::getInstance().addTask(TaskPtr(new FPSDisplayTask()));
|
||||
|
||||
// set current state
|
||||
Application::getInstance().setCurrentState<MainState>();
|
||||
Application::getInstance().setState<MainState>();
|
||||
|
||||
// run until finished
|
||||
Kernel::getInstance().run();
|
||||
|
@ -5,7 +5,7 @@
|
||||
// James Turk (jpt2433@rit.edu)
|
||||
//
|
||||
// Version:
|
||||
// $Id: Texture_test.cpp,v 1.8 2005/08/08 06:37:10 cozman Exp $
|
||||
// $Id: Texture_test.cpp,v 1.9 2005/08/10 21:22:33 cozman Exp $
|
||||
|
||||
#include "photon.hpp"
|
||||
using namespace photon;
|
||||
@ -80,7 +80,7 @@ int PhotonMain(const StrVec& args)
|
||||
Kernel::getInstance().addTask(TaskPtr(new FPSDisplayTask()));
|
||||
|
||||
// set current state
|
||||
Application::getInstance().setCurrentState<MainState>();
|
||||
Application::getInstance().setState<MainState>();
|
||||
|
||||
// run until finished
|
||||
Kernel::getInstance().run();
|
||||
|
Loading…
Reference in New Issue
Block a user