Forum de la communauté SFML

Aide => Graphique => Discussion démarrée par: zetarov le Septembre 16, 2017, 01:53:13 pm

Titre: Texture qui disparaît de certains Sprites de manière aléatoire.
Posté par: zetarov le Septembre 16, 2017, 01:53:13 pm
Bonjour à tous,
Je fais appel à vous car je bloque sur un problème depuis 3 jours quand je veux faire mon petit jeu  :-\
Je m'explique, les classes qui nous intéressent ici sont Player, BombManager, Bomb, Animation et AnimationCollection.

Soit le problème est le suivant : quand je crée des nouvelles Bomb, un changement se produit parfois aléatoirement dans les premières bombes généralement qui fait que l'adresse de la Texture stocké par le Sprite des Animation des bombes change voir passe à null ! (Ce qui a aussi l'air de faire crasher le jeu quand j'essaie de les dessiner mais même sans essayer de les dessiner ce phénomène ce produit).
Voici ce que je vois par exemple quand j'affiche l'adresse des textures utilisés par les Sprite:
Ici on a perdu la texture lors de la pose de la 3ème bombe mais ça peut arriver plus tôt (2 bombes minimum) ou plus tard !

Et finalement voici le code dont je me sers pour ajouter de nouvelles bombes :
bool Player::putBomb(TileMap& tileMap,
  BombManager& bombManager,
  sf::Time currentTime)
{
  Animation* bombAnimation(bombManager.getBombAnimation("basic"));
  /* Cette animation est stockée dans AnimationCollection qui est dans BombManager
      hors ceux-ci ne sont pas détruits avant la fin du programme */

  if(bombAnimation == nullptr)
    return false;
  bombs.push_back(Bomb(currentTime, *bombAnimation, bombPos, sf::seconds(3.0), 1)); //Le constructeur de Bombe fait bien une COPIE de bombAnimation Bomb::Bomb(sf::Time, Animation, sf::Vector2f, sf::Time, unsigned int)
  bombManager.addBomb(&bombs.back());
  return true;
}

Je vous ai épargné le positionnement de la bombe (bombPos) et tout ça car ce n'est pas le problème !

Merci d'avoir lu mon pavé et en espérant que vous puissiez m'aider !  :)
Titre: Re: Texture qui disparaît de certains Sprites de manière aléatoire.
Posté par: Laurent le Septembre 16, 2017, 07:36:28 pm
Le problème c'est qu'il y a beaucoup de classes impliquées, soit tu nous montres tout et tu attends que quelqu'un de courageux examine ça, soit tu essayes de trouver un code minimal qui reproduit le problème (sans toutes ces classes).

Utilise ton debugger, fais des exécutions pas-à-pas, affiche les données intermédiaires, etc. pour retracer ce qu'il se passe.
Titre: Re: Texture qui disparaît de certains Sprites de manière aléatoire.
Posté par: zetarov le Septembre 17, 2017, 02:32:58 pm
Je vais essayer avec le debuggueur ! Va falloir que je déniche un bon tuto ! Sinon deux dernières questions :
Titre: Re: Texture qui disparaît de certains Sprites de manière aléatoire.
Posté par: Laurent le Septembre 17, 2017, 03:24:25 pm
Citer
Est-ce que copier un Sprite peut d'une manière ou d'une autre modifier le pointeur de sa Texture ?
Non.

Citer
De même est-ce qu'une mauvaise utilisation de Sprite::setTextureRect pourrait provoquer ça ?
Non.

On continue les devinettes ? :P

Citer
Je vais essayer avec le debuggueur !
Oui. On ne peut pas programmer sérieusement sans debugger. Ca évite de s'éparpiller dans des questions complètement aléatoires comme celles que tu te poses ;)

Citer
Va falloir que je déniche un bon tuto !
Pour commencer c'est vraiment très simple : dans ton IDE tu lances l'appli avec le debugger (c'est simplement un autre bouton ou un autre raccourci que "lancer sans debugger"), et quand ça crash, il te dit à quelle ligne de quel fichier, il te dit quoi, il te dit éventuellement pourquoi, et il te permet de remonter les appels de fonction qui ont mené jusqu'à l'endroit du crash (parfois ça crash dans une fonction d'une DLL obscure, il faut remonter un peu pour retomber dans ton code).
Titre: Re: Texture qui disparaît de certains Sprites de manière aléatoire.
Posté par: zetarov le Septembre 17, 2017, 06:25:29 pm
Oui mais ça plantait dans Draw puisque la Texture était absente et je n'arrivais pas à remonter à quand la Texture disparaissait !
Mais merci quand même de ton aide !

J'ai finalement trouvé mon problème, il venait d'une mauvaise utilisation de std::vector sur lequel j'utilisais des pointeurs. Sauf que vector réarrange ses données quand on en ajoute de nouvelles ; ce qui faisait que je perdais les informations sur les Bombes (dont évidemment la texture).

PS: Je n'utilise pas d'IDE   ::)