#include "EnginePhysicsSystem.h" #include "../GameEngine/Engine_Physics/RigidBodyPhysics.h" // Engine Physics System EnginePhysicsSystem::EnginePhysicsSystem(Scene& inputScene, b2Vec2 gravityFactor) : EngineMessageSystem(inputScene), physicsScene(gravityFactor) {} // Step through the Engine Physics Sysetm void EnginePhysicsSystem::play(const sf::Time& elapsedTime) { enginePhysicsSystemProfiler.startTime(); // Apply Gravity - b2World::play(float32 dt, int32 velocityIterations, int32 positionIterations) physicsScene.play(elapsedTime.asSeconds(), 8, 3); // Loop thorugh the messages and apply Physics (i.e. Movement, Rotation...) auto Enginemessages = scene->getEntityManagement().getMessageSystemEventType(MessageSystemEventType::RIGID_BODY_PHYSICS_TYPE); for (auto messages : *Enginemessages) { auto physicsBody = static_cast<RigidBodyPhysics*>(messages.first)->getBody(); auto physicsSprite = messages.second->getEntitySprite(); // Set position for sprites physicsSprite->setPosition(physicsBody->GetPosition().x * SCALE_PIXELS_TO_UNITS, physicsBody->GetPosition().y * SCALE_PIXELS_TO_UNITS); // Set rotation for sprites physicsSprite->setRotation((180.f / b2_pi) * physicsBody->GetAngle()); } enginePhysicsSystemProfiler.finishProfiler(); } void EnginePhysicsSystem::setContactListener(b2ContactListener* inputList) { physicsScene.SetContactListener(inputList); } void EnginePhysicsSystem::clear() { auto messageSystem = this->scene->getEntityManagement().getMessageSystemEventType(MessageSystemEventType::RIGID_BODY_PHYSICS_TYPE); }