From b23a3ab831f91553d34a48f51370ed9525de07ac Mon Sep 17 00:00:00 2001 From: zlago Date: Tue, 24 Sep 2024 20:54:48 +0200 Subject: initial commit --- src/main.c | 178 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 src/main.c (limited to 'src/main.c') diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..a304797 --- /dev/null +++ b/src/main.c @@ -0,0 +1,178 @@ +#define SDL_MAIN_HANDLED +#include + +#include + +#include "input.h" +#include "loader.h" +#include "util.h" + +#include "tilemap.h" + +SDL_Window *window = NULL; +SDL_Renderer *renderer = NULL; + +#define WINDOW_WIDTH 160 +#define WINDOW_HEIGHT 90 +#define INIT_SUBSYSTEMS SDL_INIT_VIDEO + +unsigned input_now = 0; +SDL_Scancode keybinds[] = { + SDL_SCANCODE_UP, + SDL_SCANCODE_DOWN, + SDL_SCANCODE_LEFT, + SDL_SCANCODE_RIGHT, + SDL_SCANCODE_A, + SDL_SCANCODE_S, +}; + +int main(int argc, char **argv) { + if (SDL_Init(INIT_SUBSYSTEMS)) { + fprintf(stderr, "failed to initialize SDL2: %s\n", SDL_GetError()); + return EXIT_FAILURE; + } + SDL_StopTextInput(); + + window = SDL_CreateWindow(":3", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_RESIZABLE | SDL_WINDOW_HIDDEN); + if (window == NULL) { + goto end; + } + renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_SOFTWARE| SDL_RENDERER_TARGETTEXTURE | SDL_RENDERER_PRESENTVSYNC); + if (renderer == NULL) { + goto end; + } + SDL_RenderSetLogicalSize(renderer, WINDOW_WIDTH, WINDOW_HEIGHT); + + { + res_init_texture(); + res_init_map(); + init_tilemap(); + void *a = util_executableRelativePath("assets.res", *argv, 0); + puts(a); + if (loadResources(a)) { + fputs("loading resources failed\n", stderr); + return 1; + } + free(a); + struct blob map = res_get_map("out"); + printf("load_tilemap %u\n", load_tilemap(map.data, map.size)); + SDL_SetRenderTarget(renderer, NULL); + } + + SDL_ShowWindow(window); + + int x = 0, y = 0; + while (1) { + SDL_Event evt; + while (SDL_PollEvent(&evt)) { + switch (evt.type) { + case SDL_QUIT: // the last window is closed, or the app is asked to terminate + fputs("quitting...\n", stderr); + goto end; + case SDL_KEYDOWN: + case SDL_KEYUP: // a key on is pressed or released + if (evt.key.repeat) + break; + + // check for ^Q and exit if pressed + if (evt.key.state == SDL_PRESSED && evt.key.keysym.sym == SDLK_q && evt.key.keysym.mod & KMOD_CTRL) { + goto end; + } + + //static_assert(INPUT_LENGTH <= sizeof(input_now) * CHAR_BIT); // if this trips up, scope creep happened + for (unsigned key = 0, bit = 1; key < INPUT_LENGTH; key++, bit <<= 1) { + if (evt.key.keysym.scancode == keybinds[key]) { + if (evt.key.state == SDL_PRESSED) + input_now |= bit; + else + input_now &= ~bit; + } + } + //fprintf(stderr, "input: %0*b\n", INPUT_LENGTH, input_now); + break; + case SDL_MOUSEMOTION: // the cursor moves + //fprintf(stderr, "mouse at %4i %4i\n", evt.motion.x, evt.motion.y); + break; + case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: // a left click or release + if (evt.button.state) { + //fprintf(stderr, "click %i\n", evt.button.button); + } + if (!evt.button.state) { + //fprintf(stderr, "unclick %i\n", evt.button.button); + } + break; + case SDL_MOUSEWHEEL: // the scroll wheel gets rolled + //fprintf(stderr, "scrolled by %2i %2i %4.1f %4.1f\n", evt.wheel.x, evt.wheel.y, evt.wheel.preciseX, evt.wheel.preciseY); + break; + case SDL_WINDOWEVENT: // window related events + switch (evt.window.event) { + case SDL_WINDOWEVENT_SHOWN: + //fprintf(stderr, "window %u shown\n", evt.window.windowID); + break; + case SDL_WINDOWEVENT_HIDDEN: + //fprintf(stderr, "window %u hidden\n", evt.window.windowID); + break; + case SDL_WINDOWEVENT_EXPOSED: + //fprintf(stderr, "window %u exposed\n", evt.window.windowID); + break; + case SDL_WINDOWEVENT_MOVED: // a window is moved + //fprintf(stderr, "window %u moved %4i %4i\n", evt.window.windowID, evt.window.data1, evt.window.data2); + //wx = evt.window.data1; + //wy = evt.window.data2; + break; + case SDL_WINDOWEVENT_MINIMIZED: + //fprintf(stderr, "window %u minimized\n", evt.window.windowID); + break; + case SDL_WINDOWEVENT_MAXIMIZED: + //fprintf(stderr, "window %u maximized\n", evt.window.windowID); + break; + case SDL_WINDOWEVENT_RESTORED: + //fprintf(stderr, "window %u restored\n", evt.window.windowID); + break; + case SDL_WINDOWEVENT_ENTER: + case SDL_WINDOWEVENT_LEAVE: // cursor enters or leaves a window + case SDL_WINDOWEVENT_FOCUS_GAINED: + case SDL_WINDOWEVENT_FOCUS_LOST: // keyboard + + break; + case SDL_WINDOWEVENT_CLOSE: // a window is asked to close + //fprintf(stderr, "window %u closed\n", evt.window.windowID); + break; + case SDL_WINDOWEVENT_TAKE_FOCUS: + //fprintf(stderr, "window %u offered focus\n", evt.window.windowID); + break; + case SDL_WINDOWEVENT_HIT_TEST: + //fprintf(stderr, "window %u hit test\n", evt.window.windowID); + break; + default: + fprintf(stderr, "window %u event %i\n", evt.window.windowID, evt.window.event); + } + break; + default: + fprintf(stderr, "unknown event type %i\n", evt.type); + } + } + SDL_SetRenderTarget(renderer, NULL); + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0); + SDL_RenderClear(renderer); + SDL_SetRenderDrawColor(renderer, 0, 128, 255, 0); + SDL_RenderFillRect(renderer, &(SDL_Rect) {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT}); + SDL_SetRenderDrawColor(renderer, 255, 255, 255, SDL_ALPHA_OPAQUE); + //SDL_RenderCopy(renderer, tilemap_tileset, &(SDL_Rect) {0, 0, 128, 90}, &(SDL_Rect) {0, 0, 128, 90}); + SDL_RenderCopy(renderer, tilemap_tilemap, &(SDL_Rect) {x, y, WINDOW_WIDTH, WINDOW_HEIGHT}, &(SDL_Rect) {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT}); + x += input_right(input_now) - input_left(input_now); + y += input_down(input_now) - input_up(input_now); + if (x < 0) {x = 0;} else if (x + WINDOW_WIDTH > 29 * 8) {x = 29 * 8 - WINDOW_WIDTH;} + if (y < 0) {y = 0;} else if (y + WINDOW_HEIGHT > 19 * 8) {y = 19 * 8 - WINDOW_HEIGHT;} + //SDL_RenderCopy(renderer, res_get_texture("meow").data, &(SDL_Rect) {0, 0, 128, 90}, &(SDL_Rect) {0, 0, 128, 90}); + // then we wait for the next video frame + SDL_RenderPresent(renderer); + } + + end: + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + //SDL_QuitSubSystem(INIT_SUBSYSTEMS); + return 0; +} -- cgit 1.4.1-2-gfad0