Skip to content
Snippets Groups Projects
Commit 8796f9b4 authored by Frederik Alexander Keens's avatar Frederik Alexander Keens
Browse files

Merge branch 'unit-hp-display' into 'main'

Let units show their hp

See merge request !19
parents 5103b93e f509970c
No related branches found
No related tags found
2 merge requests!29Merge main into box2d to implement physics,!19Let units show their hp
No preview for this file type
......@@ -357,6 +357,44 @@ Spritesheet::Spritesheet(std::string path, Engine& engine)
this->m_effectWidth = 32;
this->m_effectHeight = 32;
// Numbers
HighFive::DataSet number_ds = file.getDataSet("/misc/numbers");
std::vector<std::vector<uint32_t>> number_frames;
number_ds.read(number_frames);
std::vector<uint32_t> number_buffer(8 * 80, 0);
for (int y = 0; y < 8; y++)
{
for (int x = 0; x < 80; x++)
{
int index = y * 80 + x;
number_buffer.at(index) = number_frames.at(8 - y - 1).at(x);
}
}
SDL_Texture* tmp = SDL_CreateTexture(
engine.renderer(), SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_STATIC, 80, 8);
SDL_SetTextureBlendMode(tmp, SDL_BLENDMODE_BLEND);
if (tmp == nullptr)
{
throw std::runtime_error(
"Fehler beim Erstellen der Textur für die Effects: " + std::string(SDL_GetError()));
}
if (SDL_UpdateTexture(tmp, NULL, number_buffer.data(), 80 * sizeof(int32_t)) != 0)
{
throw std::runtime_error(
"Fehler beim updaten der Textur für die Tiles: " + std::string(SDL_GetError()));
}
this->m_numberTextures = tmp;
this->m_numberWidth = 8;
this->m_numberHeight = 8;
}
// Tiles
......@@ -434,6 +472,22 @@ std::vector<std::pair<SDL_Texture*, int>>& Spritesheet::getEffectTextures()
return this->m_effectTextures;
}
// Numbers
int Spritesheet::getNumberWidth()
{
return this->m_numberWidth;
}
int Spritesheet::getNumberHeight()
{
return this->m_numberHeight;
}
SDL_Texture* Spritesheet::getNumberTexture()
{
return this->m_numberTextures;
}
Spritesheet::~Spritesheet()
{
for (std::pair<SDL_Texture*, int> tile_texture : m_tileTextures)
......@@ -456,6 +510,13 @@ Spritesheet::~Spritesheet()
}
}
}
for (auto& [texture, i] : m_effectTextures)
{
SDL_DestroyTexture(texture);
}
SDL_DestroyTexture(m_numberTextures);
}
} // namespace advanced_wars
\ No newline at end of file
......@@ -153,6 +153,26 @@ class Spritesheet
*/
std::vector<std::pair<SDL_Texture*, int>>& getEffectTextures();
// Numbers
/**
* @return The width of a number in pixels
*/
int getNumberWidth();
/**
* @return The height of a number in pixels
*/
int getNumberHeight();
/**
* The texture represents the individual texture for all numbers linearised.
*
* The order of the numbers is the following: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.
*
* @return Number texture
*/
SDL_Texture* getNumberTexture();
private:
// Tiles
std::vector<std::pair<SDL_Texture*, int>> m_tileTextures;
......@@ -179,5 +199,11 @@ class Spritesheet
int m_effectWidth;
int m_effectHeight;
// Numbers
SDL_Texture* m_numberTextures;
int m_numberWidth;
int m_numberHeight;
};
} // namespace advanced_wars
......@@ -64,7 +64,7 @@ void Unit::render(Engine& engine, int scale)
SDL_Rect dst;
dst.x = ((m_x * spritesheet->getUnitWidth()) - 4) * scale;
dst.y = ((m_y * spritesheet->getUnitHeight()) - 4) * scale;
dst.y = ((m_y * spritesheet->getUnitHeight()) - 8) * scale;
dst.w = spritesheet->getUnitMovingWidth() * scale;
dst.h = spritesheet->getUnitMovingHeight() * scale;
......@@ -77,6 +77,7 @@ void Unit::render(Engine& engine, int scale)
.first,
&src, &dst, 0, NULL, SDL_FLIP_NONE);
}
renderHP(engine, scale);
}
void Unit::attack(Unit& enemy)
......@@ -216,4 +217,38 @@ bool Unit::inRange(Unit& enemy)
return false;
}
void Unit::renderHP(Engine& engine, int scale)
{
Spritesheet* spritesheet = engine.getSpritesheet();
SDL_Texture* numbers = spritesheet->getNumberTexture();
int numberWidth = spritesheet->getNumberWidth();
int numberHeight = spritesheet->getNumberHeight();
int hp = ceil((double)m_health / 10);
SDL_Rect src;
src.x = hp % 10 * numberWidth;
src.y = 0;
src.w = numberWidth;
src.h = numberHeight;
SDL_Rect dest;
dest.x = (m_x * spritesheet->getTileWidth() + 8) * scale;
dest.y = (m_y * spritesheet->getTileHeight() + 12) * scale;
dest.w = numberWidth * scale;
dest.h = numberHeight * scale;
SDL_RenderCopy(engine.renderer(), numbers, &src, &dest);
if (hp == 10)
{
src.x = 8;
dest.x = (m_x * spritesheet->getTileWidth() + 1) * scale;
SDL_RenderCopy(engine.renderer(), numbers, &src, &dest);
}
}
} // namespace advanced_wars
\ No newline at end of file
......@@ -135,6 +135,8 @@ class Unit
Weapon m_primaryWeapon;
int m_ammo;
void renderHP(Engine& engine, int scale);
};
} // namespace advanced_wars
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment