std::multiset et foncteur
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:
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:
1 2 3 4
|
private :
std::multiset < IE* , Fonctor > _IE ; |
Code:
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:
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:
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 ;)