Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/libraries/core/Event.cc @ 6481

Last change on this file since 6481 was 6417, checked in by rgrieder, 15 years ago

Merged presentation2 branch back to trunk.
Major new features:

  • Actual GUI with settings, etc.
  • Improved space ship steering (human interaction)
  • Rocket fire and more particle effects
  • Advanced sound framework
  • Property svn:eol-style set to native
File size: 4.0 KB
RevLine 
[2063]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 "Event.h"
[3196]30
[2063]31#include "BaseObject.h"
[5929]32#include "Identifier.h"
[2063]33
34namespace orxonox
[2072]35{
[5929]36    /**
37        @brief Destructor: Deletes the functor of the event state.
38    */
39    EventState::~EventState()
[2072]40    {
[5929]41        if (this->statefunction_)
42            delete this->statefunction_;
[2072]43    }
[2065]44
[5929]45    /**
46        @brief Processes an event (calls the set-function if the necessary conditions are met).
[6417]47
[5929]48        @param event     The fired event
49        @param object    The object whose state is affected by the event (only needed for debug output)
50    */
51    void EventState::process(const Event& event, BaseObject* object)
[2072]52    {
[5929]53        if (this->bProcessingEvent_)
[2082]54        {
[6417]55            COUT(2) << "Warning: Detected Event loop in section \"" << event.statename_ << "\" of object \"" << object->getName() << "\" and fired by \"" << event.originator_->getName() << '"' << std::endl;
[2082]56            return;
57        }
58
[5929]59        this->bProcessingEvent_ = true;
[2082]60
[5929]61        // check if the originator is an instance of the requested class
62        if (event.originator_->isA(this->subclass_))
[2063]63        {
[5929]64            // actualize the activationcounter
65            if (event.activate_)
66                ++this->activeEvents_;
67            else
[2063]68            {
[5929]69                --this->activeEvents_;
[2072]70
[5929]71                if (this->activeEvents_ < 0)
72                    this->activeEvents_ = 0;
73            }
[2063]74
[5929]75            if (this->statefunction_->getParamCount() == 0 && event.activate_)
76            {
77                // if the eventfunction doesn't have a state, just call it whenever an activation-event comes in
78                (*this->statefunction_)();
79            }
80            else if ((this->activeEvents_ == 1 && event.activate_) || (this->activeEvents_ == 0 && !event.activate_))
81            {
82                // if the eventfunction needs a state, we just call the function if the state changed from 0 to 1 (state = true) or from 1 to 0 (state = false) [but not if activeEvents_ is > 1]
83                if (this->statefunction_->getParamCount() == 1)
[2063]84                {
[5929]85                    // one argument: just the eventstate
86                    (*this->statefunction_)(this->activeEvents_);
[2063]87                }
[5929]88                else if (this->statefunction_->getParamCount() >= 2)
89                {
90                    // two arguments: the eventstate and the originator
91                    if (this->subclass_->isExactlyA(ClassIdentifier<BaseObject>::getIdentifier()))
92                    {
93                        // if the subclass is BaseObject, we don't have to cast the pointer
94                        (*this->statefunction_)(this->activeEvents_, event.originator_);
95                    }
96                    else
97                    {
98                        // else cast the pointer to the desired class
99                        void* castedOriginator = event.originator_->getDerivedPointer(this->subclass_->getClassID());
100                        (*this->statefunction_)(this->activeEvents_, castedOriginator);
101                    }
102                }
[2063]103            }
104        }
[2082]105
[5929]106        this->bProcessingEvent_ = false;
[2063]107    }
108}
Note: See TracBrowser for help on using the repository browser.