Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/pch/src/core/GameState.cc @ 3152

Last change on this file since 3152 was 3149, checked in by rgrieder, 15 years ago

Extracted OrxAssert from Exception.h to OrxAssert.h since it doesn't really have anything to do with exceptions.

  • Property svn:eol-style set to native
File size: 3.9 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 *      Reto Grieder
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29/**
30@file
31@brief
32    Implementation of GameState class.
33*/
34
35#include "GameState.h"
36#include "util/Debug.h"
37#include "util/Exception.h"
38#include "util/OrxAssert.h"
39#include "Clock.h"
40
41namespace orxonox
42{
43    /**
44    @brief
45        Constructor only initialises variables and sets the name permanently.
46    */
47    GameState::GameState(const std::string& name, bool countTickTime)
48        : name_(name)
49        , bCountTickTime_(countTickTime)
50        , parent_(0)
51    {
52        this->activity_.activating   = false;
53        this->activity_.active       = false;
54        this->activity_.deactivating = false;
55        this->activity_.suspended    = false;
56        this->activity_.topState     = false;
57        this->activity_.updating     = false;
58    }
59
60    /**
61    @brief
62        Destructor only checks that we don't delete an active state.
63    */
64    GameState::~GameState()
65    {
66        OrxAssert(this->activity_.active == false, "Deleting an active GameState is a very bad idea..");
67    }
68
69    /**
70    @brief
71        Adds a child to the current tree. The Child can contain children of its own.
72        But you cannot a state tree that already has an active state.
73    @param state
74        The state to be added.
75    */
76    void GameState::addChild(GameState* state)
77    {
78        assert(state != NULL);
79
80        std::map<std::string, GameState*>::const_iterator it = this->children_.find(state->getName());
81        if (it == this->children_.end())
82        {
83            this->children_[state->getName()] = state;
84            // mark us as parent
85            state->setParent(this);
86        }
87        else
88        {
89            ThrowException(GameState, "Cannot add two children with the same name");
90        }
91    }
92
93    /**
94    @brief
95        Removes a child by instance. This splits the tree in two parts,
96        each of them functional on its own.
97    @param state
98        GameState by instance pointer
99    */
100    void GameState::removeChild(GameState* state)
101    {
102        assert(state != NULL);
103
104        std::map<std::string, GameState*>::iterator it = this->children_.find(state->getName());
105        if (it != this->children_.end())
106            this->children_.erase(it);
107        else
108        {
109            ThrowException(GameState, "Game state '" + name_ + "' doesn't have a child named '"
110                + state->getName() + "'.");
111        }
112    }
113
114    void GameState::activateInternal()
115    {
116        this->activity_.activating = true;
117        this->activate();
118        this->activity_.activating = false;
119        this->activity_.active = true;
120    }
121
122    void GameState::deactivateInternal()
123    {
124        this->activity_.active = false;
125        this->activity_.deactivating = true;
126        this->activate();
127        this->activity_.deactivating = false;
128        this->activity_.suspended = false;
129        this->activity_.updating = false;
130    }
131
132    void GameState::updateInternal(const Clock& time)
133    {
134        this->activity_.updating = true;
135        this->update(time);
136        this->activity_.updating = false;
137    }
138}
Note: See TracBrowser for help on using the repository browser.