J'ai plusieurs erreurs liées aux destructeurs, que je ne comprends pas et qui font crasher mon jeu quand je le quitte.
Premièrement, quand je détruit mes ennemis dans le jeu (en tirant dessus donc), j'utilise cette fonction :
void Population::checkPopulation()
{
if(this->haveEnnemyInProgress())
{
list<Enemy*>::iterator lit(m_enemies.begin());
for(; lit!=m_enemies.end();)
{
if((*lit)->isDead())
{
this->explode(*lit);
lit = m_enemies.erase(lit);
}
else
{
lit++;
}
}
}
}
La méthode à l'air de bien fonctionner, les ennemis sont détruits au fur et à mesure.
Par contre dans le destructeur de ma classe, je ne peux pas implémenter cette solution (adaptée, sans le isDead()) car il me sort l'erreur :
G:\projets\cours\jeu\population.cpp|22|error: no matching function for call to 'std::list<Enemy*, std::allocator<Enemy*> >::erase(std::_List_const_iterator<Enemy*>&)'|
e:\utilitaires\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\list.tcc|107|note: candidates are: std::_List_iterator<_Tp> std::list<_Tp, _Alloc>::erase(std::_List_iterator<_Tp>) [with _Tp = Enemy*, _Alloc = std::allocator<Enemy*>]|
J'ai un autre problème lors de la fin de partie, le jeu crash lors de la suppression des images et des animations, voilà un exemple pour des images:
Dans le code ci-dessous, listStar est rempli de copies de spriteStar.
Background::Background(RenderWindow &app, int speed, int SCREEN_WIDTH, int SCREEN_HEIGHT): m_app(app), m_speed(speed), m_width(SCREEN_WIDTH), m_height(SCREEN_HEIGHT)
{
static Image* imageStar = new Image;
if(!(imageStar->LoadFromFile("images/projectile.png")))
{
cerr << "Impossible de charger : projectile.png" << endl;
}
else
{
spriteStar.SetImage(*imageStar);
}
static Image* imagePlanet = new Image;
if(!(imagePlanet->LoadFromFile("images/projectile2.png")))
{
cerr << "Impossible de charger : projectile.png" << endl;
}
else
{
spritePlanet.SetImage(*imagePlanet);
}
this->init();
}
Background::~Background()
{
listStar.clear();
cout << "background1" << endl;
if(imageStar!=NULL)
delete imageStar;
if(imagePlanet!=NULL)
delete imagePlanet;
cout << "background2" << endl;
}
EDIT : Je voudrais surtout savoir si je m'y prends mal avec les delete, si il faut utiliser une autre méthode, ou si ça vient juste de l'odre de supression qui est pas bon (essayer de suprimer un élément qui n'existe plus par exemple) ? La vérification avec le if(var!=NULL) est-elle correcte ?