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 ? . 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 !