|
|
@ -77,9 +77,6 @@ static void DrawGame(void); // Draw game (one frame) |
|
|
|
static void UnloadGame(void); // Unload game |
|
|
|
static void UpdateDrawFrame(void); // Update and Draw (one frame) |
|
|
|
|
|
|
|
// Additional module functions |
|
|
|
static void UpdateBall(void); |
|
|
|
|
|
|
|
//------------------------------------------------------------------------------------ |
|
|
|
// Program main entry point |
|
|
|
//------------------------------------------------------------------------------------ |
|
|
@ -165,13 +162,13 @@ void UpdateGame(void) |
|
|
|
|
|
|
|
if (!pause) |
|
|
|
{ |
|
|
|
// Player movement |
|
|
|
// Player movement logic |
|
|
|
if (IsKeyDown(KEY_LEFT)) player.position.x -= 5; |
|
|
|
if ((player.position.x - player.size.x/2) <= 0) player.position.x = player.size.x/2; |
|
|
|
if (IsKeyDown(KEY_RIGHT)) player.position.x += 5; |
|
|
|
if ((player.position.x + player.size.x/2) >= screenWidth) player.position.x = screenWidth - player.size.x/2; |
|
|
|
|
|
|
|
// Launch ball |
|
|
|
// Ball launching logic |
|
|
|
if (!ball.active) |
|
|
|
{ |
|
|
|
if (IsKeyPressed(KEY_SPACE)) |
|
|
@ -181,7 +178,81 @@ void UpdateGame(void) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
UpdateBall(); |
|
|
|
// Ball movement logic |
|
|
|
if (ball.active) |
|
|
|
{ |
|
|
|
ball.position.x += ball.speed.x; |
|
|
|
ball.position.y += ball.speed.y; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
ball.position = (Vector2){ player.position.x, screenHeight*7/8 - 30 }; |
|
|
|
} |
|
|
|
|
|
|
|
// Collision logic: ball vs walls |
|
|
|
if (((ball.position.x + ball.radius) >= screenWidth) || ((ball.position.x - ball.radius) <= 0)) ball.speed.x *= -1; |
|
|
|
if ((ball.position.y - ball.radius) <= 0) ball.speed.y *= -1; |
|
|
|
if ((ball.position.y + ball.radius) >= screenHeight) |
|
|
|
{ |
|
|
|
ball.speed = (Vector2){ 0, 0 }; |
|
|
|
ball.active = false; |
|
|
|
|
|
|
|
player.life--; |
|
|
|
} |
|
|
|
|
|
|
|
// Collision logic: ball vs player |
|
|
|
if (CheckCollisionCircleRec(ball.position, ball.radius, |
|
|
|
(Rectangle){ player.position.x - player.size.x/2, player.position.y - player.size.y/2, player.size.x, player.size.y})) |
|
|
|
{ |
|
|
|
if (ball.speed.y > 0) |
|
|
|
{ |
|
|
|
ball.speed.y *= -1; |
|
|
|
ball.speed.x = (ball.position.x - player.position.x)/(player.size.x/2)*5; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Collision logic: ball vs bricks |
|
|
|
for (int i = 0; i < LINES_OF_BRICKS; i++) |
|
|
|
{ |
|
|
|
for (int j = 0; j < BRICKS_PER_LINE; j++) |
|
|
|
{ |
|
|
|
if (brick[i][j].active) |
|
|
|
{ |
|
|
|
// Hit below |
|
|
|
if (((ball.position.y - ball.radius) <= (brick[i][j].position.y + brickSize.y/2)) && |
|
|
|
((ball.position.y - ball.radius) > (brick[i][j].position.y + brickSize.y/2 + ball.speed.y)) && |
|
|
|
((fabs(ball.position.x - brick[i][j].position.x)) < (brickSize.x/2 + ball.radius*2/3)) && (ball.speed.y < 0)) |
|
|
|
{ |
|
|
|
brick[i][j].active = false; |
|
|
|
ball.speed.y *= -1; |
|
|
|
} |
|
|
|
// Hit above |
|
|
|
else if (((ball.position.y + ball.radius) >= (brick[i][j].position.y - brickSize.y/2)) && |
|
|
|
((ball.position.y + ball.radius) < (brick[i][j].position.y - brickSize.y/2 + ball.speed.y)) && |
|
|
|
((fabs(ball.position.x - brick[i][j].position.x)) < (brickSize.x/2 + ball.radius*2/3)) && (ball.speed.y > 0)) |
|
|
|
{ |
|
|
|
brick[i][j].active = false; |
|
|
|
ball.speed.y *= -1; |
|
|
|
} |
|
|
|
// Hit left |
|
|
|
else if (((ball.position.x + ball.radius) >= (brick[i][j].position.x - brickSize.x/2)) && |
|
|
|
((ball.position.x + ball.radius) < (brick[i][j].position.x - brickSize.x/2 + ball.speed.x)) && |
|
|
|
((fabs(ball.position.y - brick[i][j].position.y)) < (brickSize.y/2 + ball.radius*2/3)) && (ball.speed.x > 0)) |
|
|
|
{ |
|
|
|
brick[i][j].active = false; |
|
|
|
ball.speed.x *= -1; |
|
|
|
} |
|
|
|
// Hit right |
|
|
|
else if (((ball.position.x - ball.radius) <= (brick[i][j].position.x + brickSize.x/2)) && |
|
|
|
((ball.position.x - ball.radius) > (brick[i][j].position.x + brickSize.x/2 + ball.speed.x)) && |
|
|
|
((fabs(ball.position.y - brick[i][j].position.y)) < (brickSize.y/2 + ball.radius*2/3)) && (ball.speed.x < 0)) |
|
|
|
{ |
|
|
|
brick[i][j].active = false; |
|
|
|
ball.speed.x *= -1; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Game over logic |
|
|
|
if (player.life <= 0) gameOver = true; |
|
|
@ -260,90 +331,4 @@ void UpdateDrawFrame(void) |
|
|
|
{ |
|
|
|
UpdateGame(); |
|
|
|
DrawGame(); |
|
|
|
} |
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------- |
|
|
|
// Additional module functions |
|
|
|
//-------------------------------------------------------------------------------------- |
|
|
|
static void UpdateBall() |
|
|
|
{ |
|
|
|
// Update position |
|
|
|
if (ball.active) |
|
|
|
{ |
|
|
|
ball.position.x += ball.speed.x; |
|
|
|
ball.position.y += ball.speed.y; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
ball.position = (Vector2){ player.position.x, screenHeight*7/8 - 30 }; |
|
|
|
} |
|
|
|
|
|
|
|
// Bounce in x |
|
|
|
if (((ball.position.x + ball.radius) >= screenWidth) || ((ball.position.x - ball.radius) <= 0)) ball.speed.x *= -1; |
|
|
|
|
|
|
|
// Bounce in y |
|
|
|
if ((ball.position.y - ball.radius) <= 0) ball.speed.y *= -1; |
|
|
|
|
|
|
|
// Ball reaches bottom of the screen |
|
|
|
if ((ball.position.y + ball.radius) >= screenHeight) |
|
|
|
{ |
|
|
|
ball.speed = (Vector2){ 0, 0 }; |
|
|
|
ball.active = false; |
|
|
|
|
|
|
|
player.life--; |
|
|
|
} |
|
|
|
|
|
|
|
// Collision logic: ball vs player |
|
|
|
if (CheckCollisionCircleRec(ball.position, ball.radius, |
|
|
|
(Rectangle){ player.position.x - player.size.x/2, player.position.y - player.size.y/2, player.size.x, player.size.y})) |
|
|
|
{ |
|
|
|
if (ball.speed.y > 0) |
|
|
|
{ |
|
|
|
ball.speed.y *= -1; |
|
|
|
ball.speed.x = (ball.position.x - player.position.x)/(player.size.x/2)*5; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Collision logic: ball vs bricks |
|
|
|
for (int i = 0; i < LINES_OF_BRICKS; i++) |
|
|
|
{ |
|
|
|
for (int j = 0; j < BRICKS_PER_LINE; j++) |
|
|
|
{ |
|
|
|
if (brick[i][j].active) |
|
|
|
{ |
|
|
|
// Hit below |
|
|
|
if (((ball.position.y - ball.radius) <= (brick[i][j].position.y + brickSize.y/2)) && |
|
|
|
((ball.position.y - ball.radius) > (brick[i][j].position.y + brickSize.y/2 + ball.speed.y)) && |
|
|
|
((fabs(ball.position.x - brick[i][j].position.x)) < (brickSize.x/2 + ball.radius*2/3)) && (ball.speed.y < 0)) |
|
|
|
{ |
|
|
|
brick[i][j].active = false; |
|
|
|
ball.speed.y *= -1; |
|
|
|
} |
|
|
|
// Hit above |
|
|
|
else if (((ball.position.y + ball.radius) >= (brick[i][j].position.y - brickSize.y/2)) && |
|
|
|
((ball.position.y + ball.radius) < (brick[i][j].position.y - brickSize.y/2 + ball.speed.y)) && |
|
|
|
((fabs(ball.position.x - brick[i][j].position.x)) < (brickSize.x/2 + ball.radius*2/3)) && (ball.speed.y > 0)) |
|
|
|
{ |
|
|
|
brick[i][j].active = false; |
|
|
|
ball.speed.y *= -1; |
|
|
|
} |
|
|
|
// Hit left |
|
|
|
else if (((ball.position.x + ball.radius) >= (brick[i][j].position.x - brickSize.x/2)) && |
|
|
|
((ball.position.x + ball.radius) < (brick[i][j].position.x - brickSize.x/2 + ball.speed.x)) && |
|
|
|
((fabs(ball.position.y - brick[i][j].position.y)) < (brickSize.y/2 + ball.radius*2/3)) && (ball.speed.x > 0)) |
|
|
|
{ |
|
|
|
brick[i][j].active = false; |
|
|
|
ball.speed.x *= -1; |
|
|
|
} |
|
|
|
// Hit right |
|
|
|
else if (((ball.position.x - ball.radius) <= (brick[i][j].position.x + brickSize.x/2)) && |
|
|
|
((ball.position.x - ball.radius) > (brick[i][j].position.x + brickSize.x/2 + ball.speed.x)) && |
|
|
|
((fabs(ball.position.y - brick[i][j].position.y)) < (brickSize.y/2 + ball.radius*2/3)) && (ball.speed.x < 0)) |
|
|
|
{ |
|
|
|
brick[i][j].active = false; |
|
|
|
ball.speed.x *= -1; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |