Tes reflexions me travail (en bien) mais j'ai encore du mal avec le principe du "C'est l'objet qui demande sa destruction et non le stage qui demande à l'objet si il peut le détruire." =p
Pour situer le fonctionnement, les objets sont déclarés sous forme de list de pointeur sur objet, donc j'ai plein de std::list<GameObject *>, je créer les objets via des operateur new.
En ce moment, lorsque je fais l'opération de suppression des objets, à chaque tour de boucle de jeu, je fais un bon gros "for" pour parcourir toute ma list d'objet, je repère les objets dont la condition de fin de vie est vrai, je "delete" ces objets et je remove leur pointeur de la liste.
J'utilise une fonction objet qui fais l'operation de test + le delete, puis je la passe dans une fonction "remove_if" pour retirer le pointeur, ça donne quelque chose comme ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 void Stage::Clean(std::list<GameObject *> &list, Game &game) { struct test { sf::View &view; test(sf::View &view) : view(view){} bool operator()(GameObject *shot) { bool condition = shot->EOL(view); if(condition) { delete shot; } return condition; } }; list.erase(std::remove_if(list.begin(), list.end(), test(game_view)), list.end()); }
Donc toi, ce que tu me proposes dans ton post, ça serai plutôt de faire une fonction
Et j'appel cette fonction dans la fonction qui recalcule les données de mon objet à chaque tour de boucle
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 void Stage::Remove(GameObject *object) { // On delete l'objet delete object; // On retire le pointeur de la list list.remove(...); }
Ce qui me chiffonne, c'est qu'en faisant ça, mon programme ne va pas aimer de choper un delete sur l'objet dont la fonction est en cours d'exécution... As-tu une idée précise en tête, voir un exemple (existant ou non) à me montrer que je puisse appliquer cette idée?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 void GameObject::Calculate() { if(EOL()) // On vérifie la condition de fin de vie { // Si fin de vie my_stage->Remove(this); // On efface } else { // Sinon x += speed; // On effectue les calculs de coordonnées ... } }
Partager