diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/base/UTime.pas | 210 | ||||
-rw-r--r-- | src/base/time.cpp | 130 | ||||
-rw-r--r-- | src/base/time.hpp | 63 |
3 files changed, 193 insertions, 210 deletions
diff --git a/src/base/UTime.pas b/src/base/UTime.pas deleted file mode 100644 index 83844cb5..00000000 --- a/src/base/UTime.pas +++ /dev/null @@ -1,210 +0,0 @@ -{* UltraStar Deluxe - Karaoke Game - * - * UltraStar Deluxe is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - *} - -unit UTime; - -interface - -{$IFDEF FPC} - {$MODE Delphi} -{$ENDIF} - -{$I switches.inc} - -type - TTime = class - public - constructor Create; - function GetTime(): real; - end; - - TRelativeTimer = class - private - AbsoluteTime: int64; // system-clock reference time for calculation of CurrentTime - RelativeTimeOffset: real; - Paused: boolean; - TriggerMode: boolean; - public - constructor Create(TriggerMode: boolean = false); - procedure Pause(); - procedure Resume(); - function GetTime(): real; - function GetAndResetTime(): real; - procedure SetTime(Time: real; Trigger: boolean = true); - procedure Reset(); - end; - -procedure CountSkipTimeSet; -procedure CountSkipTime; -procedure CountMidTime; - -var - USTime: TTime; - VideoBGTimer: TRelativeTimer; - - TimeNew: int64; - TimeOld: int64; - TimeSkip: real; - TimeMid: real; - TimeMidTemp: int64; - -implementation - -uses - sdl, - UCommon; - -const - cSDLCorrectionRatio = 1000; - -(* -BEST Option now ( after discussion with whiteshark ) seems to be to use SDL -timer functions... - -SDL_delay -SDL_GetTicks -http://www.gamedev.net/community/forums/topic.asp?topic_id=466145&whichpage=1%EE%8D%B7 -*) - - -procedure CountSkipTimeSet; -begin - TimeNew := SDL_GetTicks(); -end; - -procedure CountSkipTime; -begin - TimeOld := TimeNew; - TimeNew := SDL_GetTicks(); - TimeSkip := (TimeNew-TimeOld) / cSDLCorrectionRatio; -end; - -procedure CountMidTime; -begin - TimeMidTemp := SDL_GetTicks(); - TimeMid := (TimeMidTemp - TimeNew) / cSDLCorrectionRatio; -end; - -{** - * TTime - **} - -constructor TTime.Create; -begin - inherited; - CountSkipTimeSet; -end; - -function TTime.GetTime: real; -begin - Result := SDL_GetTicks() / cSDLCorrectionRatio; -end; - -{** - * TRelativeTimer - **} - -(* - * creates a new timer. - * if triggermode is false (default), the timer - * will immediately begin with counting. - * if triggermode is true, it will wait until get/settime() or pause() is called - * for the first time. - *) -constructor TRelativeTimer.Create(TriggerMode: boolean); -begin - inherited Create(); - Self.TriggerMode := TriggerMode; - Reset(); - Paused := false; -end; - -procedure TRelativeTimer.Pause(); -begin - RelativeTimeOffset := GetTime(); - Paused := true; -end; - -procedure TRelativeTimer.Resume(); -begin - AbsoluteTime := SDL_GetTicks(); - Paused := false; -end; - -(* - * Returns the counter of the timer. - * If in TriggerMode it will return 0 and start the counter on the first call. - *) -function TRelativeTimer.GetTime: real; -begin - // initialize absolute time on first call in triggered mode - if (TriggerMode and (AbsoluteTime = 0)) then - begin - AbsoluteTime := SDL_GetTicks(); - Result := RelativeTimeOffset; - Exit; - end; - - if Paused then - Result := RelativeTimeOffset - else - Result := RelativeTimeOffset + (SDL_GetTicks() - AbsoluteTime) / cSDLCorrectionRatio; -end; - -(* - * Returns the counter of the timer and resets the counter to 0 afterwards. - * Note: In TriggerMode the counter will not be stopped as with Reset(). - *) -function TRelativeTimer.GetAndResetTime(): real; -begin - Result := GetTime(); - SetTime(0); -end; - -(* - * Sets the timer to the given time. This will trigger in TriggerMode if - * Trigger is set to true. Otherwise the counter's state will not change. - *) -procedure TRelativeTimer.SetTime(Time: real; Trigger: boolean); -begin - RelativeTimeOffset := Time; - if ((not TriggerMode) or Trigger) then - AbsoluteTime := SDL_GetTicks(); -end; - -(* - * Resets the counter of the timer to 0. - * If in TriggerMode the timer will not start counting until it is triggered again. - *) -procedure TRelativeTimer.Reset(); -begin - RelativeTimeOffset := 0; - if (TriggerMode) then - AbsoluteTime := 0 - else - AbsoluteTime := SDL_GetTicks(); -end; - -end. diff --git a/src/base/time.cpp b/src/base/time.cpp new file mode 100644 index 00000000..9a63270d --- /dev/null +++ b/src/base/time.cpp @@ -0,0 +1,130 @@ +/* + * UltraStar Deluxe - Karaoke Game + * + * UltraStar Deluxe is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + */ + +#include "time.hpp" +#include <SDL/SDL.h> + +#define SDL_CORRECTION_RATIO 1000 + +namespace usdx +{ + + Time::Time(void) + { + } + + float Time::get_time() + { + return SDL_GetTicks() / SDL_CORRECTION_RATIO; + } + + + /* + * RelativeTimer + */ + + /* + * creates a new timer. + * if triggermode is false (default), the timer + * will immediately begin with counting. + * if triggermode is true, it will wait until get/settime() or pause() is called + * for the first time. + */ + RelativeTimer::RelativeTimer(bool trigger_mode) + { + this->trigger_mode = trigger_mode; + reset(); + this->paused = false; + } + + void RelativeTimer::pause(void) + { + relative_time_offset = get_time(); + paused = true; + } + + void RelativeTimer::resume(void) + { + absolute_time = SDL_GetTicks(); + paused = false; + } + + /* + * Returns the counter of the timer. + * If in TriggerMode it will return 0 and start the counter on the first call. + */ + float RelativeTimer::get_time(void) + { + // initialize absolute time on first call in triggered mode + if (trigger_mode && (absolute_time == 0)) + { + absolute_time = SDL_GetTicks(); + return relative_time_offset; + } + + if (paused) + return relative_time_offset; + + return relative_time_offset + (SDL_GetTicks() - absolute_time) / SDL_CORRECTION_RATIO; + } + + /* + * Returns the counter of the timer and resets the counter to 0 afterwards. + * Note: In TriggerMode the counter will not be stopped as with Reset(). + */ + float RelativeTimer::get_and_reset_time(void) + { + float result = get_time(); + set_time(0); + return result; + } + + /* + * Sets the timer to the given time. This will trigger in TriggerMode if + * Trigger is set to true. Otherwise the counter's state will not change. + */ + void RelativeTimer::set_time(float time, bool trigger) + { + relative_time_offset = time; + + if (!trigger_mode || trigger) + absolute_time = SDL_GetTicks(); + } + + /* + * Resets the counter of the timer to 0. + * If in TriggerMode the timer will not start counting until it is triggered again. + */ + void RelativeTimer::reset(void) + { + relative_time_offset = 0; + + if (trigger_mode) + absolute_time = 0; + else + absolute_time = SDL_GetTicks(); + } +} diff --git a/src/base/time.hpp b/src/base/time.hpp new file mode 100644 index 00000000..64bf49c1 --- /dev/null +++ b/src/base/time.hpp @@ -0,0 +1,63 @@ +/* + * UltraStar Deluxe - Karaoke Game + * + * UltraStar Deluxe is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + */ + +#ifndef TIME_HPP +#define TIME_HPP + +#include <stdint.h> + +namespace usdx +{ + class Time + { + public: + Time(void); + float get_time(); + }; + + + class RelativeTimer + { + private: + // system-clock reference time for calculation of CurrentTime + uint64_t absolute_time; + float relative_time_offset; + bool paused; + bool trigger_mode; + + public: + RelativeTimer(bool trigger_mode = false); + void pause(void); + void resume(void); + float get_time(void); + float get_and_reset_time(void); + void set_time(float time, bool trigger = true); + void reset(void); + }; + +}; + +#endif |