timeprovider.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "util/base/exception.h"
00031 #include "util/time/timemanager.h"
00032
00033 #include "timeprovider.h"
00034
00035 namespace FIFE {
00036 TimeProvider::TimeProvider(TimeProvider* master):
00037 m_master(master),
00038 m_multiplier(1.0) {
00039 m_time_static = m_time_scaled = master ? master->getGameTime() : TimeManager::instance()->getTime();
00040 }
00041
00042 TimeProvider::~TimeProvider() {}
00043
00044 void TimeProvider::setMultiplier(float multiplier) {
00045 if (multiplier < 0.0) {
00046 throw NotSupported("Negative time multiplier are not supported");
00047 }
00048 m_time_static = getPreciseGameTime();
00049 m_time_scaled = m_master ? m_master->getPreciseGameTime() : static_cast<float>(TimeManager::instance()->getTime());
00050 m_multiplier = multiplier;
00051 }
00052
00053 float TimeProvider::getMultiplier() const {
00054 return m_multiplier;
00055 }
00056
00057 float TimeProvider::getTotalMultiplier() const {
00058 if (m_master) {
00059 return m_master->getTotalMultiplier() * m_multiplier;
00060 } else {
00061 return m_multiplier;
00062 }
00063 }
00064
00065 unsigned int TimeProvider::getGameTime() const {
00066 return static_cast<unsigned int>(getPreciseGameTime());
00067 }
00068
00069 double TimeProvider::getPreciseGameTime() const {
00070 return m_time_static + m_multiplier * ((m_master ? m_master->getPreciseGameTime() : static_cast<float>(TimeManager::instance()->getTime())) - m_time_scaled);
00071 }
00072
00073 unsigned int scaleTime(float multiplier, unsigned int ticks) {
00074 return static_cast<unsigned int>(static_cast<float>(ticks) * multiplier);
00075 }
00076 }