Physics Fixes
This commit is contained in:
@ -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;
|
||||
}
|
||||
|
||||
@ -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
|
||||
@ -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)
|
||||
|
||||
@ -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
|
||||
@ -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
|
||||
Reference in New Issue
Block a user