summaryrefslogtreecommitdiff
path: root/core/src/cpp/main.cpp
blob: 915e0ce19e2169df70fa786ea6ae564105aa3c1f (plain)
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
#include <iostream>
#include <chrono>
#include <thread>

#include <SDL.h>

#include "assets.h"
#include "fps_counter.h"
#include "map.h"
#include "player.h"

void main_loop(SDL_Renderer *renderer) {
    FPS_Counter fps_counter(renderer);
    Map map(renderer);
    Player player(renderer);
    TimeStamp timestamp = Clock::now();

    while (true) {       // main game loop
        SDL_Event event; // handle window closing
        if (SDL_PollEvent(&event) && (SDL_QUIT==event.type || (SDL_KEYDOWN==event.type && SDLK_ESCAPE==event.key.keysym.sym)))
            break; // quit
        player.handle_keyboard(); // no need for the event variable, direct keyboard state polling

        const auto dt = Clock::now() - timestamp;
        if (dt<std::chrono::milliseconds(20)) { // 50 FPS regulation
            std::this_thread::sleep_for(std::chrono::milliseconds(1));
            continue;
        }
        timestamp = Clock::now();

        player.update_state(std::chrono::duration<double>(dt).count(), map); // gravity, movements, collision detection etc

        SDL_RenderClear(renderer); // re-draw the window
        fps_counter.draw();
        player.draw();
        map.draw();
        SDL_RenderPresent(renderer);
    }
} // N.B. fps_counter, map and player objects call their destructors here, thus destroying allocated textures, it must be done prior to destroying the renderer

int main() {
    SDL_SetMainReady(); // tell SDL that we handle main() function ourselves, comes with the SDL_MAIN_HANDLED macro
    if (SDL_Init(SDL_INIT_VIDEO)) {
        std::cerr << "Failed to initialize SDL: " << SDL_GetError() << std::endl;
        return -1;
    }

    SDL_Window   *window   = nullptr;
    SDL_Renderer *renderer = nullptr;
    if (SDL_CreateWindowAndRenderer(1024, 768, SDL_WINDOW_SHOWN | SDL_WINDOW_INPUT_FOCUS, &window, &renderer)) {
        std::cerr << "Failed to create window and renderer: " << SDL_GetError() << std::endl;
        return -1;
    }
    SDL_SetWindowTitle(window, "SDL2 game blank");
    SDL_SetRenderDrawColor(renderer, 210, 255, 179, 255);

    main_loop(renderer); // all interesting things happen here

    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();
    return 0;
}