From 7f5984b229445d312ca1ebf497b55084c50273c5 Mon Sep 17 00:00:00 2001 From: Ulysse Cura Date: Thu, 17 Oct 2024 18:07:43 +0200 Subject: [PATCH] Change how camera works. --- Camera.hpp | 26 ++++++++++---------------- ECS/PlayerSystem.hpp | 8 ++++++++ Game.cpp | 10 +++------- 3 files changed, 21 insertions(+), 23 deletions(-) diff --git a/Camera.hpp b/Camera.hpp index 3733cf1..e644165 100644 --- a/Camera.hpp +++ b/Camera.hpp @@ -13,38 +13,32 @@ #ifndef CAMERA_HPP #define CAMERA_HPP -#include // SDL_Rect -#include "Game.hpp" // Game::... -#include "TileMap.hpp" // TileMap::... +#include // SDL_Rect +#include "Game.hpp" // Game::... +#include "TileMap.hpp" // TileMap::... +#include "Vector2D.hpp" // Vector2D class struct Camera { - Camera(int xpos, int ypos, int width, int height) + Camera(int width, int height) { - camR.x = xpos; - camR.y = ypos; camR.w = width; camR.h = height; } - Camera(int xpos, int ypos, int width, int height, int z) : zoom(z) - { - camR.x = xpos; - camR.y = ypos; - camR.w = width; - camR.h = height; - } - - // Verifie si la caméra ne dépasse pas de la map + // Update camera void update() { + camR.x = static_cast(centerPos.x - (static_cast(camR.w) / 2.0f)); + camR.y = static_cast(centerPos.y - (static_cast(camR.h) / 2.0f)); + if(camR.x < 0) camR.x = 0; if(camR.y < 0) camR.y = 0; if(camR.x > Game::tileMap.worldWidth - camR.w) camR.x = Game::tileMap.worldWidth - camR.w; if(camR.y > Game::tileMap.worldHeight - camR.h) camR.y = Game::tileMap.worldHeight - camR.h; } + Vector2D centerPos; SDL_Rect camR; - int zoom; // TODO Zoom pas encore pris en charge }; #endif diff --git a/ECS/PlayerSystem.hpp b/ECS/PlayerSystem.hpp index f3f679d..7b97e4b 100644 --- a/ECS/PlayerSystem.hpp +++ b/ECS/PlayerSystem.hpp @@ -143,6 +143,8 @@ class PlayerSystem : public Component { Game::camera.camR.x = static_cast(m_transform->position.x - static_cast((Game::camera.camR.w >> 1) - ((m_transform->dimension.x * m_transform->scale) / 2))); Game::camera.camR.y = static_cast(m_transform->position.y - static_cast((Game::camera.camR.h >> 1) - ((m_transform->dimension.y * m_transform->scale) / 2))); + Game::camera.centerPos.x = static_cast(m_transform->position.x + static_cast((m_transform->dimension.x * m_transform->scale) >> 1)); + Game::camera.centerPos.y = static_cast(m_transform->position.y + static_cast((m_transform->dimension.y * m_transform->scale) >> 1)); playerState = State::None; break; } @@ -202,6 +204,10 @@ class PlayerSystem : public Component { void m_setCamera() { + Vector2D target; + + target.x = m_transform->position.x + static_cast((m_transform->dimension.x * m_transform->scale) >> 2); + target.y = m_transform->position.y + static_cast((m_transform->dimension.y * m_transform->scale) >> 2); float targetX = m_transform->position.x - static_cast((Game::camera.camR.w >> 1) - ((m_transform->dimension.x * m_transform->scale) >> 2)); float targetY = m_transform->position.y - static_cast((Game::camera.camR.h >> 1) - ((m_transform->dimension.y * m_transform->scale) >> 2)); @@ -209,6 +215,8 @@ class PlayerSystem : public Component { if(playerState == State::Running) smoothingFactor = 0.12f; + Game::camera.centerPos.x = static_cast(lerp(Game::camera.centerPos.x, target.x, smoothingFactor)); + Game::camera.centerPos.y = static_cast(lerp(Game::camera.centerPos.y, target.y, smoothingFactor)); Game::camera.camR.x = static_cast(lerp(Game::camera.camR.x, targetX, smoothingFactor)); Game::camera.camR.y = static_cast(lerp(Game::camera.camR.y, targetY, smoothingFactor)); } diff --git a/Game.cpp b/Game.cpp index 05b45b5..e68a9d7 100644 --- a/Game.cpp +++ b/Game.cpp @@ -27,7 +27,7 @@ SDL_Renderer *Game::renderer; SDL_Texture *Game::textureRenderer; Events Game::events; TextureManager Game::textureManager; -Camera Game::camera {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT}; +Camera Game::camera {WINDOW_WIDTH, WINDOW_HEIGHT}; TileMap Game::tileMap; MapManager Game::mapManager; Manager Game::entityManager; @@ -129,12 +129,8 @@ bool Game::Init() player.addComponent(); player.addComponent(); - camera.camR.x = static_cast(p_transform->position.x - static_cast(camera.camR.w / 2 - p_transform->dimension.x * p_transform->scale / 2)); - camera.camR.y = static_cast(p_transform->position.y - static_cast(camera.camR.h / 2 - p_transform->dimension.y * p_transform->scale / 2)); - - Item &item(p_inventory->addItem()); - - item.addProperty("Prout"); + camera.centerPos.x = static_cast(p_transform->position.x - static_cast(p_transform->dimension.x) * static_cast(p_transform->scale) / 2.0f); + camera.centerPos.y = static_cast(p_transform->position.y - static_cast(p_transform->dimension.y) * static_cast(p_transform->scale) / 2.0f); m_isRunning = true;