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

Auteur Sujet: Texture qui disparaît de certains Sprites de manière aléatoire.  (Lu 2138 fois)

0 Membres et 1 Invité sur ce sujet

zetarov

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
Texture qui disparaît de certains Sprites de manière aléatoire.
« 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.
  • AnimationCollection gère les Animations du programme qui sont simplement des sprites animés. L'intérêt d'AnimationCollection est de stocker des Animations qui utilisent la même Texture.
  • Animation donc est un sprite animé, ai-je besoin d'en dire plus ?  ;D. Son rôle est de décaler le TextureRect du sprite en fonction du temps. Bref j'ai testé dans un mini-programme à part Animation et AnimationCollection et ça marche !
  • Bomb est un objet du jeu qui contient une Animation et d'autres informations inutiles ici pour mon problème.
  • Player est un objet dessiné représentant le joueur mais qui stocke aussi des Bomb quand il les pose. C'est cet objet qui les créé. Je vous montre le code juste après !
  • BombManager gère les bombes posées par les joueurs car il contient un vector de pointeur vers celle-ci. Ca non plus ne pose pas de problème.

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:
  • 1 Bombe :
    0x7ffcce6ed818
  • 2 Bombes :
    0x7ffcce6ed818
    0x7ffcce6ed818
  • 3 Bombes :
    0
    0x7ffcce6ed818
    0x7ffcce6ed818
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 !  :)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re: Texture qui disparaît de certains Sprites de manière aléatoire.
« Réponse #1 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.
Laurent Gomila - SFML developer

zetarov

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
Re: Texture qui disparaît de certains Sprites de manière aléatoire.
« Réponse #2 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 :
  • Est-ce que copier un Sprite peut d'une manière ou d'une autre modifier le pointeur de sa Texture ? (Il me semble que non mais bon).
  • De même est-ce qu'une mauvaise utilisation de Sprite::setTextureRect pourrait provoquer ça ?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re: Texture qui disparaît de certains Sprites de manière aléatoire.
« Réponse #3 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).
Laurent Gomila - SFML developer

zetarov

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
Re: Texture qui disparaît de certains Sprites de manière aléatoire.
« Réponse #4 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   ::)