[Projet la relance] 20 Gui avec irrlicht questions et conception

SEB Message lu Posté le 25 Août 2011 à 21:00 Bulle
Avatar de SEB
Membre Evolué

Messages : 554
GCPoints : 103313
Salut a tous, etant donné que nous approchons du moment ou nous allons bientot pouvoir mettre en place le premier squelette de la flowchart et donc par la meme occasion les première ébauches du systeme de menu principal etc... Il y a plusieurs questions qui se posent par rapport à l'utilisation de la gui Irrlicht.

Il serait assez simple de se dire que dans un premier temps nous pouvons l'utiliser de manière brute en la considérant comme un placeholder (avec sa couleur grise toute moche) et d'y revenir plus tard. Le problème c'est que je ne voudrais pas que nous nous retrouvions embetté par la suite pour diverses raison de customisation. J'ai fait quelque petites recherches non exaustives et il semblerait qu'il est possible de surcharger la classe IGUISkin pour modifier un peu le système de rendu de la GUI, cependant il parrait difficile (pas impossible mais disons chiant) d'avoir une customisation 'par élément'.

De même par rapport au fait d'intégrer des 'vidéos' style vidéo d'intro etc... cela n'existe pas de facon native dans irrlicht, il y a des contributeurs qui ont produit des librairies annexes permettant de faire cela mais ce n'est pas forcément très propre ni portable.

Voila j'aimerais vos avis sur ces questions et savoir si vous conaissez des pistes pour tout ceci.
NextGine : 3D games engine
Nombre de lignes actuel : 77683
Darktib Message lu Posté le 25 Août 2011 à 23:02 Bulle
Avatar de Darktib
Membre Ultime

Messages : 4017
GCPoints : 347288
Pour les vidéos, y a plusieurs libs sur le forum officiel, je m'en souviens d'une utilisant ogg theora qui avait l'air plutôt bien.

Pour les guis, il y a MyGUI (pas sur que ça fonctionne bien avec Irrlicht), et surtout, CEGUI (la configuration des includes/libs/etc... est chiante, mais je pense que ça vaut le coût).
SEB Message lu Posté le 27 Août 2011 à 11:21 Bulle
Avatar de SEB
Membre Evolué

Messages : 554
GCPoints : 103313
1 Concernant les Videos

Si il s'agit d'utiliser ogg theora, l'implémentation est quasi directe, donc pas vraiment besoin de lib. Mais le probleme c'est que cela nous limiterais au formats ogg (ca ne me dérange pas trop mais il faut déja etre cappable d'en produire). Ces formats par contre ont certains inconvénients il me semble, par exemple, le premier d'entre eux est le fait qu'il n'est pas vraiment possible de 'sauter' des frames de la vidéo. Ce que je veux dire c'est que si jamais je veux passer de la frame '30' à la frame '45' du fichier vidéo, il faut absolument que je décompresse toutes les images '31, 32, 33, 34, 35.... 44' et de même pour rembobiner. (Cela pose probleme dans le cadre d'un jeu qui ramerai déja.... imaginons que la vidéo soit enregistrée en 25 frame seconde et que le frame rate soit de 20 (mauvais framerate mais c'est pour l'exemple) dans ce cas il va y avoir régulierement des frames à 'skiper' dans la vidéo.. et donc cela va faire encore plus ramer le jeu qui rame déja...

Ceci étant dit, a mon humble avis, concrètement nous n'aurons au maximum qu'une seule vidéo dans nôtre jeu, et ce sera au début (si même nous en faisons une) donc la probabilité que cela rame est très faible. Et donc dans ce contexte le format ogv pourrait être suffisamment adapté.

2 Concernant la GUI

J'ai un peu regardé les deux lib dont tu parlai (je connaissais CEGUI car nous avions voulu l'utiliser lors d'un projet tutoré à la FAC et j'en avais un très mauvais souvenir) mais je ne connaissais pas MyGUI. Ce qui m’ennuie beaucoup avec ces deux lib dans un premier temps c'est qu'elles sont beaucoup trop complète. Je m'explique concrètement on peut quasiment les utiliser tel que elles seront capable de faire de la gui sans rien d'autre qu'une micro implémentation OpenGL ou autre... elles implémentes des tas de choses comme des plugins, des chargeurs d'image au niveau customisation 'individuelle' n'offrent à priori pas beaucoup plus de liberté que la gui irrlicht. Quand au cas spécifique de CEGUI franchement ca me semble 1 pas franchement intuitif, 2 cela oblige a avoir un fichier de gui a la sauce CEGUI, 3 pour ce qui est des dépendances il y en a des dizaines... (certes fournies mais bon...) et c'est assez carrément chiant à configurer.

Donc ce que je peu proposer (si vous etes un peu de mon avis) c'est de fournir mon système de gui totalement indépendant et sans aucune dépendance externe dont le seul rôle est de gérer les widgets et les organisations/connections entre eux. Comme je l'ai expliqué dans le sujet sur NextGine, il est ensuite possible d'implémenter indépendamment des version en Win32 X11 CoCoa ou bien Irrlicht. (Les implementations doivent en gros transférer les messages de souris/clavier au système de gui et fournir une implémentation pour le dessin des widgets)

NextGine : 3D games engine
Nombre de lignes actuel : 77683
Darktib Message lu Posté le 27 Août 2011 à 16:25 Bulle
Avatar de Darktib
Membre Ultime

Messages : 4017
GCPoints : 347288
Pourquoi pas... Ton système utilise-t-il des signaux et des slots (ça pourrait booster le développement)?

edit: tant qu'à faire... est-il possible avec ton système d'avoir une GUI '3D', c'est à dire que les différents widgets sont rendus sur des quads par forcément parallèles à l'écran ?
Dernière édition le 27 Août 2011 à 16:26
SEB Message lu Posté le 27 Août 2011 à 16:56 Bulle
Avatar de SEB
Membre Evolué

Messages : 554
GCPoints : 103313
On ne peut pas qualifier cela exactement de signaux et de slots à la façon Qt car tout se fait au runtime (pas de connexion de slot au compil time), ensuite on peut effectivement envoyer des messages d'un élément à un autre mais tout cela se fait sous forme de chaine de caractères (ou presque) Pour donner un exemple on pourrait avoir quelque chose du genre.

Code : C++
 
class MyReceiver : public GuiMessageHandler {
  public :
    MyReceiver() : GuiMessageHandler() {}
 
    ~MyReceiver() {}
 
    /**
    * Gere les messages
    */
    bool onMessage(const GuiMessage::MessType type, const std::string& messageName) {
        if( type == SGUI::GuiMessage::MESS_BUTTON_CLICK && messageName == "play" ) {
           ... do something to play
        }
        return false;
    }
};
 
SGUI::Widget* monbut = new SGUI::WidgetPushButton("Click me !");
monbut->setPosition(200,200);
 
MyReceiver* monRec = new MyReceiver();
 
GuiControler::instance()->connect(monbut,SGUI::GuiMessage::MESS_BUTTON_CLICK,monRec,"play");
 
 


sachant qu'il est possible de créer des type de messages 'user' et également d’émettre des messages.

Mais c'est un vieux système et si nécessaire je peux lui apporter quelques modifications sans problèmes.

Ensuite pour ce qui est de gérer un rendu 3D des widgets, ce n'est pas tres complique en soi. Il suffit d'écrire un 'GuiPainter' qui dessine des quads au lieu de faire des draw2DRectangle par exemple. Ou bien encore de faire un render to texture (un peu gourmand tout de meme) mais cela peut encore plus loin permettre d'avoir de la gui de n'importe quel forme.

NextGine : 3D games engine
Nombre de lignes actuel : 77683
Darktib Message lu Posté le 27 Août 2011 à 17:02 Bulle
Avatar de Darktib
Membre Ultime

Messages : 4017
GCPoints : 347288
Si c'est possible de rendre en 3D, je suis pour. Pour les signaux et les slots, ceux de Qt ne sont résolus qu'en runtime, peut être qu'avec boost::signals on pourrait facilement avoir des signaux/slots... (et dans ce cas, autant les étendre à plus que la gui)
SEB Message lu Posté le 28 Août 2011 à 15:25 Bulle
Avatar de SEB
Membre Evolué

Messages : 554
GCPoints : 103313
Bon je n'ai pas encore travaillé pour voir ce qui pourrait etre fait au niveaux signaux (bien que je ne sois pas très très fan de les utiliser dans le système de jeu en soi, si on doit mettre en place un système de callback/trigger je préfère qu'on le fasse nous même parceque ce sera surement plus intuitifs pour tous).

Mais j'ai tenté d'intégrer ma lib pour lui fournir un rendu irrlicht. Voila un binaire de ce que j'ai fait dans la branche que j'ai créé pour ce test.

(Cliquez sur "Quit" pour sortir)

http://www.mediafire.com/?6weg5jokpa0wja5

Ce n'est pas transcendant mais c pour montrer que l'intégration avec irrlicht est déja réussie. Donc pas de problème particulier à prévoir.
NextGine : 3D games engine
Nombre de lignes actuel : 77683
Darktib Message lu Posté le 28 Août 2011 à 18:50 Bulle
Avatar de Darktib
Membre Ultime

Messages : 4017
GCPoints : 347288
Ca fait plutôt propre, c'est bien ;)
Au niveau du code, qu'est-ce que ça donne ?
SEB Message lu Posté le 28 Août 2011 à 20:20 Bulle
Avatar de SEB
Membre Evolué

Messages : 554
GCPoints : 103313
Au niveau du code il y a plusieurs aspects :

1 le coté 'integration au module de rendu'

Dans la methode init du RenderModule apres avoir créé le contexte irrlicht on retrouve les deux lignes suivantes :
Code : C++
 
SGUI::GuiController::create(false);
SGUI::GuiController::instance()->setDevice(new SguiIrrlichtFinalDevice(_device));
 


Puis dans la methode update du RenderModule :
Code : C++
 
if( _device->getSceneManager() )
{
	_device->getSceneManager()->drawAll();
}
 
SGUI::GuiController::instance()->update();
 



2 On peut voir la classe 'SguiIrrlichtFinalDevice' qui est la partie un peu plus compliquée car elle consiste à implémenter SGUI pour irrlicht.

Il y a en gros trois aspects dans cette classe,
- La création des élément spécifiquement pour irrlicht (widget, images, etc...)
- L'interception des évènements souris clavier (si utilisé par le gui)
- Le dessin des éléments (un painter quoi)

3 Il y a l'utilisation des widgets qui la par exemple ressemble à ca :

Code : C++
 
SGUI::Widget* widL = 0;
int h = 100;
 
widL = new SGUI::WidgetPushButton("Play");
widL->resize(120,24);
widL->setPosition(100,h);
h += 24;
 
widL = new SGUI::WidgetPushButton("Option");
widL->resize(120,24);
widL->setPosition(100,h);
h += 24;
 
widL = new SGUI::WidgetPushButton("Credits");
widL->resize(120,24);
widL->setPosition(100,h);
h += 24;
 
widL = new SGUI::WidgetPushButton("Quit");
widL->resize(120,24);
widL->setPosition(100,h);
h += 24;
 
InternTest* it = new InternTest(this);
SGUI::GuiController::instance()->connect(widL,SGUI::GuiMessage::MESS_BUTTON_CLICK,it,"quit");
 


Chose que j'aurais pu faire avec un Layout mais je suis allé vite pour le test.

NextGine : 3D games engine
Nombre de lignes actuel : 77683
Répondre
GameCorp - Site d'apprentissage et d'entraide à la création de jeux vidéo.
XHTML Valid 1.1 - Page générée en 0.1012 secondes