Bonjour. Récemment j'ai appris comment créer une classe AnimatedSprite(), et j'arrive à m'en servir. Cependant je fais face à un problème : j'utilise cette classe pour animer plusieurs tiles d'une tilemap, et ils s'animent correctement, mais de façon non-synchronisée. Je me suis dis que c'est surement à cause d'un décalage entre les horloges de chaque tile qui se joue à la microseconde, j'ai donc essayé un autre méthode comme par exemple utiliser une seule horloge qui serait crée soit dans la classe qui contient mon tableau de tiles soit dans la classe tile() en static, et calculer quelle animation utiliser dans le update() en se basant sur le moment où à eu lieu le dernier changement de texture, mais cela revient à donner le même résultat.
Y a t'il une technique pour synchroniser plusieurs AnimatedSprite() ?
AccurateTimeDelay delay;
if( delay.hasTimeElapsed( 120 ) ) //Si 120 mis se sont écoulées
{
//Faire des actions ici;
//Puis on synchronise les délais avec :
//(seulement si le temps s'est écoulé, donc si on est rentré dans le if ci-dessus)
delay.joinTimePoints();
}
Si vraiment tu ne trouve pas pour le fichier 'cpp' , demande des explications et je t'aiderai plus que ça.
Comment je peux faire pour calculer le temps écoulé depuis la dernière mise a jour alors que je ne suis pas dans l'objet AnimatedSprite() lors du calcul puisque le résultat va en paramètre de la méthode update ?
Je crois que je vais m'arrêter là pour aujourd'hui mais je vais surement réessayer demain.
Je vais poster du code si ça peut servir. Je sais bien que mon organisation est loin d'être au point pour le moment donc n'hésitez pas à faire des remarque !
CroixMultiCouleur.h // Ce tile contient un AnimatedSprite() qui représente des croix de différentes couleur avec une intervalle de 200 milliseconde (par défaut dans AnimatedSprite.h).
#pragma once
#include "Tile.h"
class CroixMultiCouleur :
public Tile
{
public:
CroixMultiCouleur(int nbX, int nbY, TilesAutour tilesAutour);
void update();
void draw(sf::RenderWindow &fenetre);
~CroixMultiCouleur();
private:
AnimatedSprite sprite;
};
CroixMultiCouleur.cpp
#include "CroixMultiCouleur.h"
CroixMultiCouleur::CroixMultiCouleur(int nbX, int nbY, TilesAutour tilesAutour) : Tile(nbX, nbY, tilesAutour)
{
sprite.setTexture(texture);
sprite.AjouterTextureRect(sf::IntRect(0, 0, 30, 30));
sprite.AjouterTextureRect(sf::IntRect(30, 0, 30, 30));
sprite.AjouterTextureRect(sf::IntRect(60, 0, 30, 30));
sprite.AjouterTextureRect(sf::IntRect(90, 0, 30, 30));
sprite.AjouterTextureRect(sf::IntRect(120, 0, 30, 30));
sprite.AjouterTextureRect(sf::IntRect(150, 0, 30, 30));
sprite.AjouterTextureRect(sf::IntRect(180, 0, 30, 30));
sprite.AjouterTextureRect(sf::IntRect(210, 0, 30, 30));
sprite.setPosition(position);
}
void CroixMultiCouleur::update()
{
sprite.update(sf::Time(/*valeur en sf::millisecond qui corespond au temps passé depuis la dernière MAJ*/));
}
void CroixMultiCouleur::draw(sf::RenderWindow &fenetre)
{
fenetre.draw(sprite);
}
CroixMultiCouleur::~CroixMultiCouleur()
{
}
Objet.h
#pragma once
#include "SFML/Graphics.hpp"
#include "AnimatedSprite.h"
class Objet
{
public:
Objet();
~Objet();
protected:
sf::Vector2f position;
sf::Texture texture;
sf::Sprite sprite;
};
Voilà ! Désolé pour le long post mais j'ai préféré en poster trop que pas assez. Je n'ai pas vraiment réussi à implémenter ce que vous me proposez mais je reviendrai vite sur cette page pour savoir si mon code ressemble a quelque chose selon vos avis !
A plus !
- Edité par ChiarenzaMattéo 17 juillet 2019 à 0:56:17
Comme l'a dit Raynobrak, tu utilise une classe qui mesure le temps pour à la fois tes tiles de maps et tes animated sprites (pour cela il faut que tu sorte ce qui mesure le temps des tes classes Tiles et Animated Sprites. Avec un code proche de :
if( delayMesure.hasTimeElapsed( 100 ) ) //Si tu veux 100 ms par exemple
{
Tile.update();
AnimatedSprite.update();
delayMesure.joinTimePoints();
}
Tu peux implémenter la classe de mesure du temps avec l'header <chrono> ( c++11 requis ) ou bien avec sf::Time et sf::Clock.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Mon site web de jeux SDL2 entre autres : https://www.ant01.fr
Tu peux implémenter la classe de mesure du temps avec l'header <chrono> ( c++11 requis ) ou bien avec sf::Time et sf::Clock.
Mon site web de jeux SDL2 entre autres : https://www.ant01.fr