feat: add castle tooltip

This commit is contained in:
2021-12-12 13:32:39 +01:00
parent 4611a198c9
commit 24617c539f
11 changed files with 133 additions and 14 deletions

View File

@@ -5,7 +5,7 @@
namespace td {
namespace game {
Team::Team(TeamColor color) : m_Color(color) {}
Team::Team(TeamColor color) : m_Color(color), m_TeamCastle(this) {}
void Team::addPlayer(Player* newPlayer) {
m_Players.push_back(newPlayer);

View File

@@ -44,7 +44,10 @@ bool World::loadMap(const protocol::WorldBeginDataPacket* worldHeader) {
m_SpawnColorPalette = worldHeader->getSpawnPalette();
getRedTeam().getCastle() = worldHeader->getRedCastle();
getRedTeam().getCastle().setTeam(&getRedTeam());
getBlueTeam().getCastle() = worldHeader->getBlueCastle();
getBlueTeam().getCastle().setTeam(&getBlueTeam());
m_TilePalette = worldHeader->getTilePalette();
@@ -328,5 +331,9 @@ const Player* World::getPlayerById(PlayerID id) const {
return m_Game->getPlayerById(id);
}
const TeamList& World::getTeams() const {
return m_Game->getTeams();
}
} // namespace game
} // namespace td

View File

@@ -94,11 +94,11 @@ DataBuffer WorldBeginDataPacket::SerializeCustom() const {
const game::Spawn& redSpawn = m_Header.m_RedSpawn, blueSpawn = m_Header.m_BlueSpawn;
const game::TeamCastle& redCastle = m_Header.m_RedCastle, blueCastle = m_Header.m_BlueCastle;
data << redSpawn << redCastle;
data << blueSpawn << blueCastle;
data << redSpawn << static_cast<utils::shape::Rectangle>(redCastle);
data << blueSpawn << static_cast<utils::shape::Rectangle>(blueCastle);
// tile palette
data << m_Header.m_TilePalette.size();
data << static_cast<std::uint64_t>(m_Header.m_TilePalette.size());
for (game::TilePtr tile : m_Header.m_TilePalette) {
data << tile;
@@ -126,11 +126,11 @@ DataBuffer WorldBeginDataPacket::Serialize() const {
const game::Spawn& redSpawn = m_Header.m_World->getRedTeam().getSpawn(), blueSpawn = m_Header.m_World->getBlueTeam().getSpawn();
const game::TeamCastle& redCastle = m_Header.m_World->getRedTeam().getCastle(), blueCastle = m_Header.m_World->getBlueTeam().getCastle();
data << redSpawn << redCastle;
data << blueSpawn << blueCastle;
data << redSpawn << static_cast<utils::shape::Rectangle>(redCastle);
data << blueSpawn << static_cast<utils::shape::Rectangle>(blueCastle);
// tile palette
data << m_Header.m_World->getTilePalette().size();
data << static_cast<std::uint64_t>(m_Header.m_World->getTilePalette().size());
for (game::TilePtr tile : m_Header.m_World->getTilePalette()) {
data << tile;
@@ -155,8 +155,13 @@ void WorldBeginDataPacket::Deserialize(DataBuffer& data) {
data.SetReadOffset(data.GetReadOffset() + decoPalletteSizeByte);
data >> m_Header.m_RedSpawn >> m_Header.m_RedCastle;
data >> m_Header.m_BlueSpawn >> m_Header.m_BlueCastle;
utils::shape::Rectangle redCastle, blueCastle;
data >> m_Header.m_RedSpawn >> redCastle;
data >> m_Header.m_BlueSpawn >> blueCastle;
m_Header.m_RedCastle.setShape(redCastle);
m_Header.m_BlueCastle.setShape(blueCastle);
std::uint64_t tilePaletteSize;
data >> tilePaletteSize;

View File

@@ -37,6 +37,7 @@ WorldRenderer::WorldRenderer(game::World* world, client::ClientGame* client) : m
m_Renderer->setCamMovement({});
m_TowerPlacePopup = std::make_unique<gui::TowerPlacePopup>(m_Client->getClient());
m_MobTooltip = std::make_unique<gui::MobTooltip>(m_Client->getClient());
m_CastleTooltip = std::make_unique<gui::CastleTooltip>(m_Client->getClient());
m_Client->getWorld().getWorldNotifier().bindListener(this);
}
@@ -119,7 +120,7 @@ void WorldRenderer::render() {
renderMobs();
renderTowers();
renderTileSelect();
renderMobTooltip();
renderTooltips();
renderPopups();
detectClick();
}
@@ -128,6 +129,11 @@ WorldRenderer::~WorldRenderer() {
}
void WorldRenderer::renderTooltips() const {
renderMobTooltip();
renderCastleTooltip();
}
void WorldRenderer::moveCam(float relativeX, float relativeY, float aspectRatio) {
if (m_WorldVao == nullptr)
return;
@@ -245,6 +251,13 @@ void WorldRenderer::renderMobTooltip() const {
m_MobTooltip->render();
}
void WorldRenderer::renderCastleTooltip() const {
if (ImGui::IsAnyItemHovered()) return;
detectCastleHovering();
m_CastleTooltip->render();
}
void WorldRenderer::detectMobHovering() const {
glm::vec2 cursorWorldPos = getCursorWorldPos();
for (game::MobPtr mob : m_World->getMobList()) {
@@ -256,6 +269,17 @@ void WorldRenderer::detectMobHovering() const {
m_MobTooltip->setMob(nullptr);
}
void WorldRenderer::detectCastleHovering() const {
glm::vec2 cursorWorldPos = getCursorWorldPos();
for (const game::Team& team : m_World->getTeams()) {
if (team.getCastle().collidesWith({ cursorWorldPos.x, cursorWorldPos.y })) {
m_CastleTooltip->setCastle(&team.getCastle());
return;
}
}
m_CastleTooltip->setCastle(nullptr);
}
void WorldRenderer::OnTowerAdd(game::TowerPtr tower) {
WorldLoader::RenderData renderData = WorldLoader::loadTowerModel(tower);
m_TowersCache.addData(tower->getID(), renderData.positions, renderData.colors);

View File

@@ -0,0 +1,27 @@
#include "render/gui/CastleTooltip.h"
#include "render/gui/imgui/imgui.h"
#include "render/WorldRenderer.h"
#include "game/client/Client.h"
namespace td {
namespace gui {
CastleTooltip::CastleTooltip(client::Client* client) : GuiWidget(client) {
}
void CastleTooltip::render() {
if (m_Castle == nullptr) return;
ImGui::BeginTooltip();
ImGui::PushStyleColor(ImGuiCol_Text, render::WorldRenderer::getImGuiTeamColor(m_Castle->getTeam()->getColor()));
ImGui::Text("Castle : ");
ImGui::PopStyleColor();
ImGui::Text("\tCastle HP : %i/%i", static_cast<int>(m_Castle->getLife()), game::TeamCastle::CastleMaxLife);
ImGui::EndTooltip();
}
} // namespace gui
} // namespace td