Physics Fixes

This commit is contained in:
Isuru Samarathunga
2025-09-23 13:31:00 +05:30
parent 1573644c51
commit f5693ef0fa
5 changed files with 24 additions and 5 deletions

View File

@ -42,7 +42,7 @@ namespace ia::iae::game
0,
0,
g_player->DrawnSize().x,
g_player->DrawnSize().y/2.0f,
g_player->DrawnSize().y,
};
collider->IsDebugDrawEnabled() = true;
}

View File

@ -48,11 +48,15 @@ namespace ia::iae
{
if (other->HasTag(NODE_TAG_GROUND))
m_body->IsGrounded() = true;
if(m_collisionEnterCallback)
m_collisionEnterCallback(other);
}
VOID BoxCollider2DComponent::OnCollisionExit(IN Node *other)
{
if (other->HasTag(NODE_TAG_GROUND))
m_body->IsGrounded() = false;
if(m_collisionExitCallback)
m_collisionExitCallback(other);
}
} // namespace ia::iae

View File

@ -104,12 +104,13 @@ namespace ia::iae
{
for (auto &b : g_bodies)
{
const auto drawnSize = b.BodyComponent->GetNode()->DrawnSize();
const auto pos = b.BodyComponent->GetNode()->GetPosition();
auto bodyDef = b2DefaultBodyDef();
if (b.BodyComponent->IsDynamic())
bodyDef.type = b2_dynamicBody;
bodyDef.position = b2Vec2{pos.x, pos.y};
bodyDef.position = b2Vec2{pos.x + drawnSize.x/2.0f, pos.y + drawnSize.y/2.0f};
if (b.BodyId.world0 != 0xFFFF)
b2DestroyBody(b.BodyId);
b.BodyId = b2CreateBody(g_worldId, &bodyDef);
@ -119,7 +120,7 @@ namespace ia::iae
const auto rect = c.ColliderComponent->Rect();
const auto halfW = rect.z/2.0f;
const auto halfH = rect.w/2.0f;
const auto box = b2MakeOffsetBox(halfW, halfH, {rect.x, rect.y - halfH/2.0f}, b2MakeRot(0));
const auto box = b2MakeOffsetBox(halfW, halfH, {rect.x, rect.y}, b2MakeRot(0));
auto boxShapeDef = b2DefaultShapeDef();
boxShapeDef.density = 1.0f;
boxShapeDef.isSensor = c.ColliderComponent->IsTrigger();
@ -157,8 +158,9 @@ namespace ia::iae
glm::vec2 Physics::GetBodyPosition(IN Handle handle)
{
const auto &b = g_bodies[handle];
const auto drawnSize = b.BodyComponent->GetNode()->DrawnSize();
const auto v = b2Body_GetPosition(b.BodyId);
return {v.x, v.y};
return {v.x - drawnSize.x/2.0f, v.y - drawnSize.y/2.0f};
}
VOID Physics::ApplyBodyForce(IN Handle handle, IN glm::vec2 force)

View File

@ -31,6 +31,17 @@ namespace ia::iae
VOID OnCollisionEnter(IN Node *other);
VOID OnCollisionExit(IN Node *other);
public:
VOID SetCollisionEnterCallback(IN std::function<VOID(IN Node *)> callback)
{
m_collisionEnterCallback = callback;
}
VOID SetCollisionExitCallback(IN std::function<VOID(IN Node *)> callback)
{
m_collisionExitCallback = callback;
}
public:
BOOL &IsDebugDrawEnabled()
{
@ -68,5 +79,7 @@ namespace ia::iae
BOOL m_collisionsEnabled{true};
Handle m_physicsHandle{INVALID_HANDLE};
PhysicsBody2DComponent *m_body{};
std::function<VOID(IN Node *)> m_collisionEnterCallback{};
std::function<VOID(IN Node *)> m_collisionExitCallback{};
};
} // namespace ia::iae

View File

@ -60,7 +60,7 @@ namespace ia::iae
private:
BOOL m_isDynamic{};
BOOL m_isGrounded{};
BOOL m_isRotationLocked{};
BOOL m_isRotationLocked{true};
Handle m_physicsHandle{INVALID_HANDLE};
};
} // namespace ia::iae