From e79f1e7088172dc9bb3b1539d4b6ef6497eba680 Mon Sep 17 00:00:00 2001 From: Askou Date: Tue, 15 Jun 2021 11:45:19 +0200 Subject: [PATCH 1/8] add simple camera system, can make you throw up --- sources/Component/Tag/TagComponent.hpp | 1 + sources/Runner/GameScene.cpp | 24 ++++++++++++++++++ sources/System/Renderer/RenderSystem.cpp | 32 ++++++++++++++++++++++-- 3 files changed, 55 insertions(+), 2 deletions(-) diff --git a/sources/Component/Tag/TagComponent.hpp b/sources/Component/Tag/TagComponent.hpp index 00fa27d5..f1e95a0a 100644 --- a/sources/Component/Tag/TagComponent.hpp +++ b/sources/Component/Tag/TagComponent.hpp @@ -51,4 +51,5 @@ namespace BBM }; constexpr const char Blowable[] = "Blowable"; + constexpr const char Player[] = "Player"; } diff --git a/sources/Runner/GameScene.cpp b/sources/Runner/GameScene.cpp index 7668a043..5d87d733 100644 --- a/sources/Runner/GameScene.cpp +++ b/sources/Runner/GameScene.cpp @@ -51,6 +51,30 @@ namespace BBM .addComponent() .addComponent("assets/shaders/glsl330/predator.fs") .addComponent>() + .addComponent>() + //.addComponent(0) + .addComponent(RAY::ModelAnimations("assets/player/player.iqm"), 3) + .addComponent(BBM::Vector3f{0.25, 0, 0.25}, BBM::Vector3f{.75, 2, .75}) + .addComponent() + .addComponent(soundPath) + .addComponent("assets/musics/music_battle.ogg") + .addComponent() + .addComponent() + .addComponent(1, [](WAL::Entity &entity, WAL::Wal &wal) { + auto &animation = entity.getComponent(); + animation.setAnimIndex(5); + }); + scene->addEntity("player 2") + .addComponent(16, 1.01, 16) + .addComponent("assets/player/player.iqm", true, std::make_pair(MAP_DIFFUSE, "assets/player/blue.png")) + .addComponent() + .addComponent() + .addComponent() + .addComponent() + .addComponent() + .addComponent("assets/shaders/glsl330/predator.fs") + .addComponent>() + .addComponent>() //.addComponent(0) .addComponent(RAY::ModelAnimations("assets/player/player.iqm"), 3) .addComponent(BBM::Vector3f{0.25, 0, 0.25}, BBM::Vector3f{.75, 2, .75}) diff --git a/sources/System/Renderer/RenderSystem.cpp b/sources/System/Renderer/RenderSystem.cpp index d21065c2..8ca43dd5 100644 --- a/sources/System/Renderer/RenderSystem.cpp +++ b/sources/System/Renderer/RenderSystem.cpp @@ -11,6 +11,7 @@ #include #include "Drawables/ADrawable3D.hpp" #include "Component/Shaders/ShaderComponent.hpp" +#include "Component/Tag/TagComponent.hpp" #include #include "Models/Vector3.hpp" #include "Component/Collision/CollisionComponent.hpp" @@ -82,8 +83,35 @@ namespace BBM void RenderSystem::onUpdate(WAL::ViewEntity &entity, std::chrono::nanoseconds dtime) { - const auto &pos = entity.get(); - const auto &cam = entity.get(); + auto &pos = entity.get(); + auto &cam = entity.get(); + Vector3f newCameraPos = Vector3f(-1, -1, -1); + std::vector playerPos; + float maxDist = 0; + + for (auto &[entity, pos, _] : this->_wal.getScene()->view>()) { + playerPos.emplace_back(pos.position); + } + for (int i = 0; i < playerPos.size(); i++) { + if (i == 0) + newCameraPos = playerPos[i]; + else + newCameraPos = (newCameraPos + playerPos[i]) / 2; + } + for (int i = 0; i < playerPos.size(); i++) + for (int j = 0; j < playerPos.size(); j++) { + if (maxDist < playerPos[i].distance(playerPos[j])) + maxDist = playerPos[i].distance(playerPos[j]); + } + if (maxDist < 14) + maxDist = 14; + cam.target = newCameraPos; + pos.position = newCameraPos; + + pos.position.y = maxDist; + pos.position.z -= 1; + std::cout << pos.position << std::endl; + std::cout << cam.target << std::endl; _camera.setPosition(pos.position); _camera.setTarget(cam.target); } From 6512cd76cd7a07354af6d64a404f0e8965246ee8 Mon Sep 17 00:00:00 2001 From: Askou Date: Tue, 15 Jun 2021 16:45:58 +0200 Subject: [PATCH 2/8] add abs to vector --- sources/Models/Vector3.hpp | 7 ++++++- sources/Runner/GameScene.cpp | 3 ++- sources/System/Renderer/RenderSystem.cpp | 20 +++++++++++--------- sources/System/Renderer/RenderSystem.hpp | 5 +++-- 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/sources/Models/Vector3.hpp b/sources/Models/Vector3.hpp index 8e8b4093..2af89bbc 100644 --- a/sources/Models/Vector3.hpp +++ b/sources/Models/Vector3.hpp @@ -135,7 +135,7 @@ namespace BBM double magnitude() const { - return (std::sqrt(std::pow(this->x, 2) + std::pow(this->y, 2), std::pow(this->z, 2))); + return (std::sqrt(std::pow(this->x, 2) + std::pow(this->y, 2) + std::pow(this->z, 2))); } Vector3 normalize() @@ -168,6 +168,11 @@ namespace BBM return (point * this) / std::pow(this->magnitude(), 2) * this; } + Vector3 abs() const + { + return Vector3(std::abs(this->x), std::abs(this->y), std::abs(this->z)); + } + Vector3 round() const requires(std::is_floating_point_v) { return Vector3(std::round(this->x), std::round(this->y), std::round(this->z)); diff --git a/sources/Runner/GameScene.cpp b/sources/Runner/GameScene.cpp index 9adf1750..09e5d3b1 100644 --- a/sources/Runner/GameScene.cpp +++ b/sources/Runner/GameScene.cpp @@ -33,7 +33,8 @@ namespace BBM auto scene = std::make_shared(); scene->addEntity("camera") .addComponent(8, 20, 7) - .addComponent(Vector3f(8, 0, 8)); + .addComponent(Vector3f(8, 0, 8)) + .addComponent(); MapGenerator::loadMap(16, 16, MapGenerator::createMap(16, 16), scene); return scene; } diff --git a/sources/System/Renderer/RenderSystem.cpp b/sources/System/Renderer/RenderSystem.cpp index 8ca43dd5..6275b580 100644 --- a/sources/System/Renderer/RenderSystem.cpp +++ b/sources/System/Renderer/RenderSystem.cpp @@ -80,23 +80,28 @@ namespace BBM this->_window.endDrawing(); } - void RenderSystem::onUpdate(WAL::ViewEntity &entity, + void RenderSystem::onUpdate(WAL::ViewEntity &entity, std::chrono::nanoseconds dtime) { auto &pos = entity.get(); auto &cam = entity.get(); + auto &mov = entity.get(); Vector3f newCameraPos = Vector3f(-1, -1, -1); std::vector playerPos; float maxDist = 0; for (auto &[entity, pos, _] : this->_wal.getScene()->view>()) { + std::cout << "Player pos" << pos.position << std::endl; playerPos.emplace_back(pos.position); } for (int i = 0; i < playerPos.size(); i++) { - if (i == 0) + if (i == 0) { newCameraPos = playerPos[i]; - else + std::cout << "First Camera Pos" << newCameraPos << std::endl; + } else { + std::cout << "Other Player pos" << playerPos[i] << std::endl; newCameraPos = (newCameraPos + playerPos[i]) / 2; + } } for (int i = 0; i < playerPos.size(); i++) for (int j = 0; j < playerPos.size(); j++) { @@ -105,13 +110,10 @@ namespace BBM } if (maxDist < 14) maxDist = 14; + newCameraPos.y = maxDist; + newCameraPos.z -= 1; + mov.addForce((newCameraPos - pos.position.abs()) / 10); cam.target = newCameraPos; - pos.position = newCameraPos; - - pos.position.y = maxDist; - pos.position.z -= 1; - std::cout << pos.position << std::endl; - std::cout << cam.target << std::endl; _camera.setPosition(pos.position); _camera.setTarget(cam.target); } diff --git a/sources/System/Renderer/RenderSystem.hpp b/sources/System/Renderer/RenderSystem.hpp index bff17267..080f6dd9 100644 --- a/sources/System/Renderer/RenderSystem.hpp +++ b/sources/System/Renderer/RenderSystem.hpp @@ -6,6 +6,7 @@ #include "Component/Renderer/CameraComponent.hpp" #include "Component/Position/PositionComponent.hpp" +#include "Component/Movable/MovableComponent.hpp" #include "Component/Renderer/Drawable3DComponent.hpp" #include "System/System.hpp" #include "Camera/Camera2D.hpp" @@ -14,7 +15,7 @@ namespace BBM { - class RenderSystem : public WAL::System + class RenderSystem : public WAL::System { //! @brief The window to render on @@ -35,7 +36,7 @@ namespace BBM void onSelfUpdate() override; //! @inherit - void onUpdate(WAL::ViewEntity &entity, std::chrono::nanoseconds dtime) override; + void onUpdate(WAL::ViewEntity &entity, std::chrono::nanoseconds dtime) override; //! @param debug true if debug mode should be enabled void setDebug(bool debug); From fe473426e1dedcc808e647ac9d5a836423ff18c5 Mon Sep 17 00:00:00 2001 From: Askou Date: Tue, 15 Jun 2021 17:27:36 +0200 Subject: [PATCH 3/8] add zoom on players --- sources/Runner/GameScene.cpp | 1 + sources/System/Renderer/RenderSystem.cpp | 28 ++++++++++++++---------- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/sources/Runner/GameScene.cpp b/sources/Runner/GameScene.cpp index 09e5d3b1..22651117 100644 --- a/sources/Runner/GameScene.cpp +++ b/sources/Runner/GameScene.cpp @@ -57,6 +57,7 @@ namespace BBM .addComponent() //.addComponent("assets/shaders/glsl330/predator.fs") .addComponent>() + .addComponent>() .addComponent("assets/player/player.iqm", 3) .addComponent(BBM::Vector3f{0.25, 0, 0.25}, BBM::Vector3f{.75, 2, .75}) .addComponent() diff --git a/sources/System/Renderer/RenderSystem.cpp b/sources/System/Renderer/RenderSystem.cpp index 6275b580..2aaebad5 100644 --- a/sources/System/Renderer/RenderSystem.cpp +++ b/sources/System/Renderer/RenderSystem.cpp @@ -89,33 +89,37 @@ namespace BBM Vector3f newCameraPos = Vector3f(-1, -1, -1); std::vector playerPos; float maxDist = 0; + float lowerXDist = 0; + float lowerZDist = 0; - for (auto &[entity, pos, _] : this->_wal.getScene()->view>()) { - std::cout << "Player pos" << pos.position << std::endl; + for (auto &[entity, pos, _] : this->_wal.getScene()->view>()) playerPos.emplace_back(pos.position); - } for (int i = 0; i < playerPos.size(); i++) { - if (i == 0) { - newCameraPos = playerPos[i]; - std::cout << "First Camera Pos" << newCameraPos << std::endl; - } else { - std::cout << "Other Player pos" << playerPos[i] << std::endl; + if (i == 0) + newCameraPos = playerPos[i].abs(); + else newCameraPos = (newCameraPos + playerPos[i]) / 2; - } } for (int i = 0; i < playerPos.size(); i++) for (int j = 0; j < playerPos.size(); j++) { if (maxDist < playerPos[i].distance(playerPos[j])) maxDist = playerPos[i].distance(playerPos[j]); + if (lowerXDist < std::abs((playerPos[i].x - playerPos[j].x))) + lowerXDist = std::abs((playerPos[i].x - playerPos[j].x)); + if (lowerZDist < std::abs((playerPos[i].z - playerPos[j].z))) + lowerZDist = std::abs((playerPos[i].z - playerPos[j].z)); } + maxDist += (lowerXDist + lowerZDist) / 2; if (maxDist < 14) maxDist = 14; + if (maxDist > 25) + maxDist = 25; + cam.target += (newCameraPos.abs() - pos.position.abs()) / 5; newCameraPos.y = maxDist; newCameraPos.z -= 1; - mov.addForce((newCameraPos - pos.position.abs()) / 10); - cam.target = newCameraPos; - _camera.setPosition(pos.position); + pos.position += (newCameraPos.abs() - pos.position.abs()) / 5; _camera.setTarget(cam.target); + _camera.setPosition(pos.position); } void RenderSystem::setDebug(bool debug) From e5ab8045d1c5d0e8fc0daeed5dd642711b876e8b Mon Sep 17 00:00:00 2001 From: Askou Date: Wed, 16 Jun 2021 14:28:21 +0200 Subject: [PATCH 4/8] set newCamPos to the only player if there is only one --- sources/System/Renderer/RenderSystem.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sources/System/Renderer/RenderSystem.cpp b/sources/System/Renderer/RenderSystem.cpp index 2fa13790..69b4fca8 100644 --- a/sources/System/Renderer/RenderSystem.cpp +++ b/sources/System/Renderer/RenderSystem.cpp @@ -91,8 +91,10 @@ namespace BBM float lowerXDist = 0; float lowerZDist = 0; - for (auto &[entity, pos, _] : this->_wal.getScene()->view>()) + for (auto &[entity, pos, _] : this->_wal.getScene()->view>()) { playerPos.emplace_back(pos.position); + if (playerPos.size() == 1) + newCameraPos = playerPos[0]; for (int i = 0; i < playerPos.size(); i++) for (int j = 0; j < playerPos.size(); j++) { if (maxDist < playerPos[i].distance(playerPos[j])) { From 88add0b8f15c5012a5a639d6d7785b8c37bdd783 Mon Sep 17 00:00:00 2001 From: Askou Date: Thu, 17 Jun 2021 09:37:11 +0200 Subject: [PATCH 5/8] basic game intro animation with reset --- .../BombHolder/BombHolderComponent.hpp | 2 +- sources/Runner/GameScene.cpp | 2 +- sources/Runner/LobbyScene.cpp | 2 +- sources/System/Animator/AnimatorSystem.cpp | 3 ++ sources/System/Renderer/RenderSystem.cpp | 34 +++++++++++++++++-- sources/System/Renderer/RenderSystem.hpp | 3 ++ 6 files changed, 40 insertions(+), 6 deletions(-) diff --git a/sources/Component/BombHolder/BombHolderComponent.hpp b/sources/Component/BombHolder/BombHolderComponent.hpp index 43242338..02b28fcf 100644 --- a/sources/Component/BombHolder/BombHolderComponent.hpp +++ b/sources/Component/BombHolder/BombHolderComponent.hpp @@ -14,7 +14,7 @@ using namespace std::chrono_literals; namespace BBM { - class BombHolderComponent : public WAL::Component + class BombHolderComponent : public WAL::Component { public: //! @brief The number of bomb that this entity hold. diff --git a/sources/Runner/GameScene.cpp b/sources/Runner/GameScene.cpp index 75de7648..51a0221f 100644 --- a/sources/Runner/GameScene.cpp +++ b/sources/Runner/GameScene.cpp @@ -29,7 +29,7 @@ namespace BBM { auto scene = std::make_shared(); scene->addEntity("camera") - .addComponent(8, 20, 7) + .addComponent(8, 0, -5) .addComponent(Vector3f(8, 0, 8)); MapGenerator::loadMap(16, 16, MapGenerator::createMap(16, 16, hasHeights), scene); return scene; diff --git a/sources/Runner/LobbyScene.cpp b/sources/Runner/LobbyScene.cpp index c2221298..efdd90a3 100644 --- a/sources/Runner/LobbyScene.cpp +++ b/sources/Runner/LobbyScene.cpp @@ -183,7 +183,7 @@ namespace BBM player.addComponent(i, ready, playerTile); } scene->addEntity("camera") - .addComponent(8, 20, 7) + .addComponent(-5, 0, -5) .addComponent(Vector3f(8, 0, 8)); play.getComponent().setButtonLinks(&heightOption, &back, &back, nullptr); back.getComponent().setButtonLinks(&play, nullptr, nullptr, &play); diff --git a/sources/System/Animator/AnimatorSystem.cpp b/sources/System/Animator/AnimatorSystem.cpp index f03aeb9b..5cd1a28d 100644 --- a/sources/System/Animator/AnimatorSystem.cpp +++ b/sources/System/Animator/AnimatorSystem.cpp @@ -27,6 +27,9 @@ namespace BBM auto drawable = entity.get().drawable.get(); auto &animation = entity.get(); auto anim = dynamic_cast(drawable); + + if (entity->shouldDelete()) + return; if (anim && controllable.move != Vector2f(0, 0)) { anim->setRotationAngle(controllable.move.angle(Vector2f(-1, 0))); animation.setAnimIndex(0); diff --git a/sources/System/Renderer/RenderSystem.cpp b/sources/System/Renderer/RenderSystem.cpp index 69b4fca8..483bb9f6 100644 --- a/sources/System/Renderer/RenderSystem.cpp +++ b/sources/System/Renderer/RenderSystem.cpp @@ -80,9 +80,35 @@ namespace BBM this->_window.endDrawing(); } + bool RenderSystem::introAnimation(WAL::ViewEntity &entity, bool restart) + { + auto &pos = entity.get(); + static Vector3f posTarget(8, 25, 7); + static bool hasEnded = false; + + if (restart) { + hasEnded = false; + return (false); + } + if (pos.position.distance(posTarget) < 1 || hasEnded) { + hasEnded = true; + return (true); + } + + auto &cam = entity.get(); + + pos.position += (posTarget - pos.position) / 100; + this->_camera.setPosition(pos.position); + this->_camera.setTarget(cam.target); + return (false); + } + + void RenderSystem::onUpdate(WAL::ViewEntity &entity, std::chrono::nanoseconds dtime) { + if (!introAnimation(entity)) + return; auto &pos = entity.get(); auto &cam = entity.get(); Vector3f newCameraPos = Vector3f(-1, -1, -1); @@ -91,8 +117,10 @@ namespace BBM float lowerXDist = 0; float lowerZDist = 0; - for (auto &[entity, pos, _] : this->_wal.getScene()->view>()) { + for (auto &[entity, pos, _] : this->_wal.getScene()->view>()) playerPos.emplace_back(pos.position); + if (playerPos.size() == 0) + introAnimation(entity, true); if (playerPos.size() == 1) newCameraPos = playerPos[0]; for (int i = 0; i < playerPos.size(); i++) @@ -111,10 +139,10 @@ namespace BBM maxDist = 14; if (maxDist > 25) maxDist = 25; - cam.target += (newCameraPos.abs() - pos.position.abs()) / 5; + cam.target += (newCameraPos.abs() - pos.position.abs()) / 10; newCameraPos.y = maxDist; newCameraPos.z -= 1; - pos.position += (newCameraPos.abs() - pos.position.abs()) / 5; + pos.position += (newCameraPos.abs() - pos.position.abs()) / 10; _camera.setTarget(cam.target); _camera.setPosition(pos.position); } diff --git a/sources/System/Renderer/RenderSystem.hpp b/sources/System/Renderer/RenderSystem.hpp index 7ef2c801..fcb40970 100644 --- a/sources/System/Renderer/RenderSystem.hpp +++ b/sources/System/Renderer/RenderSystem.hpp @@ -43,6 +43,9 @@ namespace BBM //! @param entity entity to draw bounding box of void drawBoundingBox(const WAL::Entity &entity, const PositionComponent &posComponent, const Drawable3DComponent &drawable) const; + + //! @brief introduciton animation when entering gameScene + bool introAnimation(WAL::ViewEntity &entity, bool restart = false); //! @brief ctor RenderSystem(WAL::Wal &wal, RAY::Window &window, bool debugMode = false); From 8c56f7f4a13790e694c2daabb08eeab376a4c485 Mon Sep 17 00:00:00 2001 From: Askou Date: Thu, 17 Jun 2021 10:58:13 +0200 Subject: [PATCH 6/8] Add Camera System --- CMakeLists.txt | 2 + sources/Runner/GameScene.cpp | 1 - sources/Runner/Runner.cpp | 4 +- sources/System/Renderer/CameraSystem.cpp | 79 ++++++++++++++++++++++++ sources/System/Renderer/CameraSystem.hpp | 36 +++++++++++ sources/System/Renderer/RenderSystem.cpp | 59 +----------------- sources/System/Renderer/RenderSystem.hpp | 3 - 7 files changed, 121 insertions(+), 63 deletions(-) create mode 100644 sources/System/Renderer/CameraSystem.cpp create mode 100644 sources/System/Renderer/CameraSystem.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 5cc80c6c..8574a23a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -127,6 +127,8 @@ set(SOURCES sources/Component/IntroAnimation/IntroAnimationComponent.cpp sources/System/IntroAnimation/IntroAnimationSystem.hpp sources/System/IntroAnimation/IntroAnimationSystem.cpp + sources/System/Renderer/CameraSystem.cpp + sources/System/Renderer/CameraSystem.cpp sources/Runner/SplashScreenScene.cpp sources/Runner/TitleScreenScene.cpp sources/Runner/MainMenuScene.cpp diff --git a/sources/Runner/GameScene.cpp b/sources/Runner/GameScene.cpp index 51a0221f..601e991c 100644 --- a/sources/Runner/GameScene.cpp +++ b/sources/Runner/GameScene.cpp @@ -47,7 +47,6 @@ namespace BBM return scene.addEntity("player") .addComponent() .addComponent("assets/player/player.iqm", true) - .addComponent() .addComponent() .addComponent() .addComponent() diff --git a/sources/Runner/Runner.cpp b/sources/Runner/Runner.cpp index 2e29e4b2..72a49ce8 100644 --- a/sources/Runner/Runner.cpp +++ b/sources/Runner/Runner.cpp @@ -33,6 +33,7 @@ #include "System/Gravity/GravitySystem.hpp" #include "System/BumperTimer/BumperTimerSystem.hpp" #include "System/Music/MusicSystem.hpp" +#include "System/Renderer/CameraSystem.hpp" #include "System/Lobby/LobbySystem.hpp" #include "Component/Lobby/LobbyComponent.hpp" @@ -85,7 +86,8 @@ namespace BBM .addSystem() .addSystem() .addSystem() - .addSystem(); + .addSystem() + .addSystem(); } void Runner::enableRaylib(WAL::Wal &wal) diff --git a/sources/System/Renderer/CameraSystem.cpp b/sources/System/Renderer/CameraSystem.cpp new file mode 100644 index 00000000..73134bb1 --- /dev/null +++ b/sources/System/Renderer/CameraSystem.cpp @@ -0,0 +1,79 @@ +// +// Created by Tom Augier on 05/06/2021 +// + +#include "CameraSystem.hpp" +#include "Entity/Entity.hpp" +#include "Component/Tag/TagComponent.hpp" + +namespace BBM +{ + CameraSystem::CameraSystem(WAL::Wal &wal) + : System(wal) + {} + + bool CameraSystem::introAnimation(WAL::ViewEntity &entity, bool restart) + { + auto &pos = entity.get(); + static Vector3f posTarget(8, 25, 7); + static bool hasEnded = false; + + if (restart) { + hasEnded = false; + return (false); + } + if (pos.position.distance(posTarget) < 2 || hasEnded) { + hasEnded = true; + return (true); + } + + auto &cam = entity.get(); + + pos.position += (posTarget - pos.position) / 100; + return (false); + } + + void CameraSystem::onUpdate(WAL::ViewEntity &entity, + std::chrono::nanoseconds dtime) + { + if (!introAnimation(entity)) + return; + auto &pos = entity.get(); + auto &cam = entity.get(); + Vector3f newCameraPos = Vector3f(-1, -1, -1); + std::vector playerPos; + float maxDist = 0; + float lowerXDist = 0; + float lowerZDist = 0; + + for (auto &[entity, pos, _] : this->_wal.getScene()->view>()) { + if (!entity.hasComponent()) + entity.addComponent(); + playerPos.emplace_back(pos.position); + } + if (playerPos.size() == 0) + introAnimation(entity, true); + if (playerPos.size() == 1) + newCameraPos = playerPos[0]; + for (int i = 0; i < playerPos.size(); i++) + for (int j = 0; j < playerPos.size(); j++) { + if (maxDist < playerPos[i].distance(playerPos[j])) { + maxDist = playerPos[i].distance(playerPos[j]); + newCameraPos = (playerPos[i] + playerPos[j]) / 2; + } + if (lowerXDist < std::abs((playerPos[i].x - playerPos[j].x))) + lowerXDist = std::abs((playerPos[i].x - playerPos[j].x)); + if (lowerZDist < std::abs((playerPos[i].z - playerPos[j].z))) + lowerZDist = std::abs((playerPos[i].z - playerPos[j].z)); + } + maxDist += (lowerXDist + lowerZDist) / 2; + if (maxDist < 14) + maxDist = 14; + if (maxDist > 25) + maxDist = 25; + cam.target += (newCameraPos.abs() - pos.position.abs()) / 10; + newCameraPos.y = maxDist; + newCameraPos.z -= 1; + pos.position += (newCameraPos.abs() - pos.position.abs()) / 10; + } +} \ No newline at end of file diff --git a/sources/System/Renderer/CameraSystem.hpp b/sources/System/Renderer/CameraSystem.hpp new file mode 100644 index 00000000..ce3a804f --- /dev/null +++ b/sources/System/Renderer/CameraSystem.hpp @@ -0,0 +1,36 @@ +// +// Created by Tom Augier on 05/06/2021 +// + +#pragma once + +#include "System/System.hpp" +#include "Window.hpp" +#include "Component/Renderer/CameraComponent.hpp" +#include "Component/Position/PositionComponent.hpp" +#include +#include "Wal.hpp" + +namespace BBM +{ + class CameraSystem : public WAL::System + { + public: + //! @inherit + void onUpdate(WAL::ViewEntity &entity, std::chrono::nanoseconds) override; + + //! @brief introduciton animation when entering gameScene + bool introAnimation(WAL::ViewEntity &entity, bool restart = false); + + //! @brief ctor + CameraSystem(WAL::Wal &wal); + //! @brief Default copy ctor + CameraSystem(const CameraSystem &) = default; + //! @brief Default dtor + ~CameraSystem() override = default; + //! @brief A CameraManager screen system can't be assigned. + CameraSystem &operator=(const CameraSystem &) = delete; + }; +} + + \ No newline at end of file diff --git a/sources/System/Renderer/RenderSystem.cpp b/sources/System/Renderer/RenderSystem.cpp index 483bb9f6..f72f850b 100644 --- a/sources/System/Renderer/RenderSystem.cpp +++ b/sources/System/Renderer/RenderSystem.cpp @@ -80,69 +80,12 @@ namespace BBM this->_window.endDrawing(); } - bool RenderSystem::introAnimation(WAL::ViewEntity &entity, bool restart) - { - auto &pos = entity.get(); - static Vector3f posTarget(8, 25, 7); - static bool hasEnded = false; - - if (restart) { - hasEnded = false; - return (false); - } - if (pos.position.distance(posTarget) < 1 || hasEnded) { - hasEnded = true; - return (true); - } - - auto &cam = entity.get(); - - pos.position += (posTarget - pos.position) / 100; - this->_camera.setPosition(pos.position); - this->_camera.setTarget(cam.target); - return (false); - } - - void RenderSystem::onUpdate(WAL::ViewEntity &entity, std::chrono::nanoseconds dtime) { - if (!introAnimation(entity)) - return; auto &pos = entity.get(); auto &cam = entity.get(); - Vector3f newCameraPos = Vector3f(-1, -1, -1); - std::vector playerPos; - float maxDist = 0; - float lowerXDist = 0; - float lowerZDist = 0; - - for (auto &[entity, pos, _] : this->_wal.getScene()->view>()) - playerPos.emplace_back(pos.position); - if (playerPos.size() == 0) - introAnimation(entity, true); - if (playerPos.size() == 1) - newCameraPos = playerPos[0]; - for (int i = 0; i < playerPos.size(); i++) - for (int j = 0; j < playerPos.size(); j++) { - if (maxDist < playerPos[i].distance(playerPos[j])) { - maxDist = playerPos[i].distance(playerPos[j]); - newCameraPos = (playerPos[i] + playerPos[j]) / 2; - } - if (lowerXDist < std::abs((playerPos[i].x - playerPos[j].x))) - lowerXDist = std::abs((playerPos[i].x - playerPos[j].x)); - if (lowerZDist < std::abs((playerPos[i].z - playerPos[j].z))) - lowerZDist = std::abs((playerPos[i].z - playerPos[j].z)); - } - maxDist += (lowerXDist + lowerZDist) / 2; - if (maxDist < 14) - maxDist = 14; - if (maxDist > 25) - maxDist = 25; - cam.target += (newCameraPos.abs() - pos.position.abs()) / 10; - newCameraPos.y = maxDist; - newCameraPos.z -= 1; - pos.position += (newCameraPos.abs() - pos.position.abs()) / 10; + _camera.setTarget(cam.target); _camera.setPosition(pos.position); } diff --git a/sources/System/Renderer/RenderSystem.hpp b/sources/System/Renderer/RenderSystem.hpp index fcb40970..7ef2c801 100644 --- a/sources/System/Renderer/RenderSystem.hpp +++ b/sources/System/Renderer/RenderSystem.hpp @@ -43,9 +43,6 @@ namespace BBM //! @param entity entity to draw bounding box of void drawBoundingBox(const WAL::Entity &entity, const PositionComponent &posComponent, const Drawable3DComponent &drawable) const; - - //! @brief introduciton animation when entering gameScene - bool introAnimation(WAL::ViewEntity &entity, bool restart = false); //! @brief ctor RenderSystem(WAL::Wal &wal, RAY::Window &window, bool debugMode = false); From 350d79f636bbd8705717f4e6b87de24422a10757 Mon Sep 17 00:00:00 2001 From: Askou Date: Thu, 17 Jun 2021 11:04:59 +0200 Subject: [PATCH 7/8] fix indent --- sources/Component/BombHolder/BombHolderComponent.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/Component/BombHolder/BombHolderComponent.hpp b/sources/Component/BombHolder/BombHolderComponent.hpp index 02b28fcf..43242338 100644 --- a/sources/Component/BombHolder/BombHolderComponent.hpp +++ b/sources/Component/BombHolder/BombHolderComponent.hpp @@ -14,7 +14,7 @@ using namespace std::chrono_literals; namespace BBM { - class BombHolderComponent : public WAL::Component + class BombHolderComponent : public WAL::Component { public: //! @brief The number of bomb that this entity hold. From 0d9d1318eeb33afef844c0b50afc5237f1af6d00 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Thu, 17 Jun 2021 14:55:01 +0200 Subject: [PATCH 8/8] Value cleanup --- sources/System/Renderer/CameraSystem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/System/Renderer/CameraSystem.cpp b/sources/System/Renderer/CameraSystem.cpp index 73134bb1..3c4e538c 100644 --- a/sources/System/Renderer/CameraSystem.cpp +++ b/sources/System/Renderer/CameraSystem.cpp @@ -22,7 +22,7 @@ namespace BBM hasEnded = false; return (false); } - if (pos.position.distance(posTarget) < 2 || hasEnded) { + if (pos.position.distance(posTarget) < 4 || hasEnded) { hasEnded = true; return (true); }