CSC3224_Computer_Games_Development / Game / PlayerControl.cpp
PlayerControl.cpp
Raw
#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<Text*>(message.first);
			if (checkPlayer->getText() == "player")
			{
				entityPlayer = message.second;
				physicsPlayer = entityPlayer->getMessageSystemEvent<RigidBodyPhysics>();
				physicsPlayer->getBody()->SetGravityScale(1.0f);
				break;
			}
		}
	}
	else if (entityPlayer->getMessageSystemEvent<Text>()->getText() == "playerDead") return;
// Player movement ability
	auto entityBody = entityPlayer->getMessageSystemEvent<RigidBodyPhysics>()->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<AudioSoundEffect>()->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<RigidBodyPhysics*>(collisionDataA);
		auto collisionB = static_cast<RigidBodyPhysics*>(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<RigidBodyPhysics*>(collisionDataA);
		auto collisionB = static_cast<RigidBodyPhysics*>(collisionDataB);
		if (collisionA == physicsPlayer || collisionB == physicsPlayer)
		{
			checkPlayerAtGround = false;
		}
	}
}

void PlayerControl::recieveEngineMessage(const SystemMessage& inputSystemMessage) {}