#0 

24-11-2008 13:23:23

Dragonblood
Abonné
Date d'inscription: 20-11-2008
Messages: 110

Salut

comment est défini et aussi comment définir soi meme, qu'un objet 2d est en avant plan ou arriere plan par rapport a un autre ?

Hors ligne


#1 

24-11-2008 13:25:48

Aranoth
Abonné
Lieu: Toulouse
Date d'inscription: 25-09-2006
Messages: 242
Site web

C'est l'ordre avec lequel tu dessines.

A chaque fois que tu dessines un objet 2D, il est dessiné par dessus les autres

Hors ligne


#2 

24-11-2008 14:50:22

Dragonblood
Abonné
Date d'inscription: 20-11-2008
Messages: 110

oui je sais mais il n'y a pas un moyen de modifier sans redessiner ? il y a une méthode qui s'appelle bringToFront(). Y a un rapport ou non ?

Dernière modification par Dragonblood (24-11-2008 14:53:47)

Hors ligne


#3 

24-11-2008 15:16:47

hardcpp
Abonné
Date d'inscription: 26-04-2008
Messages: 229

effectivement tu peut utiliser bringToFront() sur les element que tu veux mettre en premier plan en laissant lelement choisie en arriere

Hors ligne


#4 

24-11-2008 15:34:08

Dragonblood
Abonné
Date d'inscription: 20-11-2008
Messages: 110

Arf non c'est pas bon bringToFront n'agit que sur les enfants de l'image...

Hors ligne


#5 

24-11-2008 15:35:31

hardcpp
Abonné
Date d'inscription: 26-04-2008
Messages: 229

sinon tu detrui l'objet et tu le recrée
x->remove();
x = env->addXXXX

Hors ligne


#6 

24-11-2008 18:45:42

Dragonblood
Abonné
Date d'inscription: 20-11-2008
Messages: 110

ouais c'est ce que je vais faire

parcontre mon image à des enfants et j'aimerais contenir ces enfants dans une list (ben en fait j'ai pas le choix y a que comme ca que je peux faire)

par contre je n'y connais rien aux liste

donc je crée une liste qui s'appelle listeChild et qui sera une liste contenant des IGUIELEMENT.

Code:

 list<IGUIElement*> listeChild  ;
 listeChild=_guiElement->getChildren();
 cout<<"listeChild"<<&listeChild.begin()<<endl;

Je crée une variable de type Iterator appelé I pour contenir le premier élément de la liste (avec la méthode Begin).

Code:

irr::core::list<IGUIElement*>::Iterator I() ;
I= listeChild.begin();

mais la il me renvoie une erreur ...

Quelqu'un connait bien les listes ?

Hors ligne


#7 

24-11-2008 19:15:50

hardcpp
Abonné
Date d'inscription: 26-04-2008
Messages: 229

sinon utilise les file

Code:

#include <irr/irrlicht.h>
#include <queue>
using namespace std;


int main()
{
    queue<ISceneNode*> balle;
    //Pour ajouter une balle
    ISceneNode* toAdd= ......
    balle.push(toAdd);
    //Pour récupéré le premier élément ajouter
    ISceneNode* toRecup = bale.front();
    //Pour effacer le premier élément
    balle.pop();
    //Pour avoir la taille de la file
    bale.size();
}

ATTENTION
Si on fait .pop alors que la file et vide le programe plante toujours t'ester l'existence d'element avec .empty() qui renvoie un boolean

Dernière modification par pspmy (24-11-2008 19:16:08)

Hors ligne


#8 

24-11-2008 19:26:50

Aranoth
Abonné
Lieu: Toulouse
Date d'inscription: 25-09-2006
Messages: 242
Site web

oui je sais mais il n'y a pas un moyen de modifier sans redessiner ?


Sachant que tout est redessiné plus de 60x par seconde, ce que tu dis est un peu bizarre...

il y a une méthode qui s'appelle bringToFront(). Y a un rapport ou non ?


Dans ce cas précise que tu utilises le module gui, car "images" c'est super vague, et ça fait surtout référence à draw2DImage :
http://irrlicht.sourceforge.net/docu/cl … r.html#a18

Hors ligne


#9 

24-11-2008 21:04:36

Dragonblood
Abonné
Date d'inscription: 20-11-2008
Messages: 110

Sachant que tout est redessiné plus de 60x par seconde, ce que tu dis est un peu bizarre...


Ce n'est pas le fait de redessiner qui me dérange mais d'utiliser la commande remove() et de reconstruire l'objet ensuite. Parce que quand je détruit l'objet je détruit aussi ses enfants et je dois reconstruire l'objet et ses enfants donc voila c'est pour ca surtout.


Dans ce cas précise que tu utilises le module gui, car "images" c'est super vague, et ça fait surtout référence à draw2DImage :


Non c'est une IGUIImage

sinon utilise les file


Code:
#include <irr/irrlicht.h>
#include <queue>
using namespace std;

Code:

int main()
{
    queue<ISceneNode*> balle;
    //Pour ajouter une balle
    ISceneNode* toAdd= ......
    balle.push(toAdd);
    //Pour récupéré le premier élément ajouter
    ISceneNode* toRecup = bale.front();
    //Pour effacer le premier élément
    balle.pop();
    //Pour avoir la taille de la file
    bale.size();
}

ATTENTION
Si on fait .pop alors que la file et vide le programe plante toujours t'ester l'existence d'element avec .empty() qui renvoie un boolean


Merci. Je connais deja un peu les pile et les files mais la ou j'avais du mal c'était pour l'utilisation de la classe Iterator et pour récuper la valeur de la méthode begin.

bon finalement j'ai trouvé pour ceux que ca interesse:

Code:

irr::core::list< IGUIElement* >::Iterator I = listeChild.begin();
cout<<"Valeur numéro 1:"<<&I<<endl;

voila merci pour les réponse rapide c'est cool.
J'vai surment me coucher vu l'heure (je suis à la Réunion donc il est tard) mais a mon avis on se revera demain lol

++

Dernière modification par Dragonblood (24-11-2008 21:09:10)

Hors ligne


#10 

26-11-2008 13:07:31

Dragonblood
Abonné
Date d'inscription: 20-11-2008
Messages: 110

bon voila la suite de l'épisode précédent.

J'ai créé ma liste qui contient tout les enfant de ma gui avec la méthode getChildren()


Code:

list<IGUIElement*> listeChild;  // je créé la liste
listeChild=_guiElement->getChildren(); // la liste contient tout les enfants de _guiElement
u32 listeChildsize=listeChild.getSize(); //la taille de la liste
list< IGUIElement* >::Iterator premier = listeChild.begin();  // le premier enfant

jusque la c'est bon maintenant je veux détruire les enfants:

Code:

if (listeChildsize!=0)     // si la liste n'est pas vide. Autrement dit s'il y a toujours des enfants
 {
_guiElement->removeChild(*premier);   // Je détruit le premier enfant

}

En fait le code au dessus marche aussi. (ben alors pourquoi tu nous casse les c... alors ?)
J'aimerais pouvoir accéder au méthode des enfants de la gui (qui sont aussi des gui)

par exemple:

Code:

if (listeChildsize!=0)     // si la liste n'est pas vide. Autrement dit s'il y a toujours des enfants
 {
  premier->remove();   // Ici je veux manipuler directement l'enfant

}

Et ben la ca ne marche pas (et c'est normal d'ailleurs). Le compilo me dit en gros que Premier est un Iterator et pas un gui donc il n'a pas accés à la méthode remove() et toutes les autres d'ailleurs.  Donc ben la comment je fais pour que Premier fasse référence à une enfant est que je puisse avoir accés à ses méthodes (de l'enfant hein) ?

++

Hors ligne


#11 

26-11-2008 17:10:17

Dragonblood
Abonné
Date d'inscription: 20-11-2008
Messages: 110

bon allez je me répond à moi meme. Il suffit de mettre des parenthèse pour que ca marche donc:

(*premier)->remove();   // Ici je veux manipuler directement l'enfant


A++

Hors ligne


#12 

29-11-2008 09:42:45

Dragonblood
Abonné
Date d'inscription: 20-11-2008
Messages: 110

Re ben pour ceux que ca interesse j'ai trouvé une méthode encore plus simple pour réger l'avant et l'arriere plan d'une gui.

Il faut bien la détruire avec remove mais il ne faut pas la redessiner en refaissant  guiEnv->addimage. C'est tout bête en fait.
Il suffit de sauvegarder sa gui dans un fichier texte et de la reloader.

Code:

 const c8 *  guiFile="guiFile.txt"; // je créer un fichier texte qui s'appelle guiFile.txt
 guiEnv->saveGUI  ( guiFile, m_guiElement); //je sauvegarde ma gui dans le fichier texte

Ce fichier génére un xml  (malgré l'extension txt que j'ai donné en haut) et il sauvegarde toutes les infos de ma gui: sa position, sa taille, s'il est visible et meme ses enfants.


Je n'ai plus qu'a faire

Code:

 m_guiElement->remove(); //je détruit ma gui 
 guiEnv->loadGUI(guiFile);  // je la reload et elle conserve tous ses paramètre d'avant sa déstruction

Ainsi ma gui qui était en arriere plan et en avant plan. C'est une sorte de Focus. voila c'est super simple en faite.

Moi qui au départ je voulais récuperer les enfant dans une liste et les réafficher un a un en récupérant leur position, etc, leur ITexture et compagnie ben la ca le fait automatiquement.

voila j'espère que ca peut interesser quelqu'un meme si c'est tout con finalement..

++

Dernière modification par Dragonblood (29-11-2008 09:45:27)

Hors ligne


#13 

29-11-2008 09:49:17

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

Merci, en effet la méthode ne sautais pas aux yeux au départ. Cool que tu arrives à tes fin wink


Force et sagesse...

Hors ligne


#14 

29-11-2008 10:16:25

Dragonblood
Abonné
Date d'inscription: 20-11-2008
Messages: 110

wink

Hors ligne


#15 

19-12-2008 09:45:23

Dragonblood
Abonné
Date d'inscription: 20-11-2008
Messages: 110

Bon je déterre ce post pour dire qu'au passage à Irrlicht 1.5 j'ai eu quelque prob et cette fonction ne marche plus trés bien.

Mais j'ai touvé encore mieux lol il y a ce qu'on appelle le RootGuiElement. C'est un GUIELEMENT qui est le parent de tout les gui sur la scène. Il est appelé a chaque fois que l'on créé un GUIELEMENT mais sans que l'utilisateur ne le sache lol. A chaque GUIELEMENT crée il est automatiquement enfant du RootGUIELEMENT qui conserve la liste de tous ses enfants.

Alors donc pour gérer l'arriere plan et l'avant plan de votre gui il faut tout simplement récupérer ce GUIROOT et utiliser la méthode BringToFront (mettre en avant en français).

donc

Code:

IGUIElement* guiRoot=guiEnv->getRootGUIElement( ) ;
guiRoot->bringToFront(Ma_guiElement);

J'ai appris l'existence de ca en lisant le tuto de Kevin Leonhart  à cette endroit la


http://www.siteduzero.com/tutoriel-3-56 … -bete.html

En fait il existe le meme systeme mais pour le SceneManager également

Dernière modification par Dragonblood (19-12-2008 09:46:39)

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
883 membres
1429 sujets
11121 messages
Dernier membre inscrit: Saidov17
55 invités en ligne
Aucun membre connecté
RSS Feed