1
0

Collisions

This commit is contained in:
2022-10-20 11:37:27 +02:00
parent 95ab077a7e
commit 80fa82f618
2 changed files with 51 additions and 0 deletions

View File

@@ -16,6 +16,37 @@ const float BALL_RADIUS = 12.5f;
BallObject* ball;
// AABB with AABB collision detection
bool CheckCollisions(GameObject& one, GameObject& two)
{
// Collision on the X-Axis
bool CollisionX = one.Position.x + one.Size.x >= two.Position.x &&
two.Position.x + two.Size.x >= one.Position.x;
// Colision on the y-Axis
bool CollisionY = one.Position.y + one.Size.y >= two.Position.y &&
two.Position.y + two.Size.y >= one.Position.y;
return CollisionX && CollisionY;
}
// AABB with circle collision detection
bool CheckCollisions(BallObject& one, GameObject& two)
{
// Calculate the closest point on two's border to the center point of one
glm::vec2 center (one.Position + one.Radius);
glm::vec2 aabb_half_extents(two.Size.x /2.0f, two.Size.y / 2.0f);
glm::vec2 aabb_center(two.Position.x + aabb_half_extents.x, two.Position.y + aabb_half_extents.y );
glm::vec2 difference = center - aabb_center;
glm::vec2 clamped = glm::clamp(difference, -aabb_half_extents, aabb_half_extents);
glm::vec2 closest = aabb_center + clamped;
// Calculate the distance and check if it is less then two's radius
difference = closest - center;
return glm::length(difference) < one.Radius;
}
Game::~Game()
@@ -69,6 +100,24 @@ void Game::Init()
}
void Game::DoCollisions()
{
for(GameObject& box: this->Levels[this->Level].Bricks)
{
if(!box.Destroyed)
{
if(CheckCollisions(*ball, box))
{
if(!box.IsSolid)
{
box.Destroyed = true;
}
}
}
}
}
void Game::ProcessInput(float dt)
{
if(this->State == GAME_ACTIVE)
@@ -107,6 +156,7 @@ void Game::ProcessInput(float dt)
void Game::Update(float dt)
{
ball->Move(dt, this->Width);
this->DoCollisions();
}
void Game::Render()

View File

@@ -35,6 +35,7 @@ class Game {
void ProcessInput(float dt);
void Update(float dt);
void Render();
void DoCollisions();
};