Oui...Je m'étais planté...désolé
...En faisant un test en minimal, j'ai vu que ca plantait parce que tout bêtement, en appuyant sur une touche, il delete le même objet plusieurs fois...en utilisant un bool, pour le faire qu'une fois, ca plante plus...logique...
Vraiment idio...
dsl...
En revanche, il plantait toujours dés qu'il s'agissait d'un objet normal, utilisé dans les attributs d'une class. C'est d'ailleurs toujours un mystère pour moi...mais bon...tant que ca marche. Voici ma nouvelle version de l'objet qui plantait, mais marche bien maintenant depuis que j'ai remplacé EI m_EI par EI *m_EI...
D'ailleurs, pensez vous qu'il serait judicieux, d'en faire un pointeur Intelligent, ou pas forcément necessaire vu mon cas...(une utilisation assez simple )..?
voici l'objet avec les changements:
class CharbonPetit2
{
public:
CharbonPetit2();
~CharbonPetit2();
...
void recoitPtrAfficheur(boost::shared_ptr<Afficheur> ptr_afficheur);
void cree(string nom, sf::Texture *texture, int tailleImageL, int tailleImageH );
...
void initialise();
void rafraichi();
void detruit();
...
private:
...
boost::shared_ptr<Afficheur> m_ptr_afficheur;
sf::Texture *m_texture;
sf::Vertex m_vertex[4];
EI *m_EI;//ici au lieu de simplement m_EI
...
void CharbonPetit::cree(string nom, sf::Texture *texture, int tailleImageL, int tailleImageH)
{
...
m_texture = texture ;//du coup je doit mémoriser l'adresse de la texture...
...
}
void CharbonPetit::initialise()
{
m_vertex[0] = sf::Vector2f(m_x ,m_y );
m_vertex[1] = sf::Vector2f(m_x + m_tailleImageL ,m_y );
m_vertex[2] = sf::Vector2f(m_x + m_tailleImageL ,m_y + m_tailleImageH);
m_vertex[3] = sf::Vector2f(m_x ,m_y + m_tailleImageH);
m_vertex[0].texCoords = sf::Vector2f(0 , 0);
m_vertex[1].texCoords = sf::Vector2f(m_tailleImageL , 0);
m_vertex[2].texCoords = sf::Vector2f(m_tailleImageL , m_tailleImageH);
m_vertex[3].texCoords = sf::Vector2f(0 , m_tailleImageH);
m_EI = new EI;
m_EI->recoitTexture(m_texture);
m_EI->recoitVertex(m_vertex);
m_EI->recoitZ(m_y + m_colY);
m_ptr_afficheur->recoitEI(m_EI); //j'envoi l'adresse a mon afficheur.
m_collisionSimple.deplace(m_x, m_y);
m_collisionSimpleDeclencheur.deplace(m_x, m_y);
}
//il tourne avec ses collisions etc...
...
void CharbonPetit2::detruit()
{
m_ptr_afficheur->efface(m_EI);// je l'enlève du std::multiset de l'afficheur pour plus qu'il soit pris
//en compte dans l'affichage.
delete m_EI;//puis il est détruit sans broncher...
}
et le tout en vector:
for(vector<CharbonPetit2>::iterator it = m_charbonPetit2.begin() ; it != m_charbonPetit2.end() ; it++)
{
it->rafraichi();
if(!it->renvoiVie())
{
it->detruit();
m_charbonPetit2.erase(it); //cette fois ci ca marche sans pb...
}
}
plus aucun problème, ca marche sans planter, et je peux en faire tourner plus de 25 000 sans que ca rame...(au dessus j'ai test qu'avec 1000000, mais la il est pas d'accord
mais j'ai pas besoin d'autant
)
voila...Merci pour votre aide, et désolé pour l'erreur