commit d4f51ee3d1964c6bc50e2662c9b4915f34b7fd71 Author: Quinn <99677023+thepigeongenerator@users.noreply.github.com> Date: Mon Jun 10 14:07:54 2024 +0200 initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6a8bc10 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.vscode +build \ No newline at end of file diff --git a/error_codes.h b/error_codes.h new file mode 100644 index 0000000..26a7ad2 --- /dev/null +++ b/error_codes.h @@ -0,0 +1,17 @@ +#pragma once +enum { + SUCCESS = 0, + FAILURE = -1, + + FAILURE_STD = 1 << 0, // 1 : marks a generic C library error + FAILURE_MEMORY = FAILURE_STD | (1 << 1), // 3 : marks a memory related error + + // SDL ERRORS + FAILURE_SDL = 1 << 1, // 2 : marks a generic SDL error + FAILURE_SDL_INIT = FAILURE_SDL | (1 << 2), // 6 : marks an error during SDL initialisation + FAILURE_SDL_WINDOW = FAILURE_SDL | (1 << 3), // 10 : marks an error with the window + FAILURE_SDL_RENDERER = FAILURE_SDL | (1 << 4), // 18 : marks an error with the renderer + + // GAME ERRORS + FAILURE_GAME = 1 << 2, // 4 : marks a generic game error +}; \ No newline at end of file diff --git a/level.c b/level.c new file mode 100644 index 0000000..f699b9f --- /dev/null +++ b/level.c @@ -0,0 +1,9 @@ +#include +#include +#include "level.h" + +//prepares the level to be in a playable state +void level_init(Level* level) {} + +//updates the level +void level_update(Level* level, bool* keys) {} diff --git a/level.h b/level.h new file mode 100644 index 0000000..2246b3d --- /dev/null +++ b/level.h @@ -0,0 +1,17 @@ +#pragma once +#include +#include + +typedef struct { + unsigned x; + unsigned y; +} Position; + +typedef struct { + Position ball_pos; + Position bouncer_pos; +} Level; + + +void level_init(Level* level); +void level_update(Level* level, bool* keys); diff --git a/main.c b/main.c new file mode 100644 index 0000000..29fc5f7 --- /dev/null +++ b/main.c @@ -0,0 +1,95 @@ +#include +#include +#include +#include +#include "error_codes.h" +#include "renderer.h" +#include "level.h" + +#define UPDATES_PER_SEC 50 +#define CLOCKS_PER_UPDATE (CLOCKS_PER_SEC / UPDATES_PER_SEC) +#define CLOCKS_PER_UPDATE_F (((float)CLOCKS_PER_SEC) / UPDATES_PER_SEC) + +// initializes the game +static int init(SDL_Window* window, SDL_Renderer* renderer, Level* level) { + level_init(level); + return renderer_init(&window, &renderer); +} + +// called on each game update +static bool update(Level* level, bool* keys, RenderData* render_data) { + clock_t clock_start = clock(); + + //update the event keys + { + SDL_Event e; + while (SDL_PollEvent(&e)) { + switch (e.type) { + case SDL_QUIT: + return false; + break; + + case SDL_KEYDOWN: + keys[e.key.keysym.sym] = true; + break; + case SDL_KEYUP: + keys[e.key.keysym.sym] = false; + break; + } + } + } + + // preform updates + { + level_update(level, keys); //update the level + renderer_update(render_data); //update the render + } + + clock_t clock_end = clock(); + + // provide a delay if needed, otherwise log a warning + clock_t clock_diff = clock_end - clock_start; // difference / how long the operations took + int remaining_ms = (int)((CLOCKS_PER_UPDATE_F - clock_diff) / CLOCKS_PER_SEC) * 1000; + + if (remaining_ms < 0) { + (void)printf("delay between updates was %dms too long.", -remaining_ms); + } + else { + SDL_Delay(remaining_ms); // wait the time in ms + } + + return true; +} + +// cleans up resources +static void close(SDL_Window* window, SDL_Renderer* renderer) { + renderer_destroy(window, renderer); +} + +// entry-point of the application +int main(void) { + Level* level = NULL; //stores the game's state + SDL_Window* window = NULL; //the window that is given to the OS + SDL_Renderer* renderer = NULL; //the renderer used to draw to the window + bool keys[322] = { 0 }; //stores the key states + + // initialize + { + int code = init(window, renderer, level); + if (code != SUCCESS) + exit(code); + } + + bool quit = false; + + // TEMP: tell me that the program has been initialized + (void)printf("initialized!\n"); + + // game-loop + RenderData render_data = { window, renderer, level }; //contains the data which is used to render the game + while (update(level, keys, &render_data)); + + // frees media and shuts down SDL + close(window, renderer); + return 0; +} \ No newline at end of file diff --git a/renderer.c b/renderer.c new file mode 100644 index 0000000..f778c19 --- /dev/null +++ b/renderer.c @@ -0,0 +1,54 @@ +#include "renderer.h" + +#include +#include + +#include "error_codes.h" +#include "level.h" + +#define SCREEN_WIDTH 960 +#define SCREEN_HEIGHT 640 + +// initializes the window and renderer +int renderer_init(SDL_Window** window, SDL_Renderer** renderer) { + // initialize SDL + if (SDL_Init(SDL_INIT_VIDEO) < 0) { + (void)printf("SDL Failed to initialize! SDL_Error: %s\n", SDL_GetError()); + return FAILURE_SDL_INIT; + } + + // init the window + *window = SDL_CreateWindow("Title", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN); + if (*window == NULL) { + (void)printf("Window failed to be created! SDL_Error: %s\n", SDL_GetError()); + return FAILURE_SDL_WINDOW; + } + + // create a renderer + *renderer = SDL_CreateRenderer(*window, -1, SDL_RENDERER_PRESENTVSYNC); + + if (*renderer == NULL) { + (void)printf("Renderer failed to be created! SDL_Error: %s\n", SDL_GetError()); + return FAILURE_SDL_RENDERER; + } + + return SUCCESS; +} + +// renders the screen +void renderer_update(RenderData* render_data) { + int success = 0x0; + success | SDL_SetRenderDrawColor(render_data->renderer, 0x00, 0x00, 0x00, 0xFF); + success | SDL_RenderClear(render_data->renderer); + SDL_RenderPresent(render_data->renderer); + + if (success != 0) { + printf("something went wrong during the render update! -> %d", success); + } +} + +void renderer_destroy(SDL_Window* window, SDL_Renderer* renderer) { + SDL_DestroyWindow(window); + SDL_DestroyRenderer(renderer); + SDL_Quit(); +} \ No newline at end of file diff --git a/renderer.h b/renderer.h new file mode 100644 index 0000000..8adbc19 --- /dev/null +++ b/renderer.h @@ -0,0 +1,14 @@ +#pragma once + +#include +#include "level.h" + +typedef struct { + SDL_Window* window; + SDL_Renderer* renderer; + Level* level; +} RenderData; + +int renderer_init(SDL_Window** window, SDL_Renderer** renderer); +void renderer_update(RenderData* render_data); +void renderer_destroy(SDL_Window* window, SDL_Renderer* renderer);