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 :
et voici l'utilisation du 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 ; } };
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4private : std::multiset < IE* , Fonctor > _IE ;
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 :
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 ) ; } }
(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... ).
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 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 ) ; } }
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.
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 () ; } } }
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
Partager