diff --git a/Src/IAESandbox/imp/cpp/Game.cpp b/Src/IAESandbox/imp/cpp/Game.cpp index 5c737e1..bb6a396 100644 --- a/Src/IAESandbox/imp/cpp/Game.cpp +++ b/Src/IAESandbox/imp/cpp/Game.cpp @@ -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; } diff --git a/Src/IAEngine/imp/cpp/Components/BoxCollider2D.cpp b/Src/IAEngine/imp/cpp/Components/BoxCollider2D.cpp index 329f274..4b5e635 100644 --- a/Src/IAEngine/imp/cpp/Components/BoxCollider2D.cpp +++ b/Src/IAEngine/imp/cpp/Components/BoxCollider2D.cpp @@ -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 \ No newline at end of file diff --git a/Src/IAEngine/imp/cpp/Physics/Physics.cpp b/Src/IAEngine/imp/cpp/Physics/Physics.cpp index 9758d12..441ee6f 100644 --- a/Src/IAEngine/imp/cpp/Physics/Physics.cpp +++ b/Src/IAEngine/imp/cpp/Physics/Physics.cpp @@ -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) diff --git a/Src/IAEngine/inc/IAEngine/Components/BoxCollider2D.hpp b/Src/IAEngine/inc/IAEngine/Components/BoxCollider2D.hpp index 6783298..fc10556 100644 --- a/Src/IAEngine/inc/IAEngine/Components/BoxCollider2D.hpp +++ b/Src/IAEngine/inc/IAEngine/Components/BoxCollider2D.hpp @@ -31,6 +31,17 @@ namespace ia::iae VOID OnCollisionEnter(IN Node *other); VOID OnCollisionExit(IN Node *other); + public: + VOID SetCollisionEnterCallback(IN std::function callback) + { + m_collisionEnterCallback = callback; + } + + VOID SetCollisionExitCallback(IN std::function 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 m_collisionEnterCallback{}; + std::function m_collisionExitCallback{}; }; } // namespace ia::iae \ No newline at end of file diff --git a/Src/IAEngine/inc/IAEngine/Components/PhysicsBody2D.hpp b/Src/IAEngine/inc/IAEngine/Components/PhysicsBody2D.hpp index 74072fc..d54ddbf 100644 --- a/Src/IAEngine/inc/IAEngine/Components/PhysicsBody2D.hpp +++ b/Src/IAEngine/inc/IAEngine/Components/PhysicsBody2D.hpp @@ -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 \ No newline at end of file