morault/ProjectMorault/Morault_Player.cpp

113 lines
3.7 KiB
C++

#include "Morault_Player.h"
#include <raymath.h>
Morault::Gameplay::Player::Player()
{
}
Morault::Gameplay::Player::Player(PlayerData a, PlayerController b)
{
data = a; controller = b; // self explanatory <3
}
Morault::Gameplay::Player::~Player()
{
}
Morault::Gameplay::PlayerController::PlayerController()
{
camera = { 0 };
camera.fovy = 90;
camera.position = { -10,5,0 };
camera.target = { 0,5,0 };
camera.up = { 0,1,0 };
camera.projection = CAMERA_PERSPECTIVE;
rotation = { 10,0,0 };
}
Morault::Gameplay::PlayerController::PlayerController(Vector3 position)
{
camera = { 0 };
camera.fovy = 90;
camera.position = position;
camera.target = { 0, position.y,0 };
camera.up = { 0,1,0 };
camera.projection = CAMERA_PERSPECTIVE;
rotation = { 1,0,0 };
}
float collfloor = 5;
float collceiling = INFINITY;
float gravity = 0;
void Morault::Gameplay::PlayerController::UpdatePlayerController(bool focus, Morault::Maps::Map* map, float renderScale)
{
Vector3 futurePos = camera.position;
if (focus) {
rotation = Vector3RotateByAxisAngle(rotation, { 0,1,0 }, -GetMouseDelta().x * 0.05 * sensitivityMultiplier);
rotation.y = Clamp(rotation.y - GetMouseDelta().y * 0.3 * sensitivityMultiplier, -15, 15);
if (IsKeyDown(KEY_W)) futurePos = Vector3Add(futurePos, Vector3Multiply({rotation.x, 0, rotation.z}, {GetFrameTime(), GetFrameTime(), GetFrameTime()}));
if (IsKeyDown(KEY_S)) futurePos = Vector3Subtract(futurePos, Vector3Multiply({ rotation.x, 0, rotation.z }, { GetFrameTime(), GetFrameTime(), GetFrameTime() }));
if (IsKeyDown(KEY_A)) futurePos = Vector3Add(futurePos, Vector3Multiply(Vector3RotateByAxisAngle({ rotation.x, 0, rotation.z }, {0,1,0}, DEG2RAD*90), {GetFrameTime(), GetFrameTime(), GetFrameTime()}));
if (IsKeyDown(KEY_D)) futurePos = Vector3Add(futurePos, Vector3Multiply(Vector3RotateByAxisAngle({ rotation.x, 0, rotation.z }, { 0,1,0 }, DEG2RAD * -90), { GetFrameTime(), GetFrameTime(), GetFrameTime() }));
if (IsKeyPressed(KEY_SPACE)) {
gravity -= 10;
}
}
else {
rotation = { 0,0,0 };
}
for (int i = 0; i < map->MapTriangles.size(); i++) {
if (CheckCollisionPointTriangle({ futurePos.x / renderScale, futurePos.z / renderScale }, map->MapTriangles[i].a, map->MapTriangles[i].b, map->MapTriangles[i].c)) {
collfloor = map->MapTriangles[i].heightFloor * renderScale + 5;
collceiling = map->MapTriangles[i].heightCeiling * renderScale-2;
if (map->MapTriangles[i].wallAB != "pms:none") {
if (CheckCollisionCircleLine({ futurePos.x, futurePos.z }, obesity, Vector2Multiply(map->MapTriangles[i].a, { renderScale,renderScale }), Vector2Multiply(map->MapTriangles[i].b, { renderScale,renderScale }))) {
futurePos = camera.position;
}
}
if (map->MapTriangles[i].wallBC != "pms:none") {
if (CheckCollisionCircleLine({ futurePos.x, futurePos.z }, obesity, Vector2Multiply(map->MapTriangles[i].b, { renderScale,renderScale }), Vector2Multiply(map->MapTriangles[i].c, { renderScale,renderScale }))) {
futurePos = camera.position;
}
}
if (map->MapTriangles[i].wallCA != "pms:none") {
if (CheckCollisionCircleLine({ futurePos.x, futurePos.z }, obesity, Vector2Multiply(map->MapTriangles[i].c, { renderScale,renderScale }), Vector2Multiply(map->MapTriangles[i].a, { renderScale,renderScale }))) {
futurePos = camera.position;
}
}
}
}
futurePos.y -= gravity*GetFrameTime();
gravity += 10*GetFrameTime();
if (futurePos.y < collfloor) {
futurePos.y = collfloor;
gravity = 0;
}
if (futurePos.y > collceiling) {
futurePos.y = collceiling;
gravity = 0;
}
camera.position = futurePos;
camera.target = Vector3Add(camera.position, rotation);
}
Morault::Gameplay::PlayerController::~PlayerController()
{
camera = { 0 };
}