From ba16549664b44b047cc604f8383131bed907aa9f Mon Sep 17 00:00:00 2001 From: Matthew Owens Date: Thu, 1 Oct 2020 15:48:39 +0100 Subject: [PATCH] basic paddle movement --- src/main.c | 135 ++++++++++++++++++++++++++++++++++++++++++++++++++++- src/main.o | Bin 3696 -> 30648 bytes 2 files changed, 133 insertions(+), 2 deletions(-) diff --git a/src/main.c b/src/main.c index 0c0ce22..fb05761 100644 --- a/src/main.c +++ b/src/main.c @@ -1,10 +1,141 @@ #include #include "clogs.h" #include "vector.h" +#include +#include +#include "timestep.h" + +typedef struct Colour { + Uint8 r; + Uint8 g; + Uint8 b; + Uint8 a; +} Colour; + +typedef struct Box { + Colour c; + SDL_Rect r; +} Box; + +static SDL_Window *window = NULL; +static SDL_Renderer *renderer = NULL; +static const Vec2d windowSize = { 1920, 1080 }; +static bool quit = false; +static const float speed = 5.f; +static const Colour bgClr = { 0x1c, 0x1c, 0x1c, 0xff }; + +Box pad, ball; +Box *vec_bricks = NULL; + +static void paddle_init() +{ + pad.r.w = 192; + pad.r.h = 32; + + pad.r.x = (windowSize.x / 2) - (pad.r.w / 2); + pad.r.y = windowSize.y - ((windowSize.y / 8) - (pad.r.h / 2)); + + pad.c.r = pad.c.g = pad.c.b = 0x55; + pad.c.a = 0xff; + + COUT("pad.r. (%d, %d, %d, %d)", + pad.r.x, pad.r.y, pad.r.w, pad.r.h); +} + +static void paddle_render() +{ + SDL_SetRenderDrawColor(renderer, pad.c.r, pad.c.g, pad.c.b, pad.c.a); + SDL_RenderFillRect(renderer, &pad.r); +} + +static void paddle_update(const Uint8* keyStates, float dt) +{ + if(keyStates[SDL_SCANCODE_LEFT] || keyStates[SDL_SCANCODE_A]) { + pad.r.x -= speed * dt; + } + + if(keyStates[SDL_SCANCODE_RIGHT] || keyStates[SDL_SCANCODE_D]) { + pad.r.x += speed * dt; + } + // screen bounds check + if(pad.r.x + pad.r.w > windowSize.x) { pad.r.x = windowSize.x - pad.r.w; } + if(pad.r.x < 0 ) { pad.r.x = 0; } +} + +static bool init() +{ + if(SDL_Init( + SDL_INIT_TIMER | SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_EVENTS + ) < 0) { + COUT_ERR("SDL init failed! SDL_Error: %s", SDL_GetError()); + return false; + } + + window = SDL_CreateWindow("pong", + SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, + windowSize.x, windowSize.y, + SDL_WINDOW_INPUT_FOCUS | SDL_WINDOW_BORDERLESS); + + if(window == NULL) { + COUT_ERR("Couldn't create window! SDL_Error: %s", SDL_GetError()); + return false; + } + + renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); + + if(renderer == NULL) { + COUT_ERR("Couldn't create renderer! SDL_Error: %s", SDL_GetError()); + return false; + } + + ts_init(60.f); + paddle_init(); + return true; +} + +static void update() +{ + SDL_Event e; + int nPhysUpdates = 0; + const Uint8 *keyStates = SDL_GetKeyboardState(NULL); + + ts_update(); + + while(SDL_PollEvent(&e) != 0){ + if(e.type == SDL_QUIT) { quit = true; } + } + + while(ts_phys_required(nPhysUpdates)){ + paddle_update(keyStates, 1.f); + nPhysUpdates++; + } +} + +static void render() +{ + SDL_SetRenderDrawColor(renderer, bgClr.r, bgClr.g, bgClr.b, bgClr.a); + SDL_RenderClear(renderer); + paddle_render(); + SDL_RenderPresent(renderer); +} + +static void cleanup() +{ + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + SDL_Quit(); +} int main() { - printf("hello, world\n"); - COUT("TEST"); + //TODO: run on primary display + if(!init()) { return 1; } + + while(!quit) { + update(); + render(); + } + + cleanup(); return 0; } diff --git a/src/main.o b/src/main.o index afd1b90efa12f82506cda7327db9c4ca1630051b..667fbd2f1ade99abc93541b552b34d02bb830644 100644 GIT binary patch literal 30648 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 Pi|-N(9f^ACf*k)p(MMbw -- 2.20.1