Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Différence entre constructeur de copie et opérateur = avec des sprites/textures  (Lu 1407 fois)

0 Membres et 1 Invité sur ce sujet

Greak

  • Newbie
  • *
  • Messages: 12
    • Voir le profil
Bonjour,

J'ai un soucis que je n'arrive pas à comprendre (encore un !).
J'ai une classe SpriteManager qui 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 !).

J'ai aussi une classe Entity qui possède un attribut SpriteManager. En mettant exactement le même code dans le constructeur de copie du SpriteManager ou dans operator=, je n'obtiens pas le même résultat...

Constructeur de copie :
(click to show/hide)

Opérateur = :
(click to show/hide)

Et ci-dessous la liste des attributs avec leur type :
(click to show/hide)

Dans le constructeur d'Entity, si j'utilise l'opérateur =, tout va bien :
Entity::Entity(const std::vector<std::string> &spriteFiles, sf::Vector2u spriteSize, unsigned int msecPerSprite)
    : sprite(spriteFiles, spriteSize, msecPerSprite), speed(0), vectorSpeed(0,0), phi(0)
{
    sprite = SpriteManager(spriteFiles, spriteSize, msecPerSprite);
}
L'initialisation en utilisant le constructeur de SpriteManager après les ":" ne sert à rien ici. C'est juste qu'il n'y a pas de constructeur sans paramètre, mais c'est bien le "sprite = ..." qui m'intéresse.

Si par contre j'appelle le constructeur de copie, ça ne fonctionne plus tout à fait (et idem si j'appelle simplement le constructeur, comme je l'avais fait dans l'exemple précédent) :
Entity::Entity(const std::vector<std::string> &spriteFiles, sf::Vector2u spriteSize, unsigned int msecPerSprite)
    : sprite(SpriteManager(spriteFiles, spriteSize, msecPerSprite)), speed(0), vectorSpeed(0,0), phi(0)
{}
J'ai alors certaines couches de sprite qui s'affichent et s'animent correctement (les 2 dernières), et d'autres qui sont remplacées par des rectangles blancs (les 2 premières, il y en a 4 dans mon cas). Je ne comprends pas où est la différence. Alors je veux bien supposer que mon constructeur "classique" ne fonctionne pas, mais dans ce cas-là pourquoi ça fonctionne sur l'opérateur = (et pas sur le constructeur de copie qui est identique) ?

Merci par avance pour vos réponses ! :)
« Modifié: Avril 27, 2016, 01:05:08 pm par Greak »