From ad7cab00c22687961220586fc5c136422238fd1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matt=C3=A9o=20Delabre?= Date: Sun, 17 Apr 2016 23:10:30 +0200 Subject: [PATCH] =?UTF-8?q?Animation=20du=20bloc=20gravit=C3=A9=20une=20fo?= =?UTF-8?q?is=20utilis=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/gravity_block.hpp | 6 ++++-- include/utility.hpp | 12 ++++++++++++ res/textures/gravity_block_east.tga | Bin 2543 -> 1268 bytes res/textures/gravity_block_north.tga | Bin 2459 -> 1186 bytes res/textures/gravity_block_south.tga | Bin 2487 -> 1212 bytes res/textures/gravity_block_west.tga | Bin 2543 -> 1268 bytes src/block.cpp | 6 +++--- src/editor.cpp | 9 +++++++++ src/gravity_block.cpp | 27 ++++++++++++++++++++++----- src/level.cpp | 19 +++++-------------- src/utility.cpp | 15 +++++++++++++++ 11 files changed, 70 insertions(+), 24 deletions(-) create mode 100644 include/utility.hpp create mode 100644 src/utility.cpp 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 9943dc451d72459fc8408f8d86eb286cd3901be6..42108fe769dac1b3deae6bb24834caca8f82e4e1 100644 GIT binary patch literal 1268 zcmb`HJ1;~*6vxMNQKJ@?iWM6LDhgr~A@MFyNE9L=qEND|S2WlU;1MJWEs2s)N;IMo zTj)GLg5Uq(-r^FsFv;)CIWu$r_sq<>*SRA1-C{20$_kDZhBYf%obyGLz7~piF>XmF z0>zMq7s$XZyumf}E@EueB>jj2TEN%iE+wOP=^c--4~Zluo{Oo63AlqD$kB`|fJVqb z{%`&k6V5Wp#wh{G&uRy8jWod(tSn$G+cWx61+;+g%VjaG-1l`(Ce?!T1kv!>ZL-|i zo0W^U`U>rlqxQ*E(d$T0;Q|g}7$SDg+ITfofLg#ev9SM> be_Z#O4!@Z0zSjOkPok@{X0R>M(He6fD}ssG literal 2543 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 N+5;co`~t~8oV@@5 diff --git a/res/textures/gravity_block_south.tga b/res/textures/gravity_block_south.tga index 7fe699bcd51429af3ae771b484ca346f509d0452..a9a530beecf7a539a99f6ca745714ed04f2d1d5a 100644 GIT binary patch literal 1212 zcmeH{J5Iwu5Qf(fB$6se-~yy@l>*5PL5j$WM-WX~`UEb35aJbDo(*zV$U!$f+su+ z6C64)laTSQH8CfcoUkN337^7_kmG>e;ZR%n5MG7lOBr*FnG=e_yU-D41xAn#yWG!U z2M;`p7c&1TB7#*BZBi;8vIUz}%{D-veMiU(bqdvGRfD;aF{c;~L+=V-!WhQ^>^Nk) zdOBA!K^sH|9z{^6)`5%*yB0F{dOEiJwr}VRqT^g9X&0s(GTo$4py_AQXdTH|N20>y zZ9iBk$hR(xi0`r@*IL?vEB)AEpj9vJuqWy+cJQ+f*(+9)2)~nU#>uu6B}q1ZeXe>F zvajDubc%$12%Vd;utY^YBoBm5m5%7&!iduOgc%8>fd)b8`kL7f5rG>*PoT2Q3$`7G dnoa*Y{>%}RvAN!^Y*ja^&Bo&PO0`xgnIFkPiCX{w literal 2487 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 == 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; +}