#0 

18-11-2009 21:53:21

Ilovechocolat
Abonné
Date d'inscription: 07-10-2009
Messages: 125

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

Code:

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

Code:

#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

Code:

#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

Code:

#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

Code:

#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

Code:

#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


#1 

19-11-2009 13:54:52

nico
Webmaster
Date d'inscription: 07-08-2009
Messages: 563
Corrections: 9

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 wink

Hors ligne


#2 

19-11-2009 16:27:23

Ilovechocolat
Abonné
Date d'inscription: 07-10-2009
Messages: 125

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


#3 

30-11-2009 17:01:49

narugohan
Abonné
Date d'inscription: 24-03-2009
Messages: 113

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


#4 

30-11-2009 17:11:23

Ilovechocolat
Abonné
Date d'inscription: 07-10-2009
Messages: 125

Ç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


#5 

30-11-2009 18:56:33

narugohan
Abonné
Date d'inscription: 24-03-2009
Messages: 113

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


#6 

01-12-2009 12:10:25

Ilovechocolat
Abonné
Date d'inscription: 07-10-2009
Messages: 125

Pour intégrer Irrlicht, tu a utilisé un .lib ou un .a ?

Hors ligne


#7 

01-12-2009 18:32:01

narugohan
Abonné
Date d'inscription: 24-03-2009
Messages: 113

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


#8 

02-12-2009 21:16:29

Ilovechocolat
Abonné
Date d'inscription: 07-10-2009
Messages: 125

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


#9 

02-12-2009 21:47:11

narugohan
Abonné
Date d'inscription: 24-03-2009
Messages: 113

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


#10 

03-12-2009 16:47:36

TUpac
Habitué
Date d'inscription: 08-09-2009
Messages: 387
Corrections: 1

je ne suis pas moderateur mais faites un effort pour écrire français. Ou anglais d'ailleurs .... au choix big_smile


"Si vous ne partagez pas votre stabilité avec les pauvres, les pauvres partageront leur instabilité avec vous."

Hors ligne


#11 

03-12-2009 17:04:35

narugohan
Abonné
Date d'inscription: 24-03-2009
Messages: 113

oui dsl, mais je suis pas très fort en orthographe, mais déjà je vais éviter les abréviations^^

Hors ligne


#12 

03-12-2009 18:24:37

Ilovechocolat
Abonné
Date d'inscription: 07-10-2009
Messages: 125

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) :

Code:

        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


#13 

03-12-2009 19:07:36

narugohan
Abonné
Date d'inscription: 24-03-2009
Messages: 113

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


#14 

05-12-2009 00:16:30

narugohan
Abonné
Date d'inscription: 24-03-2009
Messages: 113

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


#15 

06-12-2009 21:00:56

Ilovechocolat
Abonné
Date d'inscription: 07-10-2009
Messages: 125

J'ai trouvé un autre truc qui change rien mais qui a l'air plus propre, c'est le cast :

Code:

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)

Code:

setMinimumSize(parametres.WindowSize.Width,parametres.WindowSize.Height);

edit : J'AI RÉUSSIT !!!
je te donne une portion de code :

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


#16 

07-12-2009 00:08:38

narugohan
Abonné
Date d'inscription: 24-03-2009
Messages: 113

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


#17 

07-12-2009 12:43:31

Ilovechocolat
Abonné
Date d'inscription: 07-10-2009
Messages: 125

pareil, je vais voir sur tuto qui montre l'intégration d'ogre dans Qt et celui ci qui montre l'intégration d'Irrlicht dans l'api windows.
Regarde ce que tu peut faire de ton coté.

Hors ligne


#18 

07-12-2009 14:53:48

X3liF
Membre
Date d'inscription: 27-10-2009
Messages: 19

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()?

Code:

device->getTimer()->tick();

en espérant que cela va t'aider ^^

Hors ligne


#19 

07-12-2009 16:11:45

Ilovechocolat
Abonné
Date d'inscription: 07-10-2009
Messages: 125

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


#20 

07-12-2009 18:39:58

narugohan
Abonné
Date d'inscription: 24-03-2009
Messages: 113

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


#21 

07-12-2009 22:05:23

Ilovechocolat
Abonné
Date d'inscription: 07-10-2009
Messages: 125

Même ton code ne marche pas, même résultat un espace noir vide.

Hors ligne


#22 

07-12-2009 22:33:55

narugohan
Abonné
Date d'inscription: 24-03-2009
Messages: 113

ah ba ....., purée donc tjrs a la recherche du code qui marche mdr, bon ba je teste pas l'autre mdr

Hors ligne


#23 

07-12-2009 23:06:06

X3liF
Membre
Date d'inscription: 27-10-2009
Messages: 19

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


#24 

08-12-2009 12:25:06

Ilovechocolat
Abonné
Date d'inscription: 07-10-2009
Messages: 125

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


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
Analysé par
872 membres
1422 sujets
11104 messages
Dernier membre inscrit: Glider
19 invités en ligne
Aucun membre connecté
RSS Feed