diff --git a/include/game/client/Client.h b/include/game/client/Client.h index f68852b..68d0dcb 100644 --- a/include/game/client/Client.h +++ b/include/game/client/Client.h @@ -42,6 +42,7 @@ public: void selectTeam(game::TeamColor team); void sendMobs(const std::vector& mobSends); + void placeTower(game::TowerType type, const glm::vec2& position); void upgradeTower(game::TowerID tower, game::TowerLevel level); }; diff --git a/include/game/client/ClientGame.h b/include/game/client/ClientGame.h index e58965d..8806c9e 100644 --- a/include/game/client/ClientGame.h +++ b/include/game/client/ClientGame.h @@ -38,8 +38,6 @@ public: render::Renderer* getRenderer() const { return m_Renderer; } - void PlaceTower(game::TowerType type, const glm::vec2& position); - virtual void HandlePacket(const protocol::ConnexionInfoPacket* packet); virtual void HandlePacket(const protocol::PlayerJoinPacket* packet); virtual void HandlePacket(const protocol::PlayerLeavePacket* packet); diff --git a/include/render/WorldRenderer.h b/include/render/WorldRenderer.h index ad83092..0f111c8 100644 --- a/include/render/WorldRenderer.h +++ b/include/render/WorldRenderer.h @@ -1,9 +1,15 @@ #pragma once #include "game/World.h" + #include "render/Renderer.h" #include "render/VertexCache.h" +#include "render/gui/TowerPlacePopup.h" +#include "render/gui/MobTooltip.h" + +#include "render/gui/imgui/imgui.h" + #include namespace td { @@ -31,6 +37,9 @@ private: float m_CamSensibility = 1; bool m_PopupOpened = false; VertexCache m_TowersCache; + + std::unique_ptr m_TowerPlacePopup; + std::unique_ptr m_MobTooltip; public: WorldRenderer(game::World* world, client::ClientGame* client); ~WorldRenderer(); @@ -40,6 +49,8 @@ public: void addTower(game::TowerPtr tower); void removeTower(game::TowerPtr tower); + static ImVec4 getImGuiTeamColor(game::TeamColor color); + void update(); void render(); @@ -54,10 +65,10 @@ private: void renderMobs() const; void renderTileSelect() const; void renderPopups(); - void renderTowerPlacePopup(); void renderTowerUpgradePopup(); void renderMobTooltip() const; void detectClick(); + void detectMobHovering() const; glm::vec2 getCursorWorldPos() const; glm::vec2 getClickWorldPos() const; diff --git a/include/render/gui/MobTooltip.h b/include/render/gui/MobTooltip.h new file mode 100644 index 0000000..e0c9de4 --- /dev/null +++ b/include/render/gui/MobTooltip.h @@ -0,0 +1,27 @@ +#pragma once + +#include "GuiWidget.h" + +namespace td { + +namespace game { + +class Mob; + +} // namespace game + +namespace gui { + +class MobTooltip : public GuiWidget { +private: + const game::Mob* m_Mob; +public: + MobTooltip(client::Client* client); + + virtual void render(); + + void setMob(const game::Mob* mob) { m_Mob = mob; } +}; + +} // namespace gui +} // namespace td diff --git a/include/render/gui/TowerPlacePopup.h b/include/render/gui/TowerPlacePopup.h new file mode 100644 index 0000000..20db877 --- /dev/null +++ b/include/render/gui/TowerPlacePopup.h @@ -0,0 +1,22 @@ +#pragma once + +#include "GuiWidget.h" + +#include + +namespace td { +namespace gui { + +class TowerPlacePopup : public GuiWidget { +private: + glm::vec2 m_ClickWorldPos; +public: + TowerPlacePopup(client::Client* client); + + virtual void render(); + + void setClickPos(const glm::vec2& worldPos); +}; + +} // namespace gui +} // namespace td diff --git a/src/game/client/Client.cpp b/src/game/client/Client.cpp index c715008..2c44cf3 100644 --- a/src/game/client/Client.cpp +++ b/src/game/client/Client.cpp @@ -54,6 +54,11 @@ void Client::sendMobs(const std::vector& mobSends){ m_Connexion.sendPacket(&packet); } +void Client::placeTower(game::TowerType type, const glm::vec2& position) { + protocol::PlaceTowerPacket packet(position.x, position.y, type); + m_Connexion.sendPacket(&packet); +} + void Client::upgradeTower(game::TowerID tower, game::TowerLevel level){ protocol::UpgradeTowerPacket packet(tower, level); m_Connexion.sendPacket(&packet); diff --git a/src/game/client/ClientGame.cpp b/src/game/client/ClientGame.cpp index ab7cd55..65a8be1 100644 --- a/src/game/client/ClientGame.cpp +++ b/src/game/client/ClientGame.cpp @@ -112,11 +112,6 @@ void ClientGame::renderWorld() { } } -void ClientGame::PlaceTower(game::TowerType type, const glm::vec2& position) { - protocol::PlaceTowerPacket packet(position.x, position.y, type); - m_Client->getConnexion().sendPacket(&packet); -} - void ClientGame::HandlePacket(const protocol::WorldAddTowerPacket* packet) { m_WorldRenderer.addTower(m_WorldClient.placeTowerAt(packet->getTowerID(), packet->getTowerType(), packet->getTowerX(), packet->getTowerY(), packet->getBuilder())); } diff --git a/src/render/WorldRenderer.cpp b/src/render/WorldRenderer.cpp index 423c94e..a792412 100644 --- a/src/render/WorldRenderer.cpp +++ b/src/render/WorldRenderer.cpp @@ -12,7 +12,7 @@ namespace td { namespace render { -ImVec4 getImGuiTeamColor(td::game::TeamColor color) { +ImVec4 WorldRenderer::getImGuiTeamColor(game::TeamColor color) { switch (color) { case td::game::TeamColor::None: break; @@ -35,6 +35,8 @@ void WorldRenderer::loadModels() { WorldRenderer::WorldRenderer(game::World* world, client::ClientGame* client) : m_Client(client), m_Renderer(m_Client->getRenderer()), m_World(world), m_Zoom(0.1) { m_Renderer->setZoom(m_Zoom); m_Renderer->setCamMovement({}); + m_TowerPlacePopup = std::make_unique(m_Client->getClient()); + m_MobTooltip = std::make_unique(m_Client->getClient()); } void WorldRenderer::updateCursorPos() { @@ -91,7 +93,7 @@ void WorldRenderer::renderTileSelect() const { } void WorldRenderer::renderPopups() { - renderTowerPlacePopup(); + m_TowerPlacePopup->render(); renderTowerUpgradePopup(); } @@ -134,6 +136,7 @@ void WorldRenderer::changeZoom(float zoomStep) { void WorldRenderer::click() { const game::TowerPtr tower = m_Client->getWorld().getTower(getClickWorldPos()); + m_TowerPlacePopup->setClickPos(getClickWorldPos()); if (tower != nullptr) { // there is a tower here ImGui::OpenPopup("TowerUpgrade"); } else if (m_Client->getWorld().CanPlaceLittleTower(getClickWorldPos(), m_Client->getPlayer()->getID())) { @@ -146,28 +149,6 @@ void WorldRenderer::setCamPos(float camX, float camY) { m_Renderer->setCamPos(m_CamPos); } -void WorldRenderer::renderTowerPlacePopup() { - if (ImGui::BeginPopup("TowerPlace")) { - m_PopupOpened = true; - for (int i = 0; i < (int)game::TowerType::TowerCount; i++) { - game::TowerType towerType = game::TowerType(i); - const game::TowerInfo& towerInfo = game::getTowerInfo(towerType); - if (!towerInfo.isBigTower() || (towerInfo.isBigTower() && m_Client->getWorld().CanPlaceBigTower(getClickWorldPos(), m_Client->getPlayer()->getID()))) { - if (ImGui::Button(game::getTowerInfo(towerType).getName().c_str())) { - m_Client->PlaceTower(towerType, getClickWorldPos()); - ImGui::CloseCurrentPopup(); - break; - } - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip(game::getTowerInfo(towerType).getDescription().c_str(), "%s"); - } - } - } - ImGui::EndPopup(); - } - m_PopupOpened = false; -} - void WorldRenderer::renderTowerUpgradePopup() { if (ImGui::BeginPopup("TowerUpgrade")) { m_PopupOpened = true; @@ -243,6 +224,11 @@ void WorldRenderer::detectClick() { } void WorldRenderer::renderMobTooltip() const { + detectMobHovering(); + m_MobTooltip->render(); +} + +void WorldRenderer::detectMobHovering() const { glm::vec2 cursorWorldPos = getCursorWorldPos(); for (game::MobPtr mob : m_World->getMobList()) { // mob size is currently 1x1 for all mobs @@ -250,30 +236,11 @@ void WorldRenderer::renderMobTooltip() const { float mobCenterY = mob->getY(); if (cursorWorldPos.x > mobCenterX - 0.5f && cursorWorldPos.x < mobCenterX + 0.5f && cursorWorldPos.y > mobCenterY - 0.5f && cursorWorldPos.y < mobCenterY + 0.5f) { - - const game::Player& sender = m_Client->getPlayerById(mob->getSender()); - - ImGui::BeginTooltip(); - ImGui::Text("Sender :"); - ImGui::SameLine(); - ImGui::PushStyleColor(ImGuiCol_Text, getImGuiTeamColor(sender.getTeamColor())); - ImGui::Text("%s", sender.getName().c_str()); - ImGui::PopStyleColor(); - ImGui::Text("Mob HP : %.1f/%i", mob->getHealth(), mob->getStats()->getMaxLife()); - ImGui::Text("Mob Type : %s", game::MobFactory::getMobName(mob->getType()).c_str()); - ImGui::Text("Mob Level : %i", mob->getLevel()); - ImGui::NewLine(); - ImGui::Text("Mob Stats :"); - ImGui::Text("\tMax health : %i", mob->getStats()->getMaxLife()); - ImGui::Text("\tSpeed : %.1f", mob->getStats()->getMovementSpeed()); - ImGui::Text("\tDamage : %.1f", mob->getStats()->getDamage()); - ImGui::Text("\tMoney cost : %i", mob->getStats()->getMoneyCost()); - ImGui::Text("\tEXP cost : %i", mob->getStats()->getExpCost()); - ImGui::Text("\tEXP reward : %i", mob->getStats()->getExpReward()); - ImGui::EndTooltip(); - break; + m_MobTooltip->setMob(mob.get()); + return; } } + m_MobTooltip->setMob(nullptr); } void WorldRenderer::addTower(game::TowerPtr tower) { diff --git a/src/render/gui/GameMenu.cpp b/src/render/gui/GameMenu.cpp index f5ae5bb..572de79 100644 --- a/src/render/gui/GameMenu.cpp +++ b/src/render/gui/GameMenu.cpp @@ -1,24 +1,14 @@ #include "render/gui/GameMenu.h" #include "render/gui/imgui/imgui.h" +#include "render/WorldRenderer.h" + #include "game/client/Client.h" #include "game/server/Lobby.h" namespace td { namespace gui { -ImVec4 getImGuiTeamColor(td::game::TeamColor color) { - switch (color) { - case td::game::TeamColor::None: - break; - case td::game::TeamColor::Red: - return ImVec4(1, 0, 0, 1); - case td::game::TeamColor::Blue: - return ImVec4(0, 0, 1, 1); - } - return ImVec4(1, 1, 1, 1); -} - GameMenu::GameMenu(client::Client* client) : GuiWidget(client), m_SummonMenu(std::make_unique(client)) { } @@ -51,7 +41,7 @@ void GameMenu::showPlayers() { if (ImGui::TreeNode(std::string("Players (" + std::to_string(getClient()->getGame().getPlayers().size()) + ")##player_list").c_str())) { for (auto pair : getClient()->getGame().getPlayers()) { const td::game::Player& player = pair.second; - ImGui::PushStyleColor(ImGuiCol_Text, getImGuiTeamColor(player.getTeamColor())); + ImGui::PushStyleColor(ImGuiCol_Text, render::WorldRenderer::getImGuiTeamColor(player.getTeamColor())); ImGui::Text("%s", player.getName().c_str()); ImGui::PopStyleColor(); } diff --git a/src/render/gui/MobTooltip.cpp b/src/render/gui/MobTooltip.cpp new file mode 100644 index 0000000..31e83c2 --- /dev/null +++ b/src/render/gui/MobTooltip.cpp @@ -0,0 +1,42 @@ +#include "render/gui/MobTooltip.h" +#include "render/gui/imgui/imgui.h" + +#include "render/WorldRenderer.h" + +#include "game/Mobs.h" + +#include "game/client/Client.h" + +namespace td { +namespace gui { + +MobTooltip::MobTooltip(client::Client* client) : GuiWidget(client) { + +} + +void MobTooltip::render() { + if(m_Mob == nullptr) return; + + const game::Player& sender = getClient()->getGame().getPlayerById(m_Mob->getSender()); + ImGui::BeginTooltip(); + ImGui::Text("Sender :"); + ImGui::SameLine(); + ImGui::PushStyleColor(ImGuiCol_Text, render::WorldRenderer::getImGuiTeamColor(sender.getTeamColor())); + ImGui::Text("%s", sender.getName().c_str()); + ImGui::PopStyleColor(); + ImGui::Text("Mob HP : %.1f/%i", m_Mob->getHealth(), m_Mob->getStats()->getMaxLife()); + ImGui::Text("Mob Type : %s", game::MobFactory::getMobName(m_Mob->getType()).c_str()); + ImGui::Text("Mob Level : %i", m_Mob->getLevel()); + ImGui::NewLine(); + ImGui::Text("Mob Stats :"); + ImGui::Text("\tMax health : %i", m_Mob->getStats()->getMaxLife()); + ImGui::Text("\tSpeed : %.1f", m_Mob->getStats()->getMovementSpeed()); + ImGui::Text("\tDamage : %.1f", m_Mob->getStats()->getDamage()); + ImGui::Text("\tMoney cost : %i", m_Mob->getStats()->getMoneyCost()); + ImGui::Text("\tEXP cost : %i", m_Mob->getStats()->getExpCost()); + ImGui::Text("\tEXP reward : %i", m_Mob->getStats()->getExpReward()); + ImGui::EndTooltip(); +} + +} // namespace gui +} // namespace td diff --git a/src/render/gui/TowerPlacePopup.cpp b/src/render/gui/TowerPlacePopup.cpp new file mode 100644 index 0000000..0a2b707 --- /dev/null +++ b/src/render/gui/TowerPlacePopup.cpp @@ -0,0 +1,41 @@ +#include "render/gui/TowerPlacePopup.h" + +#include "render/gui/imgui/imgui.h" + +#include "game/Towers.h" + +#include "game/client/Client.h" + +namespace td { +namespace gui { + +TowerPlacePopup::TowerPlacePopup(client::Client* client) : GuiWidget(client) { + +} + +void TowerPlacePopup::render(){ + if (ImGui::BeginPopup("TowerPlace")) { + for (int i = 0; i < (int)game::TowerType::TowerCount; i++) { + game::TowerType towerType = game::TowerType(i); + const game::TowerInfo& towerInfo = game::getTowerInfo(towerType); + if (!towerInfo.isBigTower() || (towerInfo.isBigTower() && getClient()->getGame().getWorld().CanPlaceBigTower(m_ClickWorldPos, getClient()->getGame().getPlayer()->getID()))) { + if (ImGui::Button(game::getTowerInfo(towerType).getName().c_str())) { + getClient()->placeTower(towerType, m_ClickWorldPos); + ImGui::CloseCurrentPopup(); + break; + } + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip(game::getTowerInfo(towerType).getDescription().c_str(), "%s"); + } + } + } + ImGui::EndPopup(); + } +} + +void TowerPlacePopup::setClickPos(const glm::vec2& worldPos){ + m_ClickWorldPos = worldPos; +} + +} // namespace gui +} // namespace td