Bonjours a tous !
Mon jeu commençant a se développer, je souhaite réaliser un éditeur (pour simplifier le placement d'objet, la gestion des évents, des ressources, des personnages ...).
Pour cela j'aimerais utiliser Qt, une library que j'aime beaucoup de par sa simplicité. J'ai donc essayé d'intégrer Irrlicht dans une fenêtre Qt.
Le seul poste traitant de ce sujet que j'ai pus trouver est celui ci.
Le compilo m'insulte de la manière suivante
Exception de première chance à 0x101517b7 dans game world editor.exe : 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x386db6fa. Exception non gérée à 0x101517b7 dans game world editor.exe : 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x386db6fa.
Et m'indique une erreur dans QIrrlicht.cpp a la ligne 12 ("driver = device->getVideoDriver();").
Et voici le code (la partie intéressante c'est surtout QIrrlicht (dernier fichier)) :
main.cpp
#include <QApplication> #include <QTranslator> #include <QLocale> #include <QLibraryInfo> #include "FenPrincipale.h" int main(int argc, char* argv[]) { QApplication app(argc, argv); FenPrincipale principale; principale.show(); return app.exec(); }
FenPrincipale.h
#ifndef HEADER_FENPRINCIPALE #define HEADER_FENPRINCIPALE #include <QtGui> #include "QIrrlicht.h" #include <irr/irrlicht.h> class FenPrincipale : public QMainWindow { Q_OBJECT public: FenPrincipale(); private slots: void enregistrer(); void gestionaireDeRessource(); void nouveau(); void ouvrir(); private: void ouvrirViaChemin(QString cheminFichier); QIrrlicht *espaceGraphique; irr::scene::IAnimatedMesh *room; irr::scene::ImeshSceneNode *Nroom; }; #endif
FenPrincipale.cpp
#include "FenPrincipale.h" FenPrincipale::FenPrincipale() { //------------------------------------------------------------------------------------------------------------ //---------------------------------------------BARRE-DE-MENUS------------------------------------------------- //------------------------------------------------------------------------------------------------------------ //------------------------------------------------FICHIER----------------------------------------------------- QMenu *menuFichier = menuBar()->addMenu("&Fichier"); QAction *actionNouveau = menuFichier->addAction("&Nouveau"); actionNouveau->setShortcut(QKeySequence("Ctrl+N")); actionNouveau->setIcon(QIcon("share\new.ico")); connect(actionNouveau, SIGNAL(triggered()), this, SLOT(nouveau())); QAction *actionOuvrir = menuFichier->addAction("&Ouvrir"); actionOuvrir->setShortcut(QKeySequence("Ctrl+O")); actionOuvrir->setIcon(QIcon("share\open.png")); connect(actionOuvrir, SIGNAL(triggered()), this, SLOT(ouvrir())); QAction *actionQuitter = menuFichier->addAction("&Enregistrer"); actionQuitter->setShortcut(QKeySequence("Ctrl+S")); actionQuitter->setIcon(QIcon("share\save.ico")); connect(actionQuitter, SIGNAL(triggered()), this, SLOT(enregistrer())); QAction *actionEnregistrer = menuFichier->addAction("&Quitter"); actionEnregistrer->setShortcut(QKeySequence("Ctrl+Q")); actionEnregistrer->setIcon(QIcon("share\quitter.ico")); connect(actionEnregistrer, SIGNAL(triggered()), qApp, SLOT(quit())); //-----------------------------------------------EDITION------------------------------------------------------ QMenu *menuEdition = menuBar()->addMenu("&Edition"); QAction *actionGestionnaireDeTache = menuEdition->addAction("&Gestionaire de Ressource"); actionGestionnaireDeTache->setShortcut(QKeySequence("F10")); actionGestionnaireDeTache->setIcon(QIcon("share\ressource.ico")); connect(actionGestionnaireDeTache, SIGNAL(triggered()), this, SLOT(gestionaireDeRessource())); //------------------------------------------------AIDE-------------------------------------------------------- QMenu *menuAide = menuBar()->addMenu("&Aide"); QAction *actionAboutQt = menuAide->addAction("&A propos de Qt"); actionAboutQt->setIcon(QIcon("share\qt.png")); connect(actionAboutQt, SIGNAL(triggered()), qApp, SLOT(aboutQt())); //------------------------------------------------------------------------------------------------------------ //--------------------------------------------BARRE-D-OUTILS-------------------------------------------------- //------------------------------------------------------------------------------------------------------------ QToolBar *toolBarFichier = addToolBar("Fichier"); toolBarFichier->addAction(actionNouveau); toolBarFichier->addAction(actionEnregistrer); toolBarFichier->addSeparator(); //------------------------------------------------------------------------------------------------------------ //--------------------------------------------ZONE-CENTRALE--------------------------------------------------- //------------------------------------------------------------------------------------------------------------ QWidget *zoneCentrale = new QWidget; QIrrlicht *espaceGraphique = new QIrrlicht(zoneCentrale); QGridLayout *layout = new QGridLayout; layout->addWidget(espaceGraphique, 0, 0); zoneCentrale->setLayout(layout); setCentralWidget(zoneCentrale); } void FenPrincipale::enregistrer() { } void FenPrincipale::gestionaireDeRessource() { } void FenPrincipale::nouveau() { } void FenPrincipale::ouvrir() { ouvrirViaChemin(QFileDialog::getOpenFileName(this, "Ouvrir un fichier", QString(), "Fichier .GWD(*.gwd)")); } void FenPrincipale::ouvrirViaChemin(QString cheminFichier) {/* FILE* fichier = NULL; int caractereActuel = 0; QString *contenuFichierGWD = new QString; fichier = fopen("test1.gwd", "r"); if (fichier != NULL) { // Boucle de lecture des caractères un à un do { caractereActuel = fgetc(fichier); // On lit le caractère contenuFichierGWD += caractereActuel ; } while (caractereActuel != EOF); // On continue tant que fgetc n'a pas retourné EOF (fin de fichier) fclose(fichier); }*/ /*QRegExp regexMapMesh ("#<mapMesh>(.+)</mapMesh>#isU"); QRegExp regexMapTexture ("#<mapTexture>(.+)</mapTexture>#isU"); contenuFichierGWD->contains (regexMapMesh); contenuFichierGWD->contains (regexMapTexture);*/ //room = espaceGraphique->getSceneManager()->getMesh("room.3ds"/*regexMapMesh.cap (1).toStdString().c_str()*/); Nroom = espaceGraphique->getSceneManager()->addMeshSceneNode(room->getMesh(0)); Nroom->setMaterialFlag(irr::video::EMF_LIGHTING, true); //Nroom->setMaterialTexture( 0, espaceGraphique->getDriver()->getTexture(regexMapTexture.cap (1)).toStdString().c_str() ); espaceGraphique->getSceneManager()->getMeshManipulator()->makePlanarTextureMapping(room->getMesh(0), 0.004); }
QIrrlicht.h
#ifndef QIRRLICHT_H #define QIRRLICHT_H #include <QtGui> #include <irr/irrlicht.h> class QIrrlicht : public QWidget { Q_OBJECT public: QIrrlicht(QWidget *parent = 0); ~QIrrlicht(); irr::video::IVideoDriver* getDriver(); irr::scene::ISceneManager* getSceneManager(); irr::gui::IGUIEnvironment* qetGui(); irr::IrrlichtDevice* getDevice(); private slots: void irrlichtMaj(); private: irr::video::IVideoDriver* driver; irr::scene::ISceneManager* sceneManager; irr::gui::IGUIEnvironment* gui; irr::IrrlichtDevice* device; irr::scene::ICameraSceneNode *camera; }; #endif // QIRRLICHT_H
QIrrlicht.cpp
#include "QIrrlicht.h" QIrrlicht::QIrrlicht(QWidget *parent) : QWidget(parent) { //Irrlicht setup irr::SIrrlichtCreationParameters parametres; parametres.WindowId = parent->winId(); parametres.DriverType = irr::video::EDT_OPENGL; device = createDeviceEx(parametres); driver = device->getVideoDriver(); sceneManager = device->getSceneManager(); //sceneManager->setAmbientLight(irr::video::SColorf(1.0, 1.0, 1.0,0.0)); gui = device->getGUIEnvironment(); gui->getSkin()->setFont(gui->getFont("ressources/images/interface/fontLucida.png")); //slot QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(irrlichtMaj())); timer->start(); camera = sceneManager->addCameraSceneNode (0, irr::core::vector3df(0,90,0), irr::core::vector3df(0,90,0)); } QIrrlicht::~QIrrlicht() { } irr::video::IVideoDriver* QIrrlicht::getDriver() { return driver; } irr::scene::ISceneManager* QIrrlicht::getSceneManager() { return sceneManager; } irr::gui::IGUIEnvironment* QIrrlicht::qetGui() { return gui; } irr::IrrlichtDevice* QIrrlicht::getDevice() { return device; } void QIrrlicht::irrlichtMaj() { driver->beginScene(true, true, irr::video::SColor(255,100,101,140)); sceneManager->drawAll(); driver->endScene(); }
Hors ligne
Salut, moi aussi je me fait un petit éditeur, et j'utilise les outils d'irrlicht(gui), cela n'est pas aussi complet que qt, mais je pense qu'il devrait avoir ce dont tu as besoin(listbox,checkbox...)
j'affectionne aussi qt pour sa simplicité, et je trouve les outils d'irrlicht autant simple à prendre en main.
Regarde ici si il y a les éléments dont tu as besoins
Hors ligne
Ben je ne pense pas que la gui de Irrlicht puisse suffire surtout que le principe de mon éditeur c'est plus intégrer un moteur 3D dans un gui que intégrer un gui dans un moteur 3D dans ce cas Qt est plus adapté.
En plus j'aime pas trop la gui d'Irrlicht, les signaux/slot de Qt me simplifieraient la tache, je ne me vois pas programmer un éditeur complet avec juste Irrlicht sans passer par la case suicide (j'ai déjà bien galéré pour faire le menu de mon jeu encore très incomplet).
Et puis je pense que ça me ferait du bien de sortir un peut d'Irrlicht, avoir besoin de Qt dans un de mes projet ne peut qu'améliorer mes compétences.
Hors ligne
salut,
moi aussi j'essaye d'intégrer irrlicht à QT, mais sans succès, je comprenais rien lol, et avec ton code, j'ai réussi a comprendre le principe, par contre, j'ai utlisé ton code pour le mettre dans mon projet, et moi, je n'es pas d'erreur, mais par contre, quand je lance mon programme, j'ai intégré le module irrlicht à un frame, mais, on ne le voie pas, enfin j'ai tenté de mettre la scene en rouge, de mettre une image, mais rien a faire, sa ne m'affiche rien, as tu réussi toi à se que sa marche, ou a tu une idée de mon problème^^
Je te remerci d'avance
Hors ligne
Ça doit donc venir de mon installe d'irrlicht dans Qt, comment tu a fait toi ?
Moi j'ai tout compilé sous visual parce que chez moi Qt Creator ne veut pas marcher.
Dès que je peut je m'occupe de ton problème (tu a pensé a inclure la boucle de mise a jour de la scène).
Dernière modification par Ilovechocolat (30-11-2009 17:13:02)
Hors ligne
moi j'ai compilé avec l'invité de commande, et pour la boucle de mise a jour, bah.... j'ai copier se que ta fait en gros mdr^^, enfin j'ai surtout copier les fichier QIrrlicht .hpp et .cpp, ensuite ba j'ai rajouté la ligne pour crée l'instance dans ma fenetre.cpp, et puis bas, sa bug pas mais rien ne s'afficher, enfin le module s'affiche pas mdr.
EDIT : j'ai régardé ton code, et pour ton erreur, peut etre, enfin j'en suis pas sûr, chez moi j'ai pas fait comme toi pour le FenPrincipale.cpp, a la ligne "QIrrlicht *espaceGraphique = new QIrrlicht(zoneCentrale);", moi j'ai fais "m_modIrrlicht = new QIrrlicht(m_frameIrr);", enfin pour toi sa donnerai "espaceGraphique = new QIrrlicht(zoneCentrale);", car tu déclare déjà espaceGraphique dans le FenPrincipale.h, enfin c peut etre pas ça, mais bon, c idée comme une autre^^
EDIT 2 : je vien encore de naviguer sur internet, et comme bien souvent je v sur le site du zéro, et j'ai vu un topic, ou je pencherai que c toi qui la crée aussi mdr : http://www.siteduzero.com/forum-83-4486 … -a-qt.html
Dernière modification par narugohan (30-11-2009 21:21:21)
Hors ligne
Pour intégrer Irrlicht, tu a utilisé un .lib ou un .a ?
Hors ligne
je rajoute le .a dans le fichier .pro :
pour moi sa donne sa :
LIBS += C:\Dev-Cpp\lib\libIrrlicht.a
EDIT : OUAAAAA, je vien de regarder, mais j'ai été précis dans mon edit de mon ancien message^^ 21:21:21, mdr, bon euh c t juste une parenthèse mdr
Dernière modification par narugohan (01-12-2009 18:43:27)
Hors ligne
Bon ben j'ai enfin réussit a intégrer Irrlicht, je vais passer au debug, je te tient au courant mais ça risque de prendre un certain temps car chez moi la compilation de Qt et Irrlicht est trèèès longue.
Hors ligne
tu veux dire par tu as réussi a intègrer irrlicht, que tu n'a plus t'es 2 lignes d'erreur ? si sa est ba bien joué et cool, moi j'arrive tjrs pas à serner le problème de pk sa s'affiche pas-_-
Hors ligne
je ne suis pas moderateur mais faites un effort pour écrire français. Ou anglais d'ailleurs .... au choix
Hors ligne
oui dsl, mais je suis pas très fort en orthographe, mais déjà je vais éviter les abréviations^^
Hors ligne
Bon ben effectivement, la fenêtre Irrlicht est invisible, en gros ça fait comme si on avait rien mis.
Je suis aussi étonné que toi, je ne vois pas ou est l'erreur, même quand j'ajoute un élément dans la scène, rien ne change (ça aurait pu être du au fait que le fond d'une fenêtre Irrlicht est de la même couleur que le fond des fenêtres Qt.).
A oui et je te conseil de rajouter ça a coté des modifications de la variable "parametres" (début de QIrrlicht.cpp) :
parametres.AntiAlias = true; parametres.Bits = 16; parametres.HighPrecisionFPU = false; parametres.Stencilbuffer = true; parametres.Vsync = true; parametres.WindowSize.Width = 640; parametres.WindowSize.Height = 480;
A mon avis il faut chercher du coté de irr::SIrrlichtCreationParameters.
Dernière modification par Ilovechocolat (03-12-2009 18:25:06)
Hors ligne
ok je te remerci pour les paramètres supplémentaire, par contre, moi nn plus marche toujours pas, donc je vais essayai aussi de voir de mon coté^^
Hors ligne
purée, je cherche toujours et je voie pas d'ou vien le problème, as tu trouve un petit truc de ton coté toi ?
Hors ligne
J'ai trouvé un autre truc qui change rien mais qui a l'air plus propre, c'est le cast :
parametres.WindowId = reinterpret_cast<void*>(parent->winId());
edit : autre truc utile a rajouter entre la création du device et l'attribution des paramètres : (ça règle toujours pas le problème mais ça sera utile quand tout marchera)
setMinimumSize(parametres.WindowSize.Width,parametres.WindowSize.Height);
edit : J'AI RÉUSSIT !!!
je te donne une portion de code :
irr::SIrrlichtCreationParameters parametres; parametres.WindowId = reinterpret_cast<void*>(parent->winId()); parametres.DriverType = irr::video::EDT_OPENGL; parametres.AntiAlias = true; parametres.Bits = 16; parametres.HighPrecisionFPU = false; parametres.Stencilbuffer = true; parametres.Vsync = true; parametres.WindowSize.Width = 640; parametres.WindowSize.Height = 480; setMinimumSize(parametres.WindowSize.Width,parametres.WindowSize.Height); setAttribute(Qt::WA_OpaquePaintEvent); setAttribute(Qt::WA_PaintOnScreen); device = irr::createDeviceEx(parametres);
edit : finalement je suis pas si sure que ça marche, regarde ce que ça donne chez toi.
Dernière modification par Ilovechocolat (06-12-2009 21:15:38)
Hors ligne
eh ba, gg, bon on c'est pas encore parfait, mais au moins il nous affiche un module noir, c'est déjà pas mal, donc j'ai essayé de mettre le fond blanc et d'afficher une image, mais..... rien ne change, c'est toujours le fond noir, mais bon déjà j'ai l'impression, que le module irrlicht est affiché, enfin, je c'est pas c'est comment de ton côté toi ?
Hors ligne
salutation
j'ai récupéré un code source qui fait marcher Qt et irrlicht sans aucun souci il se trouve à cette adresse : http://irrlicht.sourceforge.net/phpBB2/ … ichtwidget
ta fonction de rafraichissement à l'air d'etre à peu pres bonne... mais j'ai regardé que vite fait... dans le code trouvé il y a un tick() de fait sur le timer irrlicht surement necessaire pour mettre à jour l'affichage dans le moteur graphique
qu'est ce que ca donne si tu ajoutes le code suivant avant le beginScene()?
device->getTimer()->tick();
en espérant que cela va t'aider ^^
Hors ligne
Merci pour ton code, je vais le regarder de long en large, après je pense que je vais écrire un tuto sur la cohabitation entre Qt et Irrlicht.
Hors ligne
alors je vien d'essayer de rajouter le "device->getTimer()->tick();", mais pour moi aucun changement, mais merçi pour ton code, je vais moi aussi le regarder, par contre Ilovechocolat, si tu trouve quelque chose sur le problème pourrais tu le poster, a moins que je les déjà fais( enfin si je trouve avant toi mdr ), sa m'éviterai de chercher plus lontemps si tu trouve avant moi mdr
Hors ligne
Même ton code ne marche pas, même résultat un espace noir vide.
Hors ligne
ah ba ....., purée donc tjrs a la recherche du code qui marche mdr, bon ba je teste pas l'autre mdr
Hors ligne
euh mon code marche très bien je l'utilise en ce moment meme pour tenter de créer un jeu....
peux tu poster ton code (sous forme d'archive de preference) que je regarde ce qui va pas?
Hors ligne
Voici l'archive : télécharger.. (nécessite Irrlicht 1.6 et Qt 4.6)
Il y avait quelques erreurs de compilations alors j'ai changé quelques trucs :
-J'ai changé le nom de la class en QIrrlicht (c'est moins long que QIrrlichtWidget)
-le params.WindowId me donnais une erreur alors j'ai changé le cast
-j'ai aussi touché a la taille de l'espace 3D un peut plus bas
-j'ai rajouté ceci : setAttribute(Qt::WA_PaintOnScreen);
-j'ai défini une taille minimal pour le Widget.
-et la fonction resizeEvent, il voulait pas d'int alors j'ai mis un unsigned int.
-j'ai rajouté des pointeurs et des accesseurs vers le driver, le scène manager et le guiEnvironement dans la class QIrrlicht.
Dernière modification par Ilovechocolat (08-12-2009 13:53:36)
Hors ligne