X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fmain.c;h=480e8fdbe8ccf8c30d16ed07c7fa6a1c45136a6b;hb=4bd5f56d21bcc579800bd4875dc810d6c04cdfca;hp=75fe7155a13b3f4851d5db06493c408b51e4c239;hpb=7f2a8b0fd07bc16b0919d25d0d3e6714e6a065c2;p=nothing.git diff --git a/src/main.c b/src/main.c index 75fe7155..480e8fdb 100644 --- a/src/main.c +++ b/src/main.c @@ -1,5 +1,6 @@ -#include +#include +#include #include #include #include @@ -11,7 +12,7 @@ #include "game/sound_samples.h" #include "game/sprite_font.h" #include "math/extrema.h" -#include "math/point.h" +#include "math/vec.h" #include "sdl/renderer.h" #include "system/log.h" #include "system/lt.h" @@ -21,17 +22,68 @@ static void print_usage(FILE *stream) { - fprintf(stream, "Usage: nothing [--fps ] \n"); + fprintf(stream, "Usage: nothing [--fps ]\n"); } +static float current_display_scale = 1.0f; + + +// export this for other parts of the code to use. +float get_display_scale(void) +{ + return current_display_scale; +} + +static +void recalculate_display_scale(SDL_Window* win, SDL_Renderer* rend) +{ + int w0 = 0; + SDL_GetWindowSize(win, &w0, NULL); + + int w1 = 0; + SDL_GetRendererOutputSize(rend, &w1, NULL); + + current_display_scale = (float) w1 / (float) w0; +} + +static +void maybe_fixup_input_for_display_scale(SDL_Window* win, SDL_Renderer* rend, SDL_Event* e) +{ + // note: we check for window move as well, because you may move the window to + // another monitor with a different display scale. + switch (e->type) { + case SDL_WINDOWEVENT: { + switch (e->window.event) { + case SDL_WINDOWEVENT_MOVED: + case SDL_WINDOWEVENT_SIZE_CHANGED: + recalculate_display_scale(win, rend); + break; + } + } break; + + // this is the fixup. + case SDL_MOUSEMOTION: { + // note: do it this way *just in case* there are non-integer display scales out there. + e->motion.x = (int) ((float) e->motion.x * current_display_scale); + e->motion.y = (int) ((float) e->motion.y * current_display_scale); + } break; + + case SDL_MOUSEBUTTONUP: + case SDL_MOUSEBUTTONDOWN: { + e->button.x = (int) ((float) e->button.x * current_display_scale); + e->button.y = (int) ((float) e->button.y * current_display_scale); + } break; + } +} + + int main(int argc, char *argv[]) { srand((unsigned int) time(NULL)); Lt *lt = create_lt(); - char *level_folder = NULL; - int fps = 30; + int fps = 60; for (int i = 1; i < argc;) { if (strcmp(argv[i], "--fps") == 0) { @@ -48,23 +100,20 @@ int main(int argc, char *argv[]) RETURN_LT(lt, -1); } } else { - level_folder = argv[i]; - i++; + log_fail("Unknown flag %s\n", argv[i]); + print_usage(stderr); + RETURN_LT(lt, -1); } } - if (level_folder == NULL) { - log_fail("Path to level file is not provided\n"); - print_usage(stderr); - RETURN_LT(lt, -1); - } - if (SDL_Init(SDL_INIT_EVERYTHING) < 0) { log_fail("Could not initialize SDL: %s\n", SDL_GetError()); RETURN_LT(lt, -1); } PUSH_LT(lt, 42, SDL_Quit); + setlocale(LC_NUMERIC, "C"); + SDL_ShowCursor(SDL_DISABLE); SDL_Window *const window = PUSH_LT( @@ -73,7 +122,7 @@ int main(int argc, char *argv[]) "Nothing", 100, 100, SCREEN_WIDTH, SCREEN_HEIGHT, - SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE), + SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI), SDL_DestroyWindow); if (window == NULL) { @@ -118,15 +167,18 @@ int main(int argc, char *argv[]) // ------------------------------ const char * sound_sample_files[] = { - "./sounds/nothing.wav", - "./sounds/something.wav" + "./assets/sounds/nothing.wav", + "./assets/sounds/something.wav", + "./assets/sounds/dev/ding.wav", + "./assets/sounds/dev/click.wav", + "./assets/sounds/dev/save.wav" }; const size_t sound_sample_files_count = sizeof(sound_sample_files) / sizeof(char*); Game *const game = PUSH_LT( lt, create_game( - level_folder, + "./assets/levels/", sound_sample_files, sound_sample_files_count, renderer), @@ -135,6 +187,9 @@ int main(int argc, char *argv[]) RETURN_LT(lt, -1); } + // calculate the display scale for the first time. + recalculate_display_scale(window, renderer); + const Uint8 *const keyboard_state = SDL_GetKeyboardState(NULL); SDL_StopTextInput(); @@ -145,6 +200,12 @@ int main(int argc, char *argv[]) const int64_t begin_frame_time = (int64_t) SDL_GetTicks(); while (!game_over_check(game) && SDL_PollEvent(&e)) { + + // this function potentially fixes mouse events by scaling them according + // to the window DPI scale. (eg. *2 on retina displays). it also updates + // the cached DPI scale on window scale/move events. + maybe_fixup_input_for_display_scale(window, renderer, &e); + if (game_event(game, &e) < 0) { RETURN_LT(lt, -1); }