summaryrefslogtreecommitdiff
path: root/src/main.c
diff options
context:
space:
mode:
authorzlago2024-09-24 20:54:48 +0200
committerzlago2024-09-24 20:54:48 +0200
commitb23a3ab831f91553d34a48f51370ed9525de07ac (patch)
treebd4adf20ba92d17433f386c0b5347a8d8cc9045f /src/main.c
initial commit
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c178
1 files changed, 178 insertions, 0 deletions
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 <SDL2/SDL.h>
+
+#include <stdlib.h>
+
+#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;
+}