Basic collision implementation; TODO: fix collision bug when touching lines outside of current sector(eg. touching an angle).
This commit is contained in:
parent
0f2a5f4e15
commit
5f6fb70475
@ -43,16 +43,19 @@ float gravity = 0;
|
|||||||
|
|
||||||
void Morault::Gameplay::PlayerController::UpdatePlayerController(bool focus, Morault::Maps::Map* map, float renderScale)
|
void Morault::Gameplay::PlayerController::UpdatePlayerController(bool focus, Morault::Maps::Map* map, float renderScale)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
Vector3 futurePos = camera.position;
|
||||||
|
|
||||||
if (focus) {
|
if (focus) {
|
||||||
rotation = Vector3RotateByAxisAngle(rotation, { 0,1,0 }, -GetMouseDelta().x * 0.05 * sensitivityMultiplier);
|
rotation = Vector3RotateByAxisAngle(rotation, { 0,1,0 }, -GetMouseDelta().x * 0.05 * sensitivityMultiplier);
|
||||||
rotation.y = Clamp(rotation.y - GetMouseDelta().y * 0.3 * sensitivityMultiplier, -15, 15);
|
rotation.y = Clamp(rotation.y - GetMouseDelta().y * 0.3 * sensitivityMultiplier, -15, 15);
|
||||||
|
|
||||||
|
|
||||||
if (IsKeyDown(KEY_W)) camera.position = Vector3Add(camera.position, Vector3Multiply({rotation.x, 0, rotation.z}, {GetFrameTime(), GetFrameTime(), GetFrameTime()}));
|
if (IsKeyDown(KEY_W)) futurePos = Vector3Add(futurePos, Vector3Multiply({rotation.x, 0, rotation.z}, {GetFrameTime(), GetFrameTime(), GetFrameTime()}));
|
||||||
if (IsKeyDown(KEY_S)) camera.position = Vector3Subtract(camera.position, 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)) camera.position = Vector3Add(camera.position, Vector3Multiply(Vector3RotateByAxisAngle({ rotation.x, 0, rotation.z }, {0,1,0}, DEG2RAD*90), {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)) camera.position = Vector3Add(camera.position, 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)) {
|
if (IsKeyPressed(KEY_SPACE)) {
|
||||||
gravity -= 10;
|
gravity -= 10;
|
||||||
}
|
}
|
||||||
@ -63,25 +66,44 @@ void Morault::Gameplay::PlayerController::UpdatePlayerController(bool focus, Mor
|
|||||||
rotation = { 0,0,0 };
|
rotation = { 0,0,0 };
|
||||||
}
|
}
|
||||||
|
|
||||||
camera.target = Vector3Add(camera.position, rotation);
|
|
||||||
for (int i = 0; i < map->MapTriangles.size(); i++) {
|
for (int i = 0; i < map->MapTriangles.size(); i++) {
|
||||||
if (CheckCollisionPointTriangle({ camera.position.x / renderScale, camera.position.z / renderScale }, map->MapTriangles[i].a, map->MapTriangles[i].b, map->MapTriangles[i].c)) {
|
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;
|
collfloor = map->MapTriangles[i].heightFloor * renderScale + 5;
|
||||||
collceiling = map->MapTriangles[i].heightCeiling * renderScale-2;
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
camera.position.y -= gravity*GetFrameTime();
|
futurePos.y -= gravity*GetFrameTime();
|
||||||
gravity += 10*GetFrameTime();
|
gravity += 10*GetFrameTime();
|
||||||
if (camera.position.y < collfloor) {
|
if (futurePos.y < collfloor) {
|
||||||
camera.position.y = collfloor;
|
futurePos.y = collfloor;
|
||||||
gravity = 0;
|
gravity = 0;
|
||||||
}
|
}
|
||||||
if (camera.position.y > collceiling) {
|
if (futurePos.y > collceiling) {
|
||||||
camera.position.y = collceiling;
|
futurePos.y = collceiling;
|
||||||
gravity = 0;
|
gravity = 0;
|
||||||
}
|
}
|
||||||
|
camera.position = futurePos;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
camera.target = Vector3Add(camera.position, rotation);
|
||||||
}
|
}
|
||||||
|
|
||||||
Morault::Gameplay::PlayerController::~PlayerController()
|
Morault::Gameplay::PlayerController::~PlayerController()
|
||||||
|
@ -27,6 +27,7 @@ namespace Morault {
|
|||||||
Vector3 rotation;
|
Vector3 rotation;
|
||||||
Camera camera;
|
Camera camera;
|
||||||
float sensitivityMultiplier = 0.5;
|
float sensitivityMultiplier = 0.5;
|
||||||
|
float obesity = 2;
|
||||||
void UpdatePlayerController(bool focus, Maps::Map *map, float renderScale);
|
void UpdatePlayerController(bool focus, Maps::Map *map, float renderScale);
|
||||||
~PlayerController();
|
~PlayerController();
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user