fixed Application unpausing/ altered timeDelta code

This commit is contained in:
James Turk 2005-08-14 07:40:12 +00:00
parent ced0ea683c
commit ec5793be7f
4 changed files with 152 additions and 51 deletions

View File

@ -1,5 +1,5 @@
Changelog for Photon Changelog for Photon
$Id: CHANGELOG.txt,v 1.7 2005/08/12 06:26:00 cozman Exp $ $Id: CHANGELOG.txt,v 1.8 2005/08/14 07:40:12 cozman Exp $
! : Major Changes (potentially breaking existing code) ! : Major Changes (potentially breaking existing code)
+ : New Features + : New Features
@ -8,13 +8,18 @@ $Id: CHANGELOG.txt,v 1.7 2005/08/12 06:26:00 cozman Exp $
0.0.2 0.0.2
! Removed InputListener, opting to move features into State class. ! Removed InputListener, opting to move features into State class.
! Changed Application::getElapsedTime to Application::getTimeDelta
+ Code::Blocks and Dev-C++ support + Code::Blocks and Dev-C++ support
+ Addition of a State stack allowing for applications to fall back to the + Addition of a State stack allowing for applications to fall back to the
previous state when done with a particular state. previous state when done with a particular state.
+ Notification of mouse wheel events added. + Notification of mouse wheel events added.
+ Addition of a State test/example program.
+ Addition of Application::setTimeDeltaMode ability to set how time delta
is calculated. (actual/average currently supported).
* Fixed X11 fullscreen mode * Fixed X11 fullscreen mode
* Removed ALUT dependencies by adding custom WAV loading code * Removed ALUT dependencies by adding custom WAV loading code
* Mouse move events now give relative position. * Mouse move events now give relative position.
* Properly handle regain of focus, unpause Application's timer.
0.0.1 - Released 2005-08-08 0.0.1 - Released 2005-08-08
+ State-based design that allows easy creation of applications by simply + State-based design that allows easy creation of applications by simply

View File

@ -5,13 +5,14 @@
// James Turk (jpt2433@rit.edu) // James Turk (jpt2433@rit.edu)
// //
// Version: // Version:
// $Id: Application.hpp,v 1.18 2005/08/12 06:26:00 cozman Exp $ // $Id: Application.hpp,v 1.19 2005/08/14 07:40:13 cozman Exp $
#ifndef PHOTON_APPLICATION_HPP #ifndef PHOTON_APPLICATION_HPP
#define PHOTON_APPLICATION_HPP #define PHOTON_APPLICATION_HPP
#include <vector> #include <vector>
#include <stack> #include <stack>
#include <valarray>
#include <string> #include <string>
#include <boost/utility.hpp> #include <boost/utility.hpp>
@ -24,7 +25,12 @@
#include "audio/AudioCore.hpp" #include "audio/AudioCore.hpp"
#include "util/Singleton.hpp" #include "util/Singleton.hpp"
#include <iostream> enum TimeDeltaMode
{
TDM_ACTUAL,
TDM_AVERAGE,
TDM_FIXED
};
namespace photon namespace photon
{ {
@ -256,19 +262,9 @@ public:
// been running. // been running.
scalar getTime(); scalar getTime();
// Function: getElapsedTime void setTimeDeltaMode(TimeDeltaMode mode, int numFrames=0);
// Finds the amount of time passed between frames, useful for time-based void setTimeDeltaMode(TimeDeltaMode mode, scalar fixedStep);
// movement. double getTimeDelta();
//
// Returns:
// Time between current frame and last frame. (1/<getFramerate>())
double getElapsedTime();
// Function: getFramerate
// Gets number of frames per second the application is currently processing
//
// Returns:
// Current frames per second.
double getFramerate(); double getFramerate();
// Group: State Management // Group: State Management
@ -353,6 +349,7 @@ private:
scalar pausedTime_; scalar pausedTime_;
scalar secPerFrame_; scalar secPerFrame_;
scalar lastUpdate_; scalar lastUpdate_;
std::valarray<scalar> frameTimes_;
}; };
// VideoTask, does the updating work of OpenGL // VideoTask, does the updating work of OpenGL
@ -402,6 +399,8 @@ private:
uint displayHeight_; uint displayHeight_;
uint viewportWidth_; uint viewportWidth_;
uint viewportHeight_; uint viewportHeight_;
TimeDeltaMode timeDeltaMode_;
// tasks // tasks
shared_ptr<UpdateTask> updateTask_; shared_ptr<UpdateTask> updateTask_;

View File

@ -5,7 +5,7 @@
// James Turk (jpt2433@rit.edu) // James Turk (jpt2433@rit.edu)
// //
// Version: // Version:
// $Id: Application.cpp,v 1.23 2005/08/12 06:26:00 cozman Exp $ // $Id: Application.cpp,v 1.24 2005/08/14 07:40:13 cozman Exp $
#include "Application.hpp" #include "Application.hpp"
@ -22,6 +22,8 @@
#include "audio/AudioCore.hpp" #include "audio/AudioCore.hpp"
#include "util/filesys/filesys.hpp" #include "util/filesys/filesys.hpp"
#include <iostream>
namespace photon namespace photon
{ {
@ -35,6 +37,7 @@ Application::Application(const std::string& arg0) :
photonVer_(0,0,1), // this is the current version photonVer_(0,0,1), // this is the current version
displayWidth_(0), displayHeight_(0), displayWidth_(0), displayHeight_(0),
viewportWidth_(0), viewportHeight_(0), viewportWidth_(0), viewportHeight_(0),
timeDeltaMode_(TDM_ACTUAL),
updateTask_(new UpdateTask()), updateTask_(new UpdateTask()),
stateUpdate_(new StateUpdate()), stateUpdate_(new StateUpdate()),
stateRender_(new StateRender()) stateRender_(new StateRender())
@ -269,14 +272,56 @@ scalar Application::getTime()
return glfwGetTime() - updateTask_->pausedTime_; return glfwGetTime() - updateTask_->pausedTime_;
} }
double Application::getElapsedTime() void Application::setTimeDeltaMode(TimeDeltaMode mode, int numFrames)
{ {
return updateTask_->secPerFrame_; // if the mode is fixed should have speficied a scalar fixedStep
if(mode == TDM_FIXED)
{
throw PreconditionException("setTimeDeltaMode called without fixedStep"
"but with TDM_FIXED mode.");
}
// if the mode is average should have at least two frames to average
if(mode == TDM_AVERAGE && numFrames <= 1)
{
throw PreconditionException("setTimeDeltaMode called with TDM_AVERAGE"
"but numFrames <= 1");
}
timeDeltaMode_ = mode;
updateTask_->frameTimes_.resize(numFrames);
}
void Application::setTimeDeltaMode(TimeDeltaMode mode, scalar fixedStep)
{
// if the mode is not fixed, should have specified a non-scalar numFrames
if(mode != TDM_FIXED)
{
throw PreconditionException("setTimeDeltaMode called with fixedStep but"
"mode not TDM_FIXED.");
}
timeDeltaMode_ = mode;
//fixedStep_ = fixedStep;
}
double Application::getTimeDelta()
{
switch(timeDeltaMode_)
{
case TDM_ACTUAL:
return updateTask_->secPerFrame_;
case TDM_AVERAGE:
return updateTask_->frameTimes_.sum()/updateTask_->frameTimes_.size();
case TDM_FIXED:
return 0.01;//fixedStep_;
default:
return 0;
}
} }
double Application::getFramerate() double Application::getFramerate()
{ {
return 1/updateTask_->secPerFrame_; return 1/getTimeDelta();
} }
// States ////////////////////////////////////////////////////////////////////// // States //////////////////////////////////////////////////////////////////////
@ -458,23 +503,31 @@ Application::UpdateTask::UpdateTask() :
mouseX_(0), mouseY_(0), mouseX_(0), mouseY_(0),
active_(false), timerPaused_(false), active_(false), timerPaused_(false),
unpauseOnActive_(false), lastPause_(0), pausedTime_(0), unpauseOnActive_(false), lastPause_(0), pausedTime_(0),
secPerFrame_(0), lastUpdate_(0) secPerFrame_(0), lastUpdate_(0), frameTimes_(0)
{ {
} }
void Application::UpdateTask::update() void Application::UpdateTask::update()
{ {
scalar curTime = glfwGetTime() - pausedTime_; static uint frameIndex(0);
scalar curTime( glfwGetTime() - pausedTime_ );
// keep track of time between frames
if(++frameIndex >= frameTimes_.size())
{
frameIndex = 0;
}
secPerFrame_ = frameTimes_[frameIndex] = curTime-lastUpdate_;
lastUpdate_ = curTime;
glfwSwapBuffers();
// update the display here instead of Application (since it belongs to glfw) // update the display here instead of Application (since it belongs to glfw)
glfwSwapBuffers();
glfwGetMousePos(&mouseX_, &mouseY_); glfwGetMousePos(&mouseX_, &mouseY_);
// keep track of time between frames
secPerFrame_ = curTime-lastUpdate_;
lastUpdate_ = curTime;
// quit on window closing or Alt-F4/Alt-X // quit on window closing or Alt-F4/Alt-X
if(!glfwGetWindowParam(GLFW_OPENED) || if(!glfwGetWindowParam(GLFW_OPENED) ||
( (glfwGetKey(GLFW_KEY_LALT) || glfwGetKey(GLFW_KEY_RALT)) && ( (glfwGetKey(GLFW_KEY_LALT) || glfwGetKey(GLFW_KEY_RALT)) &&
@ -495,7 +548,7 @@ void Application::UpdateTask::update()
} }
else if(active_ && unpauseOnActive_) else if(active_ && unpauseOnActive_)
{ {
timerPaused_ = true; timerPaused_ = false;
pausedTime_ += curTime - lastPause_; pausedTime_ += curTime - lastPause_;
unpauseOnActive_ = false; unpauseOnActive_ = false;
} }

View File

@ -5,7 +5,7 @@
// James Turk (jpt2433@rit.edu) // James Turk (jpt2433@rit.edu)
// //
// Version: // Version:
// $Id: State_test.cpp,v 1.2 2005/08/12 07:21:51 cozman Exp $ // $Id: State_test.cpp,v 1.3 2005/08/14 07:40:13 cozman Exp $
#include "photon.hpp" #include "photon.hpp"
using namespace photon; using namespace photon;
@ -15,12 +15,37 @@ using namespace photon;
class Demo2D : public State class Demo2D : public State
{ {
struct MovingRect
{
math::Rect pos;
math::Vector2 vel;
};
public: public:
Demo2D() Demo2D()
{ {
util::RandGen rand;
video::Image::addResource("robo","data/robo.png"); video::Image::addResource("robo","data/robo.png");
roboImg.open("robo");
robo.open("robo"); robots.resize(5);
for(std::vector<MovingRect>::iterator robot( robots.begin() );
robot != robots.end();
++robot)
{
robot->pos.moveTo(math::Point2(
rand.genRand(0.,800-roboImg.getWidth()),
rand.genRand(0.,600-roboImg.getHeight())));
robot->pos.resize(roboImg.getWidth(), roboImg.getHeight());
// generates -400 or +400
robot->vel.x = rand.genRandSign()*400;
robot->vel.y = rand.genRandSign()*400;
}
Application::getInstance().setOrthoView(); Application::getInstance().setOrthoView();
} }
@ -35,17 +60,51 @@ public:
void update() void update()
{ {
for(std::vector<MovingRect>::iterator robot( robots.begin() );
robot != robots.end();
++robot)
{
math::Vector2 vel(robot->vel *
Application::getInstance().getTimeDelta());
robot->pos.moveRel(vel.x, vel.y);
if(robot->pos.getLeft() < 0 || robot->pos.getRight() > 800)
{
robot->vel.x *= -1;
}
if(robot->pos.getTop() < 0 || robot->pos.getBottom() > 600)
{
robot->vel.y *= -1;
}
// check for robot-robot collisions
for(std::vector<MovingRect>::iterator robot2( robot );
robot2 != robots.end();
++robot2)
{
if(robot->pos.intersects(robot2->pos))
{
std::swap(robot->vel, robot2->vel);
}
}
}
} }
void render() void render()
{ {
robo.draw(0,0); for(std::vector<MovingRect>::iterator robot( robots.begin() );
robot != robots.end();
++robot)
{
roboImg.draw(robot->pos.getX(), robot->pos.getY());
}
} }
private: private:
video::Image robo; video::Image roboImg;
math::Point2 location; std::vector<MovingRect> robots;
}; };
class Demo3D : public State class Demo3D : public State
@ -122,9 +181,7 @@ public:
void update() void update()
{ {
scalar dt = Application::getInstance().getElapsedTime(); scalar dt = Application::getInstance().getTimeDelta();
// dt is sporadic and results in terrible choppiness
//dt = 0.01;
xRot += 30*dt; xRot += 30*dt;
yRot += 40*dt; yRot += 40*dt;
@ -181,6 +238,7 @@ public:
} }
app.setOrthoView(); app.setOrthoView();
app.setTimeDeltaMode(TDM_AVERAGE, 250);
} }
void onMouseButtonPress(MouseButton button) void onMouseButtonPress(MouseButton button)
@ -202,11 +260,6 @@ public:
} }
} }
void update()
{
std::cout << app.getElapsedTime() << "\n";
}
void render() void render()
{ {
video::Color c( font.getColor() ); video::Color c( font.getColor() );
@ -228,15 +281,9 @@ public:
} }
void onPause()
{
//setActive(false);
}
void onResume() void onResume()
{ {
//setActive(true);
font.setColor(video::Color(rand.genRand(0,255), rand.genRand(0,255), font.setColor(video::Color(rand.genRand(0,255), rand.genRand(0,255),
rand.genRand(0,255))); rand.genRand(0,255)));
app.setOrthoView(); app.setOrthoView();
@ -254,9 +301,6 @@ int PhotonMain(const StrVec& args)
{ {
// create window // create window
Application::getInstance().createDisplay(800,600,32,0,0,false); Application::getInstance().createDisplay(800,600,32,0,0,false);
// be sure to add FPSDisplayTask
Kernel::getInstance().addTask(TaskPtr(new FPSDisplayTask()));
// add archives to search path // add archives to search path
util::filesys::addToSearchPath("data/fonts.zip"); util::filesys::addToSearchPath("data/fonts.zip");