Forum de la communauté SFML
Aide => Graphique => Discussion démarrée par: destroyer 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 :
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.
-
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.
-
merci de ta réponse rapide mais je ne comprend pas vraiment ce que je devrai faire
-
Nous montrer le code qui utilise la classe Card.
-
Voila le code
La génération du paquet de carte :
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 :
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 :
if (afficherCard) {
this->window.draw(sprite);
}
-
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.
-
donc qu'est ce que je devrai mettre comme code pour mieux gérer ça ?
-
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 ;)
-
ok, merci beaucoup je vais tester ça
-
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