summaryrefslogtreecommitdiff
path: root/engine-ocean/Game/Systems/charactercontrollersystem.cpp
diff options
context:
space:
mode:
authorjjesswan <jessica_wan@brown.edu>2024-04-22 21:56:26 -0400
committerjjesswan <jessica_wan@brown.edu>2024-04-22 21:56:26 -0400
commita556b45abf18f1bd509daaf63b66b7d55e9fd291 (patch)
treebc9b8a2d184c12aee236e7f9f276a34b84ca552d /engine-ocean/Game/Systems/charactercontrollersystem.cpp
parentcd7c76017a12bb548036571c1ff13e551369d06d (diff)
add engine version
Diffstat (limited to 'engine-ocean/Game/Systems/charactercontrollersystem.cpp')
-rw-r--r--engine-ocean/Game/Systems/charactercontrollersystem.cpp132
1 files changed, 132 insertions, 0 deletions
diff --git a/engine-ocean/Game/Systems/charactercontrollersystem.cpp b/engine-ocean/Game/Systems/charactercontrollersystem.cpp
new file mode 100644
index 0000000..c5e7174
--- /dev/null
+++ b/engine-ocean/Game/Systems/charactercontrollersystem.cpp
@@ -0,0 +1,132 @@
+#include "charactercontrollersystem.h"
+#include "Game/Components/CollisionComponents/CollisionComponent.h"
+#include "Game/Components/CollisionComponents/CylinderCollider.h"
+#include "Game/Components/TransformComponent.h"
+#include "Game/Systems/CollisionSystems/ellipsoidtrianglecollisionsystem.h"
+#include <glm/gtx/quaternion.hpp>
+
+CharacterControllerSystem::CharacterControllerSystem(std::map<std::string, std::shared_ptr<GameObject>>& gameobjects,
+ std::shared_ptr<Camera>& camera_param,
+ std::map<int, Input>& input_map,
+ std::map<std::string, BlackboardData>& global_blackboard):
+ m_gameobjects(gameobjects),
+ camera(camera_param),
+ m_input_map(input_map),
+ m_global_blackboard(global_blackboard)
+{
+}
+
+void CharacterControllerSystem::draw(){
+}
+
+TransformComponent* CharacterControllerSystem::getPlayerTransform(){
+ return m_gameobjects.at("player")->getComponent<TransformComponent>();
+}
+
+glm::vec3 CharacterControllerSystem::getPlayerPos(){
+ return m_gameobjects.at("player")->getComponent<TransformComponent>()->getPos();
+}
+
+
+float CharacterControllerSystem::jumpPlayer(float &initial_v, double deltaTime, float snapshot_time, float gravity){
+ float t = deltaTime-snapshot_time;
+ float delta_y = initial_v*t + (.5f)*gravity*t*t;
+ return delta_y;
+}
+
+bool CharacterControllerSystem::movePlayerLaterally(glm::vec3 dir, glm::vec3 perp, glm::vec3 &m_pos, float dt){
+ glm::vec3 translationDir;
+ bool moving_laterally = false;
+ std::shared_ptr<ModelTransform> temp_mt = getPlayerTransform()->getMT();
+
+ if (m_input_map[GLFW_KEY_W].isActive){
+ m_currentSpeed = RUN_SPEED;
+ moving_laterally = true;
+ } else if (m_input_map[GLFW_KEY_S].isActive){
+ m_currentSpeed = -RUN_SPEED;
+ moving_laterally = true;
+ } else {
+ m_currentSpeed = 0.f;
+ }
+
+
+ glm::mat4 rot = glm::mat4(1.f);
+ // player turning
+ if (m_input_map[GLFW_KEY_D].isActive){
+ m_currentTurnSpeed = -TURN_SPEED;
+ moving_laterally = true;
+ } else if (m_input_map[GLFW_KEY_A].isActive){
+ m_currentTurnSpeed = TURN_SPEED;
+ moving_laterally = true;
+ } else {
+ m_currentTurnSpeed = 0.f;
+ }
+
+ // rotate player
+ getPlayerTransform()->getMT()->rotate(m_currentTurnSpeed*dt, glm::vec3(0.f, 1.f, 0.f));
+
+
+ //translate player based on rotation
+ float distance = m_currentSpeed*dt;
+ glm::vec4 movement = distance*glm::vec4(1.f,0.f,0.f, 0.f);
+ glm::vec4 transl = getPlayerTransform()->getMT()->getRotation()*movement;
+
+ translationDir = glm::vec3(transl.x, 0.f, transl.z);
+ temp_mt->translate(translationDir);
+ glm::vec3 potential_pos = temp_mt->getPos();
+ m_pos = potential_pos;
+
+
+ return moving_laterally;
+}
+
+void CharacterControllerSystem::handlePlayerMovement(double deltaTime){
+ // timing
+ float dt = deltaTime - snapshot_time;
+ snapshot_time = deltaTime;
+
+ // get player positions
+ m_pos = getPlayerPos();
+ getPlayerTransform()->old_pos = m_pos;
+
+ // movement
+ getPlayerTransform()->movingLaterally = false;
+ float speedFactor = horiz_velocity * deltaTime;
+ glm::vec3 look = camera->getLook();
+ glm::vec3 dir = glm::normalize(glm::vec3(look.x, 0.f, look.z)) * speedFactor;
+ glm::vec3 perp = glm::vec3(look.z, 0.f, -look.x) * speedFactor;
+
+ // updates m_pos
+ if (movePlayerLaterally(dir, perp, m_pos, dt)){
+ getPlayerTransform()->movingLaterally = true;
+ }
+
+ if (m_input_map[GLFW_KEY_SPACE].isActive && (getPlayerTransform()->onGround)){
+ getPlayerTransform()->gravity = -25.f;
+ getPlayerTransform()->yVelocity = 20.f;
+ getPlayerTransform()->onGround = false;
+ //if (!gravity) gravity = true;
+ m_global_blackboard["player"].conditionData["isJumping"].conditionTrue = true;
+ } else if (!m_input_map[GLFW_KEY_SPACE].isActive && getPlayerTransform()->onGround){
+ m_global_blackboard["player"].conditionData["isJumping"].conditionTrue = false;
+ }
+
+ // PLAYER-SPECIFIC GRAVITY (comment these two lines to keep player still)
+ //if (gravity){
+ m_pos.y += jumpPlayer(getPlayerTransform()->yVelocity, dt, 0, getPlayerTransform()->gravity);
+ getPlayerTransform()->yVelocity = getPlayerTransform()->yVelocity + getPlayerTransform()->gravity*(dt);
+ //}
+
+ // store m_pos as estimated final_pos
+ m_global_blackboard["player"].locationData.setToPos = m_pos;
+
+ getPlayerTransform()->estimated_final_pos = m_pos;
+}
+
+
+void CharacterControllerSystem::update(double deltaTime){
+ handlePlayerMovement(deltaTime);
+}
+
+void CharacterControllerSystem::scrollEvent(double distance){}
+void CharacterControllerSystem::mousePosEvent(double xpos, double ypos){}