Animation du bloc gravité une fois utilisé

This commit is contained in:
Mattéo Delabre 2016-04-17 23:10:30 +02:00
parent 89e1f0b30b
commit ad7cab00c2
11 changed files with 70 additions and 24 deletions

View File

@ -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

12
include/utility.hpp Normal file
View File

@ -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

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -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) {

View File

@ -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);
}

View File

@ -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) {

View File

@ -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

15
src/utility.cpp Normal file
View File

@ -0,0 +1,15 @@
#include "utility.hpp"
#include "manager.hpp"
#include <cmath>
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;
}