Collisions
This commit is contained in:
50
src/game.cpp
50
src/game.cpp
@@ -16,6 +16,37 @@ const float BALL_RADIUS = 12.5f;
|
|||||||
|
|
||||||
BallObject* ball;
|
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()
|
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)
|
void Game::ProcessInput(float dt)
|
||||||
{
|
{
|
||||||
if(this->State == GAME_ACTIVE)
|
if(this->State == GAME_ACTIVE)
|
||||||
@@ -107,6 +156,7 @@ void Game::ProcessInput(float dt)
|
|||||||
void Game::Update(float dt)
|
void Game::Update(float dt)
|
||||||
{
|
{
|
||||||
ball->Move(dt, this->Width);
|
ball->Move(dt, this->Width);
|
||||||
|
this->DoCollisions();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Game::Render()
|
void Game::Render()
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ class Game {
|
|||||||
void ProcessInput(float dt);
|
void ProcessInput(float dt);
|
||||||
void Update(float dt);
|
void Update(float dt);
|
||||||
void Render();
|
void Render();
|
||||||
|
void DoCollisions();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user