Bonjour,
J'ai un souci pour le moins étrange :
std::vector<sf::Sprite> test;
test.push_back(sf::Sprite());
Ces 2 lignes devraient en théorie créer un vector et y ajouter un Sprite. Eh bien chez moi je me retrouve avec 272 fois le même Sprite (c'est le debugger qui me le dit) !
Si je fais une boucle pour ajouter 4 Sprites par exemple, alors je me retrouve avec 4x272 fois le même Sprite...
Si je créé 2 vecteurs différents et que j'ajoute un Sprite différent sur chacun d'entre eux, les Sprites des 2 vecteurs seront différents (mais identiques au sein d'un même vecteur).
Enfin, si je fais un vecteur de
pointeur de Sprites, tout se passe comme prévu (1 seul sf::Sprite* ajouté). De même, un vecteur de sf::Texture fonctionne correctement (sans même parler de pointeurs).
Je vous joins mon bout de code où ça coince. Ma classe personnelle SpriteManager a pour but de gérer des animations de sprites. On lui fournit un "spriteFile", c'est-à-dire une image contenant plusieurs sprites, et ma classe se charge d'afficher un certain sprite à un instant t. Les différents sprites affichés les uns après les autres forment une animation (un personnage qui bouge par exemple). SpriteManager fonctionnait très bien avec un seul spriteFile.
Désormais, je cherche à pouvoir utiliser plusieurs spriteFiles pour avoir plusieurs "couches". L'objectif est le même, mais on décomposera cette fois le personnage en une couche "pieds", puis "corps", puis "tête", ce qui permettra par exemple de ne pas afficher les pieds lorsqu'on est dans l'eau (sinon on marcherait sur l'eau !)
SpriteManager::SpriteManager(const std::vector<std::string> &pSpriteFiles, sf::Vector2u pSpriteSize,
unsigned int pDefaultMsecPerSprite)
: spriteFiles(pSpriteFiles), ... // autres initialisation de variables inutilisées dans le constructeur
{
if (spriteFiles.empty())
{
// méthode (dans un autre fichier) qui écrit simplement dans un fichier texte et sort du programme si le 2e paramètre est vrai.
error("SpriteManager::SpriteManager : pSpriteFiles est vide", true);
}
for (unsigned int i = 0; i < spriteFiles.size(); i++)
{
textures.push_back(sf::Texture());
if (!textures[i].loadFromFile(spriteFiles.at(i)))
{
error("impossible d'ouvrir le fichier " + spriteFiles.at(i));
}
textures[i].setSmooth(true);
sprites.push_back(sf::Sprite());
sprites[i].setTexture(textures.at(i));
sprites[i].setTextureRect(sf::IntRect(0, 0, spriteSize.x, spriteSize.y));
sprites[i].setOrigin(spriteSize.x / 2, spriteSize.y / 2);
}
positionLastSprite = textures.at(0).getSize().y - spriteSize.y;
std::vector<sf::Sprite> test;
test.push_back(sf::Sprite());
...
}
Les lignes
sprites.push_back(sf::Sprite()); et
test.push_back(sf::Sprite()); ont le même problème.
Le .h :
#ifndef SPRITE_MANAGER_H
#define SPRITE_MANAGER_H
#include <SFML/Graphics.hpp>
//----------------------------------------------------------------------------------------------------------------
// Rôle de la classe <SpriteManager>
// Gère et change le sprite lorsque c'est nécessaire. Permet également l'affichage du sprite.
//----------------------------------------------------------------------------------------------------------------
class SpriteManager : public sf::Drawable, public sf::Transformable
{
public:
//--------------------------------------------------------------------------------------- Constantes statiques
static const int DEFAULT_MSEC_PER_SPRITE = 20; // Temps d'affichage de chaque sprite par défaut (en msec)
static const int ALL = 0; // Pour indiquer combien de sprites doivent être pris en compte dans l'animation actuelle
//-------------------------------------------------------------------------------- Constructeurs - destructeur
SpriteManager(const std::string &pSpriteFile); // Un seul sprite : pas d'animation
SpriteManager(const std::vector<std::string> &pSpriteFiles, sf::Vector2u pSpriteSize,
unsigned int pDefaultMsecPerSprite = DEFAULT_MSEC_PER_SPRITE); // Plusieurs sprites : animation possible
SpriteManager(const SpriteManager &sm); // Constructeur de copie
virtual ~SpriteManager();
...
private:
std::vector<sf::Texture> textures;
std::vector<std::string> spriteFiles;
std::vector<sf::Sprite> sprites;
sf::Vector2u spriteSize; // Taille d'un sprite (en pixels)
bool uniqueSprite; // Indique s'il n'y a qu'un seul sprite : pas d'animation
...
};
#endif // SPRITE_MANAGER_H
Et je joins 2 petits screenshots pour illustrer mes propos.
Merci d'avance pour vos réponses !