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

Auteur Sujet: sf::Texture et sf::Sprite probleme carré blanc  (Lu 3180 fois)

0 Membres et 1 Invité sur ce sujet

duduf15

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
sf::Texture et sf::Sprite probleme carré blanc
« le: Janvier 10, 2015, 03:38:43 am »
Bonjour,

Pour une application graphique j'ai eu besoin d'utiliser SFML pour la première fois et j'ai été confronté à un problème, lorsque je charge une texture et que je l'ajoute à un sprite, au moment de l’affichage, le sprite mesure bien la bonne taille mais il est blanc.

Je me suis renseigné sur internet et j'ai vu que beaucoup de personnes avaient ce problème, j'ai trouvé la solution d'utiliser un pointeur pour la texture, mais maintenant je suis embêté avec ce pointeur. Par la suite j'utilise un tableau de Piece et à un moment je dois échanger deux pièces du tableau et à cause du pointeur les sprites ne s'echange pas correctement.

Donc je souhaite m’éviter de traîner des pointeurs en attribut de classe, je voulais savoir s'il existait une autre solution, j'ai regardé sur beaucoup de forum mais je n'ai pas trouvé de réponse à mon problème.

Je ne comprends pas pourquoi la texture devient null alors qu'elle est un attribut de Piece, pourquoi est elle détruite alors que la pièce existe encore ?

Voici un code très simplifié pour illustrer mes propos.

class Piece
{
private:
    int             m_forme;
    sf::Texture     m_texture;
    sf::Sprite      m_sprite;
 
public:
    Piece(int forme);
};

Piece::Piece(int forme){
    std::string cheminPiece;
    switch (forme){
        case 0: {
            cheminPiece = "Images/image1.png";
            break;
        }
        case 1: {
              cheminPiece = "Images/image2.png";
              break;
        }  
    }
    m_texture.loadFromFile(cheminPiece);
    m_sprite.setTexture(m_texture);    
}
 

merci :)

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : sf::Texture et sf::Sprite probleme carré blanc
« Réponse #1 le: Janvier 10, 2015, 04:34:57 am »
Tout est OK dans ce bout de code.
Avec ton tableau tu dois faire des copies de tes instances de Piece, et ça invalide les textures.
Au passage, si tu as x Piece, tu vas charger x fois la même texture. Tu devrais ne charger qu'une seule fois chaque texture différente et la donner à tes sprites. D'ailleurs si tu charges et stockes tes textures ailleurs, tu n'auras plus ce problème puisque la vie de tes textures ne sera pas reliée à celle de tes Piece.

duduf15

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : sf::Texture et sf::Sprite probleme carré blanc
« Réponse #2 le: Janvier 10, 2015, 01:39:00 pm »
merci de ta réponse !
Je déclare mon tableau et ensuite dans une fonction d'initialisation je fais ça sur toutes les cases du tableau : grille[X][Y] = Piece(......)
Mais par défaut le tableau est initialisé avec des objets de type Piece(), le constructeur vide ? si c'est bien le cas que dois-je mettre dans mon constructeur vide ? directement la création de la texture ?

Et sinon je ne vois pas trop comment je pourrais faire pour n'avoir qu'une seule texture de chaque type, juste créer un tableau avec mes 2 textures et aller chercher la bonne quand il faut ? mais ce tableau serait passé au constructeur de Piece ? du coup ma texture ne serait plus un attribut de ma classe Piece.

edit 16h16 :

Bon alors j'ai fait l'initialisation de ma texture dans mon constructeur vide, cela fonctionne mais le problème c'est que maintenant je ne peux plus passer des paramètres indispensables au choix de la texture, comme la forme ou encore d'autres paramètres.
donc je ne pense pas que cela soit la solution...

Merci
« Modifié: Janvier 10, 2015, 04:19:58 pm par duduf15 »

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Re : sf::Texture et sf::Sprite probleme carré blanc
« Réponse #3 le: Janvier 12, 2015, 10:29:51 am »
Ton problème est pourtant simple. le mieux est de faire en sorte que tes pièce ne s'occupe pas de stocker la texture.

Citation de: pseudo code
class Application
{
 public:
   ...
 enum textures
   {
     pieceA,
     pieceB,
     pieceC,
     ...
     textureCount
   };

 sf::Texture & getTexture( textures type )
 {
   return mGameTexture[type];
 }
 private:
 
 

   sf::Texture   mGameTexture[textureCount];

};


class Piece : public sf::Sprite
{
  public:
 
}

Application myGame;
... // charge tes textures...
Piece A( myGame.getTexture( Application::PieceA ) );

duduf15

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : sf::Texture et sf::Sprite probleme carré blanc
« Réponse #4 le: Janvier 12, 2015, 06:20:13 pm »
Merci pour ta réponse, j'ai essayé de faire un truc du genre, mais toujours le même problème, voila mon code si tu veux jeter un oeil :https://github.com/duduf15/diamand

merci :)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : sf::Texture et sf::Sprite probleme carré blanc
« Réponse #5 le: Janvier 12, 2015, 07:05:57 pm »
Tu fais des copies de ta texture partout ! Utilise des références constantes (const sf::Texture&) pour passer et stocker tes textures.
Laurent Gomila - SFML developer

duduf15

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : sf::Texture et sf::Sprite probleme carré blanc
« Réponse #6 le: Janvier 12, 2015, 08:43:55 pm »
Désolé, je suis débutant...
problème résolu, merci à toutes les personnes qui ont participé :)
« Modifié: Janvier 12, 2015, 08:45:26 pm par duduf15 »