Reorganize code
This commit is contained in:
parent
87a3970222
commit
4a31ce4bd2
169
games/arkanoid.c
169
games/arkanoid.c
@ -77,9 +77,6 @@ static void DrawGame(void); // Draw game (one frame)
|
|||||||
static void UnloadGame(void); // Unload game
|
static void UnloadGame(void); // Unload game
|
||||||
static void UpdateDrawFrame(void); // Update and Draw (one frame)
|
static void UpdateDrawFrame(void); // Update and Draw (one frame)
|
||||||
|
|
||||||
// Additional module functions
|
|
||||||
static void UpdateBall(void);
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------
|
||||||
// Program main entry point
|
// Program main entry point
|
||||||
//------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------
|
||||||
@ -165,13 +162,13 @@ void UpdateGame(void)
|
|||||||
|
|
||||||
if (!pause)
|
if (!pause)
|
||||||
{
|
{
|
||||||
// Player movement
|
// Player movement logic
|
||||||
if (IsKeyDown(KEY_LEFT)) player.position.x -= 5;
|
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 ((player.position.x - player.size.x/2) <= 0) player.position.x = player.size.x/2;
|
||||||
if (IsKeyDown(KEY_RIGHT)) player.position.x += 5;
|
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;
|
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 (!ball.active)
|
||||||
{
|
{
|
||||||
if (IsKeyPressed(KEY_SPACE))
|
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
|
// Game over logic
|
||||||
if (player.life <= 0) gameOver = true;
|
if (player.life <= 0) gameOver = true;
|
||||||
@ -261,89 +332,3 @@ void UpdateDrawFrame(void)
|
|||||||
UpdateGame();
|
UpdateGame();
|
||||||
DrawGame();
|
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user