From d18e1251274fc0b408b3ae2aee0459840c15915a Mon Sep 17 00:00:00 2001 From: Askou Date: Sun, 20 Jun 2021 10:27:08 +0200 Subject: [PATCH] fix berserk camera --- sources/System/Renderer/CameraSystem.cpp | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/sources/System/Renderer/CameraSystem.cpp b/sources/System/Renderer/CameraSystem.cpp index 6722d48f..e56fe3a4 100644 --- a/sources/System/Renderer/CameraSystem.cpp +++ b/sources/System/Renderer/CameraSystem.cpp @@ -49,8 +49,7 @@ namespace BBM } void CameraSystem::onUpdate(WAL::ViewEntity &entity, - std::chrono::nanoseconds dtime) - { + std::chrono::nanoseconds dtime) { if (Runner::gameState.currentScene != GameState::GameScene || !introAnimation(entity)) return; auto &pos = entity.get(); @@ -60,14 +59,19 @@ namespace BBM float maxDist = 0; float lowerXDist = 0; float lowerZDist = 0; - for (auto &[player, position, _] : this->_wal.getScene()->view>()) { playerPos.emplace_back(position.position); } + if (pos.position.x > Runner::mapWidth || pos.position.z > Runner::mapHeight) { + pos.position.x = Runner::mapWidth / 2; + pos.position.y = (Runner::mapHeight / 2) - 1; + } if (playerPos.size() == 1) newCameraPos = playerPos[0]; for (size_t i = 0; i < playerPos.size(); i++) for (size_t j = 0; j < playerPos.size(); j++) { + if (i == j) + continue; if (maxDist < playerPos[i].distance(playerPos[j])) { maxDist = playerPos[i].distance(playerPos[j]); newCameraPos = (playerPos[i] + playerPos[j]) / 2; @@ -78,19 +82,25 @@ namespace BBM lowerZDist = std::abs((playerPos[i].z - playerPos[j].z)); } maxDist += (lowerXDist + lowerZDist) / 2; + if (maxDist < 1) + return; if (maxDist < 14) maxDist = 14; if (maxDist > 23) maxDist = 23; - Vector3f pos2d(pos.position.abs().x,0, pos.position.abs().z); - Vector3f newPos2d(newCameraPos.abs().x, 0, pos.position.abs().z); for (auto &[other, backPos, _] : this->_wal.getScene()->view>()) { backPos.position = cam.target; } newCameraPos.y = 0; + if (lowerXDist < 0.5) + newCameraPos.x = pos.position.x; + if (lowerZDist < 0.5) + newCameraPos.z = pos.position.z; cam.target += (newCameraPos.abs() - cam.target.abs()) / 10; + cam.target = cam.target.abs(); newCameraPos.y = maxDist; - newCameraPos.z -= newCameraPos.z > 1 ? 1 : 0; + if (lowerZDist > 0.5 || cam.target.z >= pos.position.z) + newCameraPos.z = cam.target.z > 1 ? newCameraPos.z - 1 : 0; pos.position += (newCameraPos.abs() - pos.position.abs()) / 10; } } \ No newline at end of file