-
Notifications
You must be signed in to change notification settings - Fork 0
/
GameStates.h
203 lines (172 loc) · 3.63 KB
/
GameStates.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
#ifndef _GAME_STATES_H
#define _GAME_STATES_H
#include "Vec2.h"
#include "GameObject.h"
#include <windows.h>
#include <sstream>
#include <tchar.h>
#include <list>
#include <set>
class GameStateContainer;
class AbstractGameState;
class GSMainMenu;
class GSPlay;
class Score;
class Timer;
class Button;
class GameArea;
class InfoArea;
class Button {
HRGN _rgn;
RECT _location;
TCHAR *_text;
HFONT _font;
COLORREF _text_color;
HBRUSH _background_color;
public:
Button(const TCHAR* text, int x, int y, int cx, int cy);
~Button();
void draw(HDC hdc);
bool is_inside(int x, int y);
};
class Score
{
int _score;
unsigned int _multiplier;
HBRUSH _background;
HFONT _font;
bool own_font;
public:
Score(int score = 0);
Score(HFONT font, int score = 0);
virtual ~Score();
void add(int val);
void reset();
void reset_multiplier();
void draw(HDC hdc);
};
class Timer
{
HFONT _font;
HBRUSH _background;
unsigned int _last_second_tick;
unsigned int _minutes;
unsigned int _seconds;
bool own_font;
bool _is_ticking;
public:
Timer();
Timer(HFONT _font);
virtual ~Timer();
void stop();
void run();
void on_tick();
void draw(HDC hdc);
};
class GameArea
{
std::set<GameObject*> _objects;
std::list<GameObject*> _destroyed_objects;
Ball *_ball;
Board *_board;
HBRUSH _background;
GSPlay *_owner;
bool _game_over;
void calculate_next_frame();
static bool try_collide(GameObject& obj1, GameObject& obj2);
public:
GameArea(GSPlay *owner);
virtual ~GameArea();
void on_keydown(unsigned int virt_key_code);
void on_keyup(unsigned int virt_key_code);
void on_tick();
void on_game_over(bool success);
void draw(HDC hdc);
void destroy(GameObject *obj_to_destroy);
void add_object(GameObject *new_game_object);
GSPlay *owner(){
return _owner;
}
bool is_game_over() {
return _game_over;
}
};
class InfoArea
{
HFONT _font;
public:
Score _score;
Timer _timer;
InfoArea();
virtual ~InfoArea();
void on_tick();
void add(int delta_score);
void draw(HDC hdc);
};
class GameStateContainer
{
std::list<AbstractGameState*> _states_stack;
int _states_to_pop;
public:
GameStateContainer();
virtual ~GameStateContainer();
void pop_state(int how_many);
void push_state(AbstractGameState *new_state);
void update_state();
void clear();
size_t size();
AbstractGameState* current();
};
class AbstractGameState
{
protected:
GameStateContainer* _owner;
AbstractGameState* _prev_state;
public:
AbstractGameState(GameStateContainer* owner, AbstractGameState* prev = 0) :
_owner(owner), _prev_state(prev) {}
virtual ~AbstractGameState(){}
virtual void render(HDC hdc) = 0;
virtual void input(UINT msg, WPARAM wParam, LPARAM lParam) = 0;
static LPARAM ConvertCoord(LPARAM phisical_coord, RECT& rc);
};
class GSMainMenu : public AbstractGameState
{
HFONT _font;
HBRUSH _background;
Button _btn_new_game;
Button _btn_exit;
public:
GSMainMenu(GameStateContainer* owner);
~GSMainMenu();
virtual void render(HDC hdc);
virtual void input(UINT msg, WPARAM wParam, LPARAM lParam);
};
class GSMessage : public AbstractGameState
{
enum {
message_width = 300,
message_height = 250
};
HFONT _font;
HBRUSH _background;
HPEN _border;
TCHAR *_text;
public:
GSMessage(GameStateContainer *owner, AbstractGameState *prev, const TCHAR *text);
~GSMessage();
virtual void render(HDC hdc);
virtual void input(UINT msg, WPARAM wParam, LPARAM lParam);
};
class GSPlay : public AbstractGameState
{
bool _game_over;
public:
GameArea _g_area;
InfoArea _i_area;
GSPlay(GameStateContainer *owner, AbstractGameState *prev);
void render(HDC hdc);
void input(UINT msg, WPARAM wParam, LPARAM lParam);
void on_game_over(bool success);
};
#endif