diff options
Diffstat (limited to 'mazeoflife.cpp')
-rw-r--r-- | mazeoflife.cpp | 75 |
1 files changed, 42 insertions, 33 deletions
diff --git a/mazeoflife.cpp b/mazeoflife.cpp index 952fbdb..3afff78 100644 --- a/mazeoflife.cpp +++ b/mazeoflife.cpp | |||
@@ -1,5 +1,9 @@ | |||
1 | #include "mazeoflife.h" | 1 | #include "mazeoflife.h" |
2 | 2 | ||
3 | #ifdef __EMSCRIPTEN__ | ||
4 | #include <emscripten.h> | ||
5 | #endif | ||
6 | |||
3 | #include <SDL.h> | 7 | #include <SDL.h> |
4 | #include <SDL_net.h> | 8 | #include <SDL_net.h> |
5 | #include <SDL_ttf.h> | 9 | #include <SDL_ttf.h> |
@@ -7,53 +11,58 @@ | |||
7 | #include <cstdlib> | 11 | #include <cstdlib> |
8 | #include <ctime> | 12 | #include <ctime> |
9 | #include <iostream> | 13 | #include <iostream> |
14 | #include <memory> | ||
10 | 15 | ||
16 | #include "sdl.h" | ||
11 | #include "state.h" | 17 | #include "state.h" |
12 | #include "titlestate.h" | 18 | #include "titlestate.h" |
13 | 19 | ||
14 | int main(int argc, char* argv[]) { | 20 | static void main_loop(void* arg) { |
15 | srand(time(NULL)); | 21 | Game& game = *static_cast<Game*>(arg); |
16 | 22 | ||
17 | if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) == -1) { | 23 | std::unique_ptr<State> next_state = (*game.state)(game); |
18 | printf("Could not initialize SDL: %s.\n", SDL_GetError()); | 24 | if (next_state) { |
19 | exit(-1); | 25 | game.state = std::move(next_state); |
20 | } | 26 | } |
21 | 27 | ||
22 | if (TTF_Init() == -1) { | 28 | if (game.should_quit) { |
23 | printf("Could not initialize SDL_ttf: %s.\n", TTF_GetError()); | 29 | #ifdef __EMSCRIPTEN__ |
24 | exit(-1); | 30 | emscripten_cancel_main_loop(); |
31 | #else | ||
32 | exit(0); | ||
33 | #endif | ||
25 | } | 34 | } |
35 | } | ||
26 | 36 | ||
27 | if (SDLNet_Init() == -1) { | 37 | int main(int, char**) { |
28 | printf("Cound not initalize SDL_net: %s.\n", SDLNet_GetError()); | 38 | Game game; |
29 | exit(-1); | 39 | |
30 | } | 40 | std::random_device randomEngine; |
41 | game.rng = std::mt19937(randomEngine()); | ||
31 | 42 | ||
32 | SDL_Window* window = | 43 | game.window = window_ptr( |
33 | SDL_CreateWindow("Maze of Life", 100, 100, 480, 480, SDL_WINDOW_SHOWN); | 44 | SDL_CreateWindow("Maze of Life", 100, 100, 480, 480, SDL_WINDOW_SHOWN)); |
34 | if (window == NULL) { | 45 | if (!game.window) { |
35 | std::cout << "SDL_CreateWindow Error: " << SDL_GetError() << std::endl; | 46 | throw sdl_error(); |
36 | return 1; | ||
37 | } | 47 | } |
38 | 48 | ||
39 | SDL_Surface* icon = SDL_LoadBMP("resources/icon.bmp"); | 49 | SDL_Surface* icon = SDL_LoadBMP("resources/icon.bmp"); |
40 | SDL_SetWindowIcon(window, icon); | 50 | SDL_SetWindowIcon(game.window.get(), icon); |
41 | 51 | ||
42 | SDL_Renderer* renderer = SDL_CreateRenderer( | 52 | game.renderer = renderer_ptr( |
43 | window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); | 53 | SDL_CreateRenderer(game.window.get(), -1, |
44 | if (renderer == NULL) { | 54 | SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC)); |
45 | std::cout << "SDL_CreateRenderer Error: " << SDL_GetError() << std::endl; | 55 | if (!game.renderer) { |
46 | return 1; | 56 | throw sdl_error(); |
47 | } | 57 | } |
48 | 58 | ||
49 | State* state = new TitleState(); | 59 | game.state = std::make_unique<TitleState>(game); |
50 | while (state != NULL) { | ||
51 | state = (*state)(window, renderer); | ||
52 | } | ||
53 | 60 | ||
54 | SDL_DestroyRenderer(renderer); | 61 | #ifdef __EMSCRIPTEN__ |
55 | SDL_DestroyWindow(window); | 62 | emscripten_set_main_loop_arg(main_loop, &game, 0, 1); |
56 | SDLNet_Quit(); | 63 | #else |
57 | TTF_Quit(); | 64 | for (;;) { |
58 | SDL_Quit(); | 65 | main_loop(&game); |
59 | } \ No newline at end of file | 66 | } |
67 | #endif | ||
68 | } | ||