From 44a24c61ea4ae3d45b8a082904b391754e33dced Mon Sep 17 00:00:00 2001 From: Matthew Owens Date: Fri, 2 Oct 2020 11:32:47 +0100 Subject: [PATCH] added ball --- src/main.c | 110 +++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 98 insertions(+), 12 deletions(-) diff --git a/src/main.c b/src/main.c index 9ce4d31..b464d65 100644 --- a/src/main.c +++ b/src/main.c @@ -5,10 +5,15 @@ #include #include "timestep.h" -typedef struct Vec2d { +typedef struct Vec2di { int x; int y; -} Vec2d; +} Vec2di; + +typedef struct Vec2df { + float x; + float y; +} Vec2df; typedef struct Colour { Uint8 r; @@ -22,15 +27,22 @@ typedef struct Box { SDL_Rect r; } Box; +typedef struct Vbox { + Colour c; + SDL_Rect r; + Vec2df v; +} Vbox; + static SDL_Window *window = NULL; static SDL_Renderer *renderer = NULL; -static const Vec2d windowSize = { 1920, 1080 }; +static const Vec2di windowSize = { 1920, 1080 }; static bool quit = false; static const float speed = 20.f; static const Colour bgClr = { 0x1c, 0x1c, 0x1c, 0xff }; -Box pad, ball; +Vbox pad, ball; Box *vec_bricks = NULL; +Vec2df vline[2]; static void paddle_init() { @@ -43,30 +55,99 @@ static void paddle_init() pad.c.r = pad.c.g = pad.c.b = 0x55; pad.c.a = 0xff; - COUT("pad.r. (%d, %d, %d, %d)", + COUT("pad.r (%d, %d, %d, %d)", pad.r.x, pad.r.y, pad.r.w, pad.r.h); } -static void paddle_render() +static void ball_init() +{ + ball.r.h = ball.r.w = 32; + ball.r.x = (windowSize.x / 2) - (ball.r.w / 2); + ball.r.y = (windowSize.y / 2) - (ball.r.h / 2); + + ball.c.r = 0xb3; + ball.c.g = ball.c.b = 0x50; + ball.c.a = 0xff; + + ball.v.y = speed; +} + +static void box_render(const Box *b) +{ + SDL_SetRenderDrawColor(renderer, b->c.r, b->c.g, b->c.b, b->c.a); + SDL_RenderFillRect(renderer, &b->r); +} + +static void vbox_render(const Vbox *b) { - SDL_SetRenderDrawColor(renderer, pad.c.r, pad.c.g, pad.c.b, pad.c.a); - SDL_RenderFillRect(renderer, &pad.r); + SDL_SetRenderDrawColor(renderer, b->c.r, b->c.g, b->c.b, b->c.a); + SDL_RenderFillRect(renderer, &b->r); } static void paddle_update(const Uint8* keyStates, float dt) { + pad.v.x = 0; + if(keyStates[SDL_SCANCODE_LEFT] || keyStates[SDL_SCANCODE_A]) { - pad.r.x -= speed * dt; + pad.v.x = -speed; } if(keyStates[SDL_SCANCODE_RIGHT] || keyStates[SDL_SCANCODE_D]) { - pad.r.x += speed * dt; + pad.v.x = speed; } + + pad.r.x += pad.v.x * 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 void ball_update(float dt) +{ + bool collisionResponded = false; + // applying velocity + ball.r.x += ball.v.x * dt; + ball.r.y += ball.v.y * dt; + + vline[0].x = ball.r.x + ball.r.w / 2; + vline[0].y = ball.r.y + ball.r.h / 2; + + // todo: fix + // terniary should be replaced with the size of the ball * normalised vel + vline[1].x = vline[0].x + ball.v.x + ( ball.v.x > 0 ? ball.r.w / 2 : 0); + vline[1].y = vline[0].y + ball.v.y + ( ball.v.y > 0 ? ball.r.h / 2 : 0); + + + // paddle bounds checks & responses + /* + if( ( + (ball.r.x > pad.r.x && ball.r.x < pad.r.x + pad.r.w ) || + (ball.r.x + ball.r.w > pad.r.x && ball.r.x + ball.r.w < pad.r.x + pad.r.w ) + ) && ( + (ball.r.y > pad.r.y && ball.r.y < pad.r.y + pad.r.h ) || + (ball.r.y + ball.r.h > pad.r.y && ball.r.y + ball.r.h < pad.r.y + pad.r.h ) + ) + ) + { + ball.v.y *= -1; + } + */ + + + // screen bounds checks & responses + if(ball.r.x + ball.r.w > windowSize.x && !collisionResponded){ + ball.r.x = windowSize.x - ball.r.w; + ball.v.x *= -1; + } + if(ball.r.y + ball.r.h > windowSize.y && !collisionResponded){ + ball.r.y = windowSize.y - ball.r.h; + ball.v.y *= -1; + } + if(ball.r.y < 0 ) { ball.r.y = 0; ball.v.y *= -1; } + if(ball.r.x < 0 ) { ball.r.x = 0; ball.v.x *= -1; } +} + static bool init() { if(SDL_Init( @@ -96,6 +177,7 @@ static bool init() ts_init(60.f); paddle_init(); + ball_init(); return true; } @@ -113,7 +195,8 @@ static void update() ts_update(); while(ts_phys_required(nPhysUpdates)){ - paddle_update(keyStates, 1.f); + paddle_update(keyStates, ts_delta()); + ball_update(ts_delta()); nPhysUpdates++; } } @@ -122,7 +205,10 @@ static void render() { SDL_SetRenderDrawColor(renderer, bgClr.r, bgClr.g, bgClr.b, bgClr.a); SDL_RenderClear(renderer); - paddle_render(); + vbox_render(&pad); + vbox_render(&ball); + SDL_SetRenderDrawColor(renderer, 0x00, 0xff, 0x00, 0xff); + SDL_RenderDrawLine(renderer, vline[0].x, vline[0].y, vline[1].x, vline[1].y); SDL_RenderPresent(renderer); } -- 2.20.1