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

Auteur Sujet: problème du carré blanc  (Lu 2822 fois)

0 Membres et 1 Invité sur ce sujet

destroyer

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
problème du carré blanc
« le: Décembre 22, 2017, 08:33:03 pm »
Bonjour,

je suis actuellement en train de coder un jeu de carte et je suis confronté au problème du carré blanc.
Dès que j'essaye d'afficher une carte, celle-ci est remplacée par un carré blanc
J'ai fais de nombreuses recherches et demandé a plusieurs personnes mais je n'ai toujours pas de solution.
Je ne vois pas a quel moment ma texture est détruite.

Voici le constructeur de ma classe :
Citer
Card::Card(std::string number, std::string symbol, std::string path_texture, State state) :
   m_number(number),
   m_symbol(symbol),
   m_state(state)
{
//On applique a la carte une valeur selon son symbole et son numéro
   if (number == "1" || number == "2" || number == "3" || number == "4" || number == "5" || number == "6" || number == "7" || number == "8" || number == "9" || number == "10") {
      m_value = std::stoi(number);
   }
   else if (number == "Valet" || number == "Dame" || number == "Roi") {
      if (number == "Roi" && symbol == "Pique") { m_value = 0; }
      else { m_value = 10; }

   }
   
   m_texture;
   m_sprite;

   if (!m_texture.loadFromFile("assets/deux-carreau.png")) {
      std::cout << "Texture de la carte non chargee" << std::endl;
   }
   m_sprite.setTexture(m_texture);
}

Voila. Je sais que je ne suis pas très bon, sachez que je suis ouvert a tous commentaire sur mon code.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re: problème du carré blanc
« Réponse #1 le: Décembre 22, 2017, 08:43:38 pm »
Le problème se situe probablement dans la façon dont tu gères/stockes tes instances de Card. Il y a souvent des copies non-voulues, et comme ta classe ne gère pas correctement la copie ni ne l'interdit... ça foire.
Laurent Gomila - SFML developer

destroyer

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
Re: problème du carré blanc
« Réponse #2 le: Décembre 22, 2017, 09:10:55 pm »
merci de ta réponse rapide mais je ne comprend pas vraiment ce que je devrai faire

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re: problème du carré blanc
« Réponse #3 le: Décembre 23, 2017, 09:18:55 am »
Nous montrer le code qui utilise la classe Card.
Laurent Gomila - SFML developer

destroyer

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
Re: problème du carré blanc
« Réponse #4 le: Décembre 23, 2017, 01:30:47 pm »
Voila le code

La génération du paquet de carte :
Citer
std::vector<Card> Card::generatePack() {
   std::vector<Card> cardArray;
   std::string actualSymbol("Pique");
   std::string normalNumber;

   

   std::string temp_path_texture = "assets/deux-carreau.png";
   
   

   for (int i = 1; i <= 13; i++) {
      normalNumber = convertNumberToString(i);
      cardArray.push_back(Card::Card(normalNumber, actualSymbol, temp_path_texture, State::verso));
   }

   actualSymbol = "Carreau";

   for (int j = 1; j <= 13; j++) {
      normalNumber = convertNumberToString(j);
      cardArray.push_back(Card::Card(normalNumber, actualSymbol, temp_path_texture, State::verso));
   }

   actualSymbol = "Trefle";

   for (int k = 1; k <= 13; k++) {
      normalNumber = convertNumberToString(k);
      cardArray.push_back(Card::Card(normalNumber, actualSymbol, temp_path_texture, State::verso));
   }

   actualSymbol = "Coeur";

   for (int l = 1; l <= 13; l++) {
      normalNumber = convertNumberToString(l);
      cardArray.push_back(Card::Card(normalNumber, actualSymbol, temp_path_texture, State::verso));
   }

   return cardArray;
}

Le morceau de code concerné dans ma fonction qui gère les events :
Citer
if (this->pioche.getSprite().getGlobalBounds().contains(event.mouseButton.x,event.mouseButton.y)) {      
            cardPiochee = this->pioche.takeACard();
            spriteCard = cardPiochee.getSprite();
            std::cout << cardPiochee.presentation() << std::endl;
            afficherCard = true;
         }

L'affichage :
Citer
if (afficherCard) {
      this->window.draw(sprite);
   }

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re: problème du carré blanc
« Réponse #5 le: Décembre 23, 2017, 02:16:12 pm »
Il y a des copies de Card partout dans ton code. Or comme je te l'ai dit, ta classe ne gère pas correctement la copie.
Laurent Gomila - SFML developer

destroyer

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
Re: problème du carré blanc
« Réponse #6 le: Décembre 23, 2017, 02:30:46 pm »
donc qu'est ce que je devrai mettre comme code pour mieux gérer ça ?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re: problème du carré blanc
« Réponse #7 le: Décembre 23, 2017, 09:27:24 pm »
L'idéal serait que maintenant que tu connais la cause du problème, tu réflechisses toi-même à une solution ;) je ne pense pas que ce serait beaucoup t'aider que de te pondre le code qui résoud ton problème, et ce ne serait même sûrement pas adapté une fois collé dans le reste de ton programme.

Si on récapitule, on a vu que copier des Card était problématique, puisque quand tu vas dupliquer une instance tu vas copier son sprite et sa texture ; or la copie du sprite va toujours pointer vers la texture originale, pas vers la nouvelle -- d'où le carré blanc.

Plusieurs solutions s'offrent donc à toi :
- implémente la copie correctement dans ta classe Card (constructeur par copie et opérateur d'affectation) ; mais est-ce que cela a du sens de copier les cartes ? est-ce qu'on peut avoir plusieurs rois de trèfle au même moment en mémoire ?
- interdit la copie (en marquant "deleted" le constructeur par copie et l'opérateur d'affectation, cf. Google si tu ne sais pas comment faire) et ensuite débrouille toi pour éviter les copies, par exemple en stockant des pointeurs sur des Card allouées dynamiquement ; mais est-ce que cela vaut le coup d'allouer dynamiquement toutes tes instances de Card et te trimballer des pointeurs, juste pour ça ?
- ne met pas la texture dans Card ; charge ta ou tes textures (mais une seule c'est mieux) à un endroit qui n'a rien à voir avec les instances de Card, et passe simplement une référence à celles-ci pour qu'elles puissent utiliser la texture

A toi de te comprendre ces différents scénarios et te faire ton opinion ;)
Laurent Gomila - SFML developer

destroyer

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
Re: problème du carré blanc
« Réponse #8 le: Décembre 23, 2017, 11:52:17 pm »
ok, merci beaucoup je vais tester ça

destroyer

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
Re: problème du carré blanc
« Réponse #9 le: Avril 22, 2018, 04:58:34 pm »
Donc après avoir revu mon code, j'ai fini par créer mes textures dès le début du jeux, dans une classe game qui gère l'ensemble de ma partie et je les ai stockés dans une map. Chaque carte lors de sa création allant piocher dans cette map sa texture.
Merci beaucoup pour m'avoir aidé
PS : Je suis désolé de ma réponse tardive