Desterrando el parámetro covered de update y draw
[angry-tux:angry-tux.git] / include / stateManager.h
1 /**
2  * @file stateManager.h
3  * 
4  * @author José Tomás Tocino García
5  * @date 2010
6  *
7  * Copyright (C) 2010 José Tomás Tocino García <theom3ga@gmail.com>
8  * 
9  * This program is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License
11  * as published by the Free Software Foundation; either version 2
12  * of the License, or (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
22  * 02110-1301, USA.
23  */
24
25 #ifndef _STATEMANAGER_H_
26 #define _STATEMANAGER_H_
27
28 #include <Gosu/Gosu.hpp>
29 #include <vector>
30 #include <queue>
31
32 #include <boost/shared_ptr.hpp>
33 #include <boost/make_shared.hpp>
34
35 #include "log.h"
36
37 class State;
38  
39 class StateManager : public Gosu::Window{
40
41     /// Typedef for shared pointer to State
42     typedef boost::shared_ptr<State> StatePointer;
43
44 public:
45     StateManager(int width, int height, bool fullscreen = false, double updateInterval = 16.66666);
46
47     void update();
48     void draw();
49     void buttonDown(Gosu::Button B);
50     void buttonUp(Gosu::Button B);
51
52     void changeState(StatePointer state);
53     void pushState(StatePointer state);
54     void popState();
55     void popAllStates();
56
57     inline int getWidth(){ return graphics().width(); }
58     inline int getHeight(){ return graphics().height(); }
59
60     ~StateManager();
61 private:
62     /// Typedef for const reverse iterator for vector of StatePointers
63     typedef std::vector<StatePointer>::const_reverse_iterator StateRevIt;
64
65     /// Set of states
66     std::vector<StatePointer> states;
67
68     /// Temporary state counter
69     size_t numStates;
70
71     /// Operation types
72     enum tOpType { opPUSH, opPOP };
73
74     /// Single operation
75     struct StateOp{
76
77         /// Type of the operation
78         tOpType opType;
79
80         /// State involved (if it's an opPUSH operation)
81         StatePointer involvedState;
82
83         /// Constructor
84         StateOp(tOpType t_, StatePointer s_ = boost::shared_ptr<State>()) : opType(t_), involvedState(s_){ }
85     };
86
87     /// Queue of pending operations
88     std::queue<StateOp> pendingOperations;
89     
90     /// Performs all pending operations
91     void performOperations();
92     
93 };
94
95 #endif /* _STATEMANAGER_H_ */