diff --git a/include/gravity_block.hpp b/include/gravity_block.hpp index e6c3013..27378a0 100644 --- a/include/gravity_block.hpp +++ b/include/gravity_block.hpp @@ -14,6 +14,8 @@ public: private: GravityDirection gravity_direction; + sf::Sprite icon_sprite; + float opacity; bool used; protected: @@ -38,9 +40,9 @@ public: virtual Object::Ptr clone() const; /** - * Prépare les textures avant le dessin du bloc + * Dessin du bloc dans la fenêtre donnée */ - virtual void prepareDraw(ResourceManager& resources); + virtual void draw(Level& level); /** * Appelé lorsque le bloc de gravité est activé par un objet diff --git a/include/utility.hpp b/include/utility.hpp new file mode 100644 index 0000000..8bb4e25 --- /dev/null +++ b/include/utility.hpp @@ -0,0 +1,12 @@ +#ifndef __SKIZZLE_UTILITY_HPP__ +#define __SKIZZLE_UTILITY_HPP__ + +namespace Utility { + /** + * Permet d'animer la valeur donnée vers la valeur cible + * avec la vitesse donnée + */ + float animateValue(float current, float speed, float goal); +} + +#endif diff --git a/res/textures/gravity_block_east.tga b/res/textures/gravity_block_east.tga index 9943dc4..42108fe 100644 Binary files a/res/textures/gravity_block_east.tga and b/res/textures/gravity_block_east.tga differ diff --git a/res/textures/gravity_block_north.tga b/res/textures/gravity_block_north.tga index f2f1cff..b09c9ae 100644 Binary files a/res/textures/gravity_block_north.tga and b/res/textures/gravity_block_north.tga differ diff --git a/res/textures/gravity_block_south.tga b/res/textures/gravity_block_south.tga index 7fe699b..a9a530b 100644 Binary files a/res/textures/gravity_block_south.tga and b/res/textures/gravity_block_south.tga differ diff --git a/res/textures/gravity_block_west.tga b/res/textures/gravity_block_west.tga index b205f2c..551ec4c 100644 Binary files a/res/textures/gravity_block_west.tga and b/res/textures/gravity_block_west.tga differ diff --git a/src/block.cpp b/src/block.cpp index 13acec6..87e4584 100644 --- a/src/block.cpp +++ b/src/block.cpp @@ -7,6 +7,9 @@ const unsigned int Block::TYPE_ID = 2; Block::Block() : Object() { + sprite.setOrigin(sf::Vector2f(23, 23)); + select_sprite.setOrigin(sf::Vector2f(23, 23)); + aabb = sf::FloatRect( -Manager::GRID / 2, -Manager::GRID / 2, @@ -45,10 +48,7 @@ void Block::prepareDraw(ResourceManager& resources) { } sprite.setTexture(resources.getTexture(texture_name)); - sprite.setOrigin(sf::Vector2f(23, 23)); - select_sprite.setTexture(resources.getTexture("block_select.tga")); - select_sprite.setOrigin(sf::Vector2f(23, 23)); } void Block::draw(Level& level) { diff --git a/src/editor.cpp b/src/editor.cpp index d9f628c..7e39a6e 100644 --- a/src/editor.cpp +++ b/src/editor.cpp @@ -398,6 +398,15 @@ void Editor::removeObject(Object::Ptr object) { selection.begin(), selection.end(), object ), selection.end()); + // si c'était un joueur, il faut renuméroter + // les autres pour plus de convenance + if (object->getTypeId() == Player::TYPE_ID) { + // on réattribue les numéros de joueurs + for (unsigned int i = 0; i < getPlayers().size(); i++) { + getPlayers()[i]->setPlayerNumber(i); + } + } + Level::removeObject(object); } diff --git a/src/gravity_block.cpp b/src/gravity_block.cpp index f0cc5d3..65acda7 100644 --- a/src/gravity_block.cpp +++ b/src/gravity_block.cpp @@ -1,18 +1,22 @@ -#include "resource_manager.hpp" +#include "manager.hpp" +#include "utility.hpp" #include "gravity_block.hpp" #include "game.hpp" const unsigned int GravityBlock::TYPE_ID = 3; -GravityBlock::GravityBlock() : Block(), used(false) {} +GravityBlock::GravityBlock() : Block(), opacity(255), used(false) { + icon_sprite.setOrigin(sf::Vector2f(23, 23)); +} + GravityBlock::~GravityBlock() {} Object::Ptr GravityBlock::clone() const { return Object::Ptr(new GravityBlock(*this)); } -void GravityBlock::prepareDraw(ResourceManager& resources) { - Block::prepareDraw(resources); +void GravityBlock::draw(Level& level) { + // sélectionne le sprite d'icône std::string texture_name = "gravity_block_"; switch (gravity_direction) { @@ -33,7 +37,20 @@ void GravityBlock::prepareDraw(ResourceManager& resources) { break; } - sprite.setTexture(resources.getTexture(texture_name + ".tga")); + // on dessine le bloc normal + Block::draw(level); + + // on anime l'opacité de l'icône + opacity = Utility::animateValue(opacity, 2, used ? 0 : 255); + icon_sprite.setColor(sf::Color(255, 255, 255, opacity)); + + // on dessine l'icône + icon_sprite.setTexture(level.getResourceManager().getTexture( + texture_name + ".tga" + )); + + icon_sprite.setPosition(getPosition()); + level.getWindow().draw(icon_sprite); } void GravityBlock::activate(Game& game, Object::Ptr object) { diff --git a/src/level.cpp b/src/level.cpp index ae27ae7..242f957 100644 --- a/src/level.cpp +++ b/src/level.cpp @@ -2,6 +2,7 @@ #include "level.hpp" #include "player.hpp" #include "block.hpp" +#include "utility.hpp" #include "gravity_block.hpp" #include "switch_block.hpp" #include "finish_block.hpp" @@ -285,15 +286,10 @@ void Level::draw() { sf::Vector2u window_size = window.getSize(); // animation de la rotation de la caméra - float goal = std::fmod((float) gravity_direction * 90, 360); - float diff = goal - camera_angle; - float speed = diff * Manager::FRAME_TIME.asSeconds() * 5; - - if (std::abs(diff) < .05f) { - camera_angle = goal; - } else { - camera_angle += speed; - } + camera_angle = Utility::animateValue( + camera_angle, 5, + std::fmod((float) gravity_direction * 90, 360) + ); camera.setRotation(camera_angle + 180); window.setView(camera); @@ -497,11 +493,6 @@ void Level::removeObject(Object::Ptr object) { players.erase(std::remove( players.begin(), players.end(), player ), players.end()); - - // on réattribue les numéros de joueurs - for (unsigned int i = 0; i < players.size(); i++) { - players[i]->setPlayerNumber(i); - } } // on supprime l'objet de la liste d'objets diff --git a/src/utility.cpp b/src/utility.cpp new file mode 100644 index 0000000..401722e --- /dev/null +++ b/src/utility.cpp @@ -0,0 +1,15 @@ +#include "utility.hpp" +#include "manager.hpp" +#include + +float Utility::animateValue(float current, float speed, float goal) { + float gap = goal - current; + float diff = gap * Manager::FRAME_TIME.asSeconds() * speed; + + // si on est très proches de la fin, on termine + if (std::abs(gap) < .05f) { + return goal; + } + + return current + diff; +}