Animation du bloc gravité une fois utilisé
This commit is contained in:
parent
89e1f0b30b
commit
ad7cab00c2
|
@ -14,6 +14,8 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
GravityDirection gravity_direction;
|
GravityDirection gravity_direction;
|
||||||
|
sf::Sprite icon_sprite;
|
||||||
|
float opacity;
|
||||||
bool used;
|
bool used;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -38,9 +40,9 @@ public:
|
||||||
virtual Object::Ptr clone() const;
|
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
|
* Appelé lorsque le bloc de gravité est activé par un objet
|
||||||
|
|
|
@ -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.
|
@ -7,6 +7,9 @@
|
||||||
const unsigned int Block::TYPE_ID = 2;
|
const unsigned int Block::TYPE_ID = 2;
|
||||||
|
|
||||||
Block::Block() : Object() {
|
Block::Block() : Object() {
|
||||||
|
sprite.setOrigin(sf::Vector2f(23, 23));
|
||||||
|
select_sprite.setOrigin(sf::Vector2f(23, 23));
|
||||||
|
|
||||||
aabb = sf::FloatRect(
|
aabb = sf::FloatRect(
|
||||||
-Manager::GRID / 2,
|
-Manager::GRID / 2,
|
||||||
-Manager::GRID / 2,
|
-Manager::GRID / 2,
|
||||||
|
@ -45,10 +48,7 @@ void Block::prepareDraw(ResourceManager& resources) {
|
||||||
}
|
}
|
||||||
|
|
||||||
sprite.setTexture(resources.getTexture(texture_name));
|
sprite.setTexture(resources.getTexture(texture_name));
|
||||||
sprite.setOrigin(sf::Vector2f(23, 23));
|
|
||||||
|
|
||||||
select_sprite.setTexture(resources.getTexture("block_select.tga"));
|
select_sprite.setTexture(resources.getTexture("block_select.tga"));
|
||||||
select_sprite.setOrigin(sf::Vector2f(23, 23));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Block::draw(Level& level) {
|
void Block::draw(Level& level) {
|
||||||
|
|
|
@ -398,6 +398,15 @@ void Editor::removeObject(Object::Ptr object) {
|
||||||
selection.begin(), selection.end(), object
|
selection.begin(), selection.end(), object
|
||||||
), selection.end());
|
), 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);
|
Level::removeObject(object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,18 +1,22 @@
|
||||||
#include "resource_manager.hpp"
|
#include "manager.hpp"
|
||||||
|
#include "utility.hpp"
|
||||||
#include "gravity_block.hpp"
|
#include "gravity_block.hpp"
|
||||||
#include "game.hpp"
|
#include "game.hpp"
|
||||||
|
|
||||||
const unsigned int GravityBlock::TYPE_ID = 3;
|
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() {}
|
GravityBlock::~GravityBlock() {}
|
||||||
|
|
||||||
Object::Ptr GravityBlock::clone() const {
|
Object::Ptr GravityBlock::clone() const {
|
||||||
return Object::Ptr(new GravityBlock(*this));
|
return Object::Ptr(new GravityBlock(*this));
|
||||||
}
|
}
|
||||||
|
|
||||||
void GravityBlock::prepareDraw(ResourceManager& resources) {
|
void GravityBlock::draw(Level& level) {
|
||||||
Block::prepareDraw(resources);
|
// sélectionne le sprite d'icône
|
||||||
std::string texture_name = "gravity_block_";
|
std::string texture_name = "gravity_block_";
|
||||||
|
|
||||||
switch (gravity_direction) {
|
switch (gravity_direction) {
|
||||||
|
@ -33,7 +37,20 @@ void GravityBlock::prepareDraw(ResourceManager& resources) {
|
||||||
break;
|
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) {
|
void GravityBlock::activate(Game& game, Object::Ptr object) {
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#include "level.hpp"
|
#include "level.hpp"
|
||||||
#include "player.hpp"
|
#include "player.hpp"
|
||||||
#include "block.hpp"
|
#include "block.hpp"
|
||||||
|
#include "utility.hpp"
|
||||||
#include "gravity_block.hpp"
|
#include "gravity_block.hpp"
|
||||||
#include "switch_block.hpp"
|
#include "switch_block.hpp"
|
||||||
#include "finish_block.hpp"
|
#include "finish_block.hpp"
|
||||||
|
@ -285,15 +286,10 @@ void Level::draw() {
|
||||||
sf::Vector2u window_size = window.getSize();
|
sf::Vector2u window_size = window.getSize();
|
||||||
|
|
||||||
// animation de la rotation de la caméra
|
// animation de la rotation de la caméra
|
||||||
float goal = std::fmod((float) gravity_direction * 90, 360);
|
camera_angle = Utility::animateValue(
|
||||||
float diff = goal - camera_angle;
|
camera_angle, 5,
|
||||||
float speed = diff * Manager::FRAME_TIME.asSeconds() * 5;
|
std::fmod((float) gravity_direction * 90, 360)
|
||||||
|
);
|
||||||
if (std::abs(diff) < .05f) {
|
|
||||||
camera_angle = goal;
|
|
||||||
} else {
|
|
||||||
camera_angle += speed;
|
|
||||||
}
|
|
||||||
|
|
||||||
camera.setRotation(camera_angle + 180);
|
camera.setRotation(camera_angle + 180);
|
||||||
window.setView(camera);
|
window.setView(camera);
|
||||||
|
@ -497,11 +493,6 @@ void Level::removeObject(Object::Ptr object) {
|
||||||
players.erase(std::remove(
|
players.erase(std::remove(
|
||||||
players.begin(), players.end(), player
|
players.begin(), players.end(), player
|
||||||
), players.end());
|
), 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
|
// on supprime l'objet de la liste d'objets
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
Loading…
Reference in New Issue