#include "PlayerControl.h" #include "../GameEngine/Engine_Physics/Entity.h" #include "../GameEngine/Engine_Messaging_System/EngineMessageSystem.h" #include "../GameEngine/Engine_Text/Text.h" #include "Box2D/Box2D/Dynamics/Contacts/b2Contact.h" #include "Score.h" // Constructor PlayerControl::PlayerControl(Scene& scene, MessageHandler& messageHandler) : EngineMessageSystem(scene), MessageObserver(messageHandler), entityPlayer(nullptr) { scene.getEnginePhysicsSystem().setContactListener(this); } // Step through the game void PlayerControl::play(const sf::Time& elapsedTime) { if (!entityPlayer) { // Event Que auto messageSystemEventType = this->scene->getEntityManagement().getMessageSystemEventType(MessageSystemEventType::TEXT_TYPE); for (auto message : *messageSystemEventType) { auto checkPlayer = static_cast(message.first); if (checkPlayer->getText() == "player") { entityPlayer = message.second; physicsPlayer = entityPlayer->getMessageSystemEvent(); physicsPlayer->getBody()->SetGravityScale(1.0f); break; } } } else if (entityPlayer->getMessageSystemEvent()->getText() == "playerDead") return; // Player movement ability auto entityBody = entityPlayer->getMessageSystemEvent()->getBody(); float velocity = desiredVelocity - entityBody->GetLinearVelocity().x; float collisionResponse = entityBody->GetMass() * velocity; entityBody->ApplyLinearImpulseToCenter(b2Vec2(collisionResponse, 0), true); playerCurrentPosition = entityPlayer->getEntitySprite()->getPosition().x; if (checkPlayerJump) { entityBody->ApplyLinearImpulseToCenter(b2Vec2(0, -(entityBody->GetMass() * (playerJumpAbility - entityBody->GetLinearVelocity().y))), true); entityPlayer->getMessageSystemEvent()->playSound(); checkPlayerJump = false; } desiredVelocity = 0; } // Player movement keys/messages, Keybindings void PlayerControl::onNotify(MessageEvent inputSystemMessage) { UILoadingTimesProfiler.startTime(); if (inputSystemMessage.messageState == MessageState::PRESSED_STATE || inputSystemMessage.messageState == MessageState::DOWN_STATE) { switch (returnStringFromInt(inputSystemMessage.messageName.c_str())) { case returnStringFromInt("Left"): { if (playerCurrentPosition >= playerAim) { // Goal Reached desiredVelocity -= playerMoveAbility; break; } else { desiredVelocity -= playerMoveAbility; break; } break; } case returnStringFromInt("Right"): { if (playerCurrentPosition >= playerAim) { // Goal Reached desiredVelocity += playerMoveAbility; physicsPlayer->getBody()->SetTransform(b2Vec2(9, 0), physicsPlayer->getBody()->GetAngle()); scene->changeSceneState(Scene::SceneState::MAIN_MENU_STATE); break; } else { desiredVelocity += playerMoveAbility; break; } break; } case returnStringFromInt("Profiler"): { float EngineAudioSystemLoadingTime = scene->addEngineAudioSystemLoadingTimes.asMicroseconds(); float EnginePhysicsSystemLoadingTime = scene->addEnginePhysicsLoadingTimes.asMicroseconds(); float EngineRenderingSystemLoadingTime = scene->addEngineRenderingLoadingTimes.asMicroseconds(); float EngineUISystemLoadingTime = UILoadingTimesProfiler.asMicroseconds(); std::cout << "Engine Audio System Loading Time: " << EngineAudioSystemLoadingTime << std::endl; std::cout << "Engine Physics System Loading Time: " << EnginePhysicsSystemLoadingTime << std::endl; std::cout << "Engine Rendering System Loading Time: " << EngineRenderingSystemLoadingTime << std::endl; std::cout << "Engine UI System Loading Time: " << EngineUISystemLoadingTime << std::endl; break; } default: break; } } // Player jump ability if (inputSystemMessage.messageName == "Jump" && inputSystemMessage.messageState == MessageState::PRESSED_STATE && checkPlayerAtGround) { checkPlayerJump = true; } UILoadingTimesProfiler.finishProfiler(); } // Detect beginning of collision - override (Box2D) void PlayerControl::BeginContact(b2Contact* inputB2Contact) { auto contactA = inputB2Contact->GetFixtureA(); auto contactB = inputB2Contact->GetFixtureB(); void* collisionDataA = contactA->GetBody()->GetUserData(); void* collisionDataB = contactB->GetBody()->GetUserData(); if (collisionDataA && collisionDataB) { auto collisionA = static_cast(collisionDataA); auto collisionB = static_cast(collisionDataB); if (collisionA == physicsPlayer || collisionB == physicsPlayer) { checkPlayerAtGround = true; } } } // Detect end of collision - override (Box2D) void PlayerControl::EndContact(b2Contact* contact) { auto contactA = contact->GetFixtureA(); auto contactB = contact->GetFixtureB(); void* collisionDataA = contactA->GetBody()->GetUserData(); void* collisionDataB = contactB->GetBody()->GetUserData(); if (collisionDataA && collisionDataB) { auto collisionA = static_cast(collisionDataA); auto collisionB = static_cast(collisionDataB); if (collisionA == physicsPlayer || collisionB == physicsPlayer) { checkPlayerAtGround = false; } } } void PlayerControl::recieveEngineMessage(const SystemMessage& inputSystemMessage) {}