From 3a38190290f2ea27e16527a125d14868144cc268 Mon Sep 17 00:00:00 2001 From: MrLetsplay2003 Date: Wed, 16 Nov 2022 18:38:37 +0100 Subject: [PATCH] Move keyboard input to DefaultPlayerController --- src/kekengine/cpp/common/defaults.cpp | 66 ++++--------------- .../cpp/player/defaultplayercontroller.cpp | 38 +++++++++-- src/kekengine/cpp/player/player.cpp | 4 +- .../include/defaultplayercontroller.h | 11 +++- src/kekengine/include/player.h | 4 +- src/kekengine/include/playercontroller.h | 1 - 6 files changed, 55 insertions(+), 69 deletions(-) diff --git a/src/kekengine/cpp/common/defaults.cpp b/src/kekengine/cpp/common/defaults.cpp index 0f0f8bc..ba01864 100644 --- a/src/kekengine/cpp/common/defaults.cpp +++ b/src/kekengine/cpp/common/defaults.cpp @@ -1,6 +1,7 @@ #include "input.h" #include "ui.h" #include "uielements.h" +#include "defaultplayercontroller.h" #include "internal.h" #include "internal/ui.h" #include "internal/physics.h" @@ -8,12 +9,12 @@ namespace kek::Defaults { static KeyBinding - keyForward, + /*keyForward, keyBackward, keyLeft, keyRight, keyUp, - keyDown, + keyDown,*/ keyOptions, keyToggleCursorMode, keyToggleNoclip, @@ -25,53 +26,7 @@ static void defaultInput(GLFWwindow *window, void *data) { if(Input::isKeyboardCaptured()) return; // TODO: move input handling to controller class, add NoclipController - - glm::vec3 direction = glm::vec3(0); - - if(Input::getKeyState(keyForward) == GLFW_PRESS) { - direction += kekData.activeCamera->direction; - } - - if(Input::getKeyState(keyBackward) == GLFW_PRESS) { - direction += -kekData.activeCamera->direction; - } - - if(Input::getKeyState(keyLeft) == GLFW_PRESS) { - direction += -glm::normalize(glm::cross(kekData.activeCamera->direction, glm::vec3(0.0f, 1.0f, 0.0f))); - } - - if(Input::getKeyState(keyRight) == GLFW_PRESS) { - direction += glm::normalize(glm::cross(kekData.activeCamera->direction, glm::vec3(0.0f, 1.0f, 0.0f))); - } - - bool jump = false; - if(Input::getKeyState(keyUp) == GLFW_PRESS) { - direction += glm::vec3(0,1,0); - jump = kekData.player->onGround; - } - - if(Input::getKeyState(keyDown) == GLFW_PRESS) { - direction += glm::vec3(0,-1,0); - } - kekData.player->controller->update(); - - direction = glm::normalize(direction); - if(glm::length2(direction) > 0) { - if(kekData.player->noclip) { - kekData.activeCamera->translate(direction * KEK_NOCLIP_SPEED * kekData.lastFrameTime); - }else { - //kekData.player->physics->body->applyCentralImpulse(Physics::fromGLM(glm::normalize(direction) * (kekData.lastFrameTime * 20))); - /*btVector3 vel = kekData.player->physics->body->getLinearVelocity(); - glm::vec3 newVel = glm::normalize(direction) * KEK_PLAYER_WALK_VELOCITY; - newVel.y = vel.y(); - if(jump) newVel.y = KEK_PLAYER_JUMP_VELOCITY; - kekData.player->physics->body->setLinearVelocity(Physics::fromGLM(newVel));*/ - glm::vec3 xz = glm::vec3(direction.x, 0, direction.z); - kekData.player->controller->move(xz * (kekData.lastFrameTime * 10)); - if(jump) kekData.player->controller->jump(); - } - } } static void defaultKeyCallback(GLFWwindow *window, int key, int scancode, int action, int mods, void *data) { @@ -157,12 +112,13 @@ static void defaultMouseButtonCallback(GLFWwindow* window, int button, int actio } void init() { - keyForward = Input::createKeyBinding("Forward", GLFW_KEY_W); - keyBackward = Input::createKeyBinding("Backward", GLFW_KEY_S); - keyLeft = Input::createKeyBinding("Left", GLFW_KEY_A); - keyRight = Input::createKeyBinding("Right", GLFW_KEY_D); - keyUp = Input::createKeyBinding("Up", GLFW_KEY_SPACE); - keyDown = Input::createKeyBinding("Down", GLFW_KEY_LEFT_CONTROL); + DefaultPlayerController *controller = new DefaultPlayerController(); + controller->keyForward = Input::createKeyBinding("Forward", GLFW_KEY_W); + controller->keyBackward = Input::createKeyBinding("Backward", GLFW_KEY_S); + controller->keyLeft = Input::createKeyBinding("Left", GLFW_KEY_A); + controller->keyRight = Input::createKeyBinding("Right", GLFW_KEY_D); + controller->keyJump = Input::createKeyBinding("Up", GLFW_KEY_SPACE); + //keyDown = Input::createKeyBinding("Down", GLFW_KEY_LEFT_CONTROL); keyOptions = Input::createKeyBinding("Options", GLFW_KEY_Q); keyToggleCursorMode = Input::createKeyBinding("Toggle Cursor Mode", GLFW_KEY_TAB); keyToggleNoclip = Input::createKeyBinding("Toggle Noclip", GLFW_KEY_N); @@ -201,8 +157,8 @@ void init() { kekData.player->physics = new PlayerPhysicsObjectData(); kekData.player->physics->body = body; - //kekData.player->physics->jumpCollider = jumpCollider; kekData.player->moveTo(glm::vec3(5,10,0)); + kekData.player->controller = controller; } void destroy() { diff --git a/src/kekengine/cpp/player/defaultplayercontroller.cpp b/src/kekengine/cpp/player/defaultplayercontroller.cpp index 37278aa..1b48c13 100644 --- a/src/kekengine/cpp/player/defaultplayercontroller.cpp +++ b/src/kekengine/cpp/player/defaultplayercontroller.cpp @@ -86,21 +86,47 @@ glm::vec3 DefaultPlayerController::move(glm::vec3 movement) { return totalMovement; } -void DefaultPlayerController::jump() { - velocity += glm::vec3(0, jumpVelocity, 0); -} - void DefaultPlayerController::update() { bool onGround = checkPlayerGrounded(); kekData.player->onGround = onGround; - move(velocity * kekData.lastFrameTime); - if(!onGround) { velocity += gravity * kekData.lastFrameTime; }else{ velocity = glm::vec3(0); } + + glm::vec3 direction = glm::vec3(0); + + if(Input::getKeyState(keyForward) == GLFW_PRESS) { + direction += kekData.activeCamera->direction; + } + + if(Input::getKeyState(keyBackward) == GLFW_PRESS) { + direction += -kekData.activeCamera->direction; + } + + if(Input::getKeyState(keyLeft) == GLFW_PRESS) { + direction += -glm::normalize(glm::cross(kekData.activeCamera->direction, glm::vec3(0.0f, 1.0f, 0.0f))); + } + + if(Input::getKeyState(keyRight) == GLFW_PRESS) { + direction += glm::normalize(glm::cross(kekData.activeCamera->direction, glm::vec3(0.0f, 1.0f, 0.0f))); + } + + if(Input::getKeyState(keyJump) == GLFW_PRESS && kekData.player->onGround) { + velocity += glm::vec3(0, jumpVelocity, 0); + } + + direction = glm::vec3(direction.x, 0, direction.z); + + glm::vec3 move = velocity; + if(glm::length2(direction) > 0) { + direction = glm::normalize(direction) * walkSpeed; + move += direction; + } + + kekData.player->controller->move(move * (kekData.lastFrameTime)); } } diff --git a/src/kekengine/cpp/player/player.cpp b/src/kekengine/cpp/player/player.cpp index 14064c1..503fe71 100644 --- a/src/kekengine/cpp/player/player.cpp +++ b/src/kekengine/cpp/player/player.cpp @@ -6,9 +6,7 @@ namespace kek { Player::Player(): RotateableObject() { - this->noclip = false; - this->onGround = false; - this->controller = new DefaultPlayerController(); + } void Player::rotateTo(glm::quat rotation) { diff --git a/src/kekengine/include/defaultplayercontroller.h b/src/kekengine/include/defaultplayercontroller.h index 35abe7a..e31bc2e 100644 --- a/src/kekengine/include/defaultplayercontroller.h +++ b/src/kekengine/include/defaultplayercontroller.h @@ -1,6 +1,7 @@ #pragma once #include "playercontroller.h" +#include "input.h" namespace kek { @@ -13,8 +14,15 @@ public: glm::vec3 gravity = glm::vec3(0,-9.81,0); float minSlideAngle = 5; float maxWalkAngle = 60; - float jumpVelocity = 2.5; + float jumpVelocity = 3; float groundDistance = 0.01; + float walkSpeed = 6; + + KeyBinding keyForward = KEK_INVALID_ID; + KeyBinding keyBackward = KEK_INVALID_ID; + KeyBinding keyLeft = KEK_INVALID_ID; + KeyBinding keyRight = KEK_INVALID_ID; + KeyBinding keyJump = KEK_INVALID_ID; glm::vec3 velocity = glm::vec3(0); @@ -22,7 +30,6 @@ public: virtual ~DefaultPlayerController(); virtual glm::vec3 move(glm::vec3 movement); - virtual void jump(); virtual void update(); }; diff --git a/src/kekengine/include/player.h b/src/kekengine/include/player.h index 9a3fc37..51ed08f 100644 --- a/src/kekengine/include/player.h +++ b/src/kekengine/include/player.h @@ -10,8 +10,8 @@ class Player: public RotateableObject { public: PlayerPhysicsObjectData *physics; PlayerController *controller; - bool noclip; - bool onGround; + bool noclip = false; + bool onGround = false; Player(); diff --git a/src/kekengine/include/playercontroller.h b/src/kekengine/include/playercontroller.h index 1dd1ff2..b6a819a 100644 --- a/src/kekengine/include/playercontroller.h +++ b/src/kekengine/include/playercontroller.h @@ -10,7 +10,6 @@ public: virtual ~PlayerController() = 0; virtual glm::vec3 move(glm::vec3 movement) = 0; - virtual void jump() = 0; virtual void update() = 0; };