Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/consolecommands3/src/libraries/tools/Timer.cc @ 7621

Last change on this file since 7621 was 7236, checked in by landauf, 14 years ago

replaced the temporary names of all ConsoleCommand related classes and functions by their real names

  • Property svn:eol-style set to native
File size: 4.8 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Fabian 'x3n' Landau
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29#include "Timer.h"
30
31#include <set>
32
33#include "util/Clock.h"
34#include "core/CoreIncludes.h"
35#include "core/command/ConsoleCommand.h"
36#include "core/command/CommandExecutor.h"
37#include "core/command/Functor.h"
38
39namespace orxonox
40{
41    SetConsoleCommand("delay", &delay).argumentCompleter(1, autocompletion::command());
42    SetConsoleCommand("killdelays", &killdelays);
43
44    static std::set<Timer*> delaytimerset;
45
46    /**
47        @brief Calls a console command after 'delay' seconds.
48        @param delay The delay in seconds
49        @param command The console command
50    */
51    void delay(float delay, const std::string& command)
52    {
53        Timer* delaytimer = new Timer();
54        delaytimerset.insert(delaytimer);
55
56        const ExecutorStaticPtr& delayexecutor = createExecutor(createFunctor(&executeDelayedCommand));
57        delayexecutor->setDefaultValues(delaytimer, command);
58        delaytimer->setTimer(delay, false, delayexecutor);
59    }
60
61    /**
62        @brief Executes the command.
63        @param timer The timer to destroy after the command-execution
64        @param command The command to execute
65    */
66    void executeDelayedCommand(Timer* timer, const std::string& command)
67    {
68        CommandExecutor::execute(command);
69        timer->destroy();
70        delaytimerset.erase(timer);
71    }
72
73    /**
74        @brief Kills all delayed commands.
75    */
76    void killdelays()
77    {
78        for (std::set<Timer*>::iterator it = delaytimerset.begin(); it != delaytimerset.end(); ++it)
79            (*it)->destroy();
80
81        delaytimerset.clear();
82    }
83
84    /**
85        @brief Constructor: Sets the default-values.
86    */
87    Timer::Timer()
88    {
89        this->init();
90        RegisterObject(Timer);
91    }
92
93    /**
94        @brief Constructor: Initializes the Timer with given values.
95        @param interval The timer-interval in seconds
96        @param bLoop If true, the function gets called every 'interval' seconds
97        @param exeuctor A executor of the function to call
98    */
99    Timer::Timer(float interval, bool bLoop, const ExecutorPtr& executor, bool bKillAfterCall)
100    {
101        this->init();
102        RegisterObject(Timer);
103
104        this->setTimer(interval, bLoop, executor, bKillAfterCall);
105    }
106
107    /**
108        @brief Initializes the Timer
109    */
110    void Timer::init()
111    {
112        this->executor_ = 0;
113        this->interval_ = 0;
114        this->bLoop_ = false;
115        this->bActive_ = false;
116        this->bKillAfterCall_ = false;
117
118        this->time_ = 0;
119    }
120
121    /**
122        @brief Executes the executor.
123    */
124    void Timer::run()
125    {
126        bool temp = this->bKillAfterCall_; // to avoid errors with bKillAfterCall_=false and an exutors which destroy the timer
127
128        (*this->executor_)();
129
130        if (temp)
131            this->destroy();
132    }
133
134    /**
135        @brief Updates the timer before the frames are rendered.
136    */
137    void Timer::tick(const Clock& time)
138    {
139        if (this->bActive_)
140        {
141            // If active: Decrease the timer by the duration of the last frame
142            this->time_ -= static_cast<long long>(time.getDeltaTimeMicroseconds() * this->getTimeFactor());
143
144            if (this->time_ <= 0)
145            {
146                // It's time to call the function
147                if (this->bLoop_ && !this->bKillAfterCall_)
148                {
149                    this->time_ += this->interval_; // Q: Why '+=' and not '='? A: Think about it. It's more accurate like that. Seriously.
150                    while (this->time_ <= 0)
151                    {
152                        // The interval was shorter than one tick, so execute the function more than once
153                        this->run();
154                        this->time_ += this->interval_;
155                    }
156                }
157                else
158                    this->stopTimer(); // Stop the timer if we don't want to loop
159
160                this->run();
161            }
162        }
163    }
164}
Note: See TracBrowser for help on using the repository browser.