/
game.cpp
118 lines (89 loc) · 2.77 KB
/
game.cpp
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
// (C) 2009-2011 Tim Gurto
#include <cassert>
#include <cstdlib>
#include <map>
#include <string>
#include <fstream>
#include "SDL.h"
#include "SDL_mixer.h"
#include "game.h"
#include "globals.h"
#include "update.h"
#include "render.h"
#include "util.h"
#include "misc.h"
#include "Debug.h"
#include "Point.h"
#include "MessageBox.h"
#include "Surface.h"
#include "Screen.h"
#include "GameState.h"
#include "Sound.h"
namespace Game {
extern Debug debug;
extern bool gameLoop;
extern GameOutcome gameOutcome;
unsigned gameMode(Screen &/*screen*/, const void * data){
GameState state;
Surface blankBack(SUR_UNINIT, 1, 1, BLUE);
MessageBox fpsDisplay(WHITE,
Screen::getScreenRes().x / 2 - 40, 2,
1,
blankBack,
FONT_DEBUG, 0,
false, DEBUG);
SDL_ShowCursor(SDL_DISABLE);
//flush event queue before accepting game controls,
//specifically the mouse up event from clicking "Play Game"
SDL_Event event;
while(SDL_PollEvent(&event))
debug("Unhandled event: ", int(event.type));
timer_t oldTicks = SDL_GetTicks();
//data tells us which level we're in.
int level = *(int*)data;
//first: tutorial
{
Surface tutImage(IMAGE_PATH + "level" + format2(level) + ".png");
screenBuf << tutImage;
screenBuf.flip();
//wait for key down or mouse down
//while (true){
// SDL_PollEvent(&event);
// if (event.type == SDL_MOUSEBUTTONUP || event.type == SDL_KEYUP)
// break;
//}
while (true){
SDL_PollEvent(&event);
if (event.type == SDL_MOUSEBUTTONDOWN || event.type == SDL_KEYDOWN)
break;
}
while (true){
SDL_PollEvent(&event);
if (event.type == SDL_MOUSEBUTTONUP || event.type == SDL_KEYUP)
break;
}
}
state.setLevel(level);
while (state.loop){
//time stuff
timer_t newTicks = SDL_GetTicks();
timer_t delta = newTicks - oldTicks;
oldTicks = newTicks;
if (delta > 500)
continue;
double deltaMod = 1.0 * delta / DELTA_MODIFIER;
double fps = delta == 0 ? 0 : 1000 / delta;
fpsDisplay(format3(fps), "fps | ", delta, "ms ");
//force interface refresh
pushMouseMove();
//update state
updateState(deltaMod, state, fpsDisplay);
//render
render(state, fpsDisplay);
}
//Clean up
SDL_ShowCursor(SDL_ENABLE);
GameOutcome outcome = state.outcome;
return outcome; //return something more meaningful
}
} // namespace Game