Bonjour ( re ).

J'ai un petit pb avec un tri d'image. J'utilise multiset pour classer les images en fonction d'un z order, et d'un foncteur.
Ca marche qu'à moitié : sans raison apparente, l'ordre se met de temps en temps à être mauvais.

voici ma class qui est utilisé dans le multiset :

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
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 
 
class IE : public sf::Drawable
{
 
friend struct Fonctor;
 
public :
 
    void setTexture ( const sf::Texture *texture ) ;
    void setVertex( sf::Vertex vertex[4]) ;
    void setZ ( float z ) ;
 
    void draw ( sf::RenderWindow &window ) ;
 
protected :
 
    virtual void draw ( sf::RenderTarget& target , sf::RenderStates states ) const
    {
            states.texture = _texture ;
            target.draw ( _vertex , 4 , sf::Quads , states ) ;
    }
 
    const sf::Texture                                       *_texture ;
    sf::Vertex                                              _vertex[4] ;
    float                                                   _z ;
 
};
 
struct Fonctor
{
 
   bool operator() ( const IE* one , const IE* two ) const
   {
        return one -> _z < two -> _z ;
   }
 
};
et voici l'utilisation du multiset :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
private :
 
    std::multiset < IE* , Fonctor >                                 _IE ;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
 
void System::print ( sf::RenderWindow* window )
{
    window -> setView( _view ) ;
    for ( auto& it : _IE )
    {
        window -> draw ( *it ) ;
    }
}
j'utilise des pointeurs afin que chaque objet puisse gérer directement ses IEs. Un objet mobile doit par contre réinsérer a chaque fois son IE pour qu'elle se range correctement, afin de se positionner devant ou derrière ses camarades IEs de la bonne façon. cela donne ceci :
(sachant que ma class IE_Word est une IE_Entity qui contient en public l'IE et toutes les informations nécessaire a sa bonne gestion : l'animation, son positionnement par rapport à l'Object ect... ).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
 
void Graphics::reload()
{
    for ( auto& it : _IE_Word )
    {
        it._z = *_y + it._shiftPosition.y + it._z ;  //_y est un pointeur vers le _y de l'objet contenu dans le _physics de l'objet.
        it._IE.setZ ( it._z ) ;
        _system -> clean ( &it._IE ) ;
        _system -> add ( &it._IE ) ;
    }
}
et voici ma fonction clean qui détruit le ptr du multiset ( ça vient peut être de là ).

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 System::clean( IE* ie )
{
 
    for ( std::multiset < IE* > :: iterator it = _IE.begin () ; it != _IE.end() ; it ++ )
    {
        if ( ie == *it )
        {
            _IE.erase ( it ) ;
            it = _IE.begin () ;
        }
    }
 
}
Mes thermes utilisés ne sont probablement pas des plus académique, mais j'espère qu'ils sont suffisamment clair pour être compréhensible.
Si vous avez des commentaires, reflexions sur cette mise en place en terme de programmation, je suis toujours preneur.

Merci si vous pouvez m'aider