#0 

10-09-2012 10:51:26

Lagiol
Membre
Date d'inscription: 17-11-2011
Messages: 24

Bonjour, j'essaye depuis quelques temps de faire le menu principal de mon jeu. A savoir, un simple bouton "Nouveau personnage" qui aurait pour but, lorsqu'on clique dessus, d'ajouter un cube et de targeter la caméra dessus. Ton semble fonctionner, lorsque je lance le programme, je vois mes deux boutons "Entrer dans le jeu" (inutile pour l'instant) et "Nouveau personnage". Aucun problème jusque là, sauf lorsque je décide de passer la souris au-dessus de ces boutons, le programme plante. Je vous envoie mon code au passage.

Code c++ :


#include <irr/Irrlicht.h>
#include <iostream>

using namespace std;
using namespace irr;
using namespace scene;
using namespace video;
using namespace core;
using namespace gui;
using namespace io;


#ifdef _MSC_VER
#pragma comment(lib, "Irrlicht.lib")
#endif

struct SAppContext
{
    IrrlichtDevice *device;
    s32 counter;
    ISceneManager *smgr;
    ICameraSceneNode *camera;
};
enum
{
        idBoutonEntrer,
        idBoutonNew
};

class MyEventReceiver : public IEventReceiver
{
public:
    MyEventReceiver(SAppContext & context) : Context(context) { }
    virtual bool OnEvent(const SEvent &event)
    {
        if(event.EventType == irr::EET_GUI_EVENT)
        {
            s32 id = event.GUIEvent.Caller->getID();
            IGUIEnvironment *gui = Context.device->getGUIEnvironment();
            switch(event.GUIEvent.EventType)
            {
                case EGET_BUTTON_CLICKED:
                    switch(id)
                    {
                        case idBoutonNew:{
                            ImeshSceneNode *cube = Context.smgr->addCubeSceneNode(10);
                            Context.camera->setTarget(cube->getPosition());
                        }
                        return true;
                        default:
                            return false;
                    }
                    break;
            default:
                break;

            }
        }
        return false;
    }

    /*void checkBoutons(ISceneManager* smgr, ICameraSceneNode* camera)
    {
        if(m_bouton_new_clicked == true)
        {
            ImeshSceneNode *cube = smgr->addCubeSceneNode(10);
            camera->setTarget(cube->getPosition());
        }
    }*/

protected:
    SAppContext & Context;
    /*ISceneManager* m_smgr;
    ICameraSceneNode* m_camera;
    bool m_bouton_entrer_clicked;
    bool m_bouton_new_clicked;*/

};


int main()
{

    IrrlichtDevice *device = createDevice(EDT_OPENGL, dimension2d<u32>(800,600), 32, false, false, false);
    IVideoDriver *driver = device->getVideoDriver();
    ISceneManager *smgr = device->getSceneManager();
    ICursorControl *cursor = device->getCursorControl();
    IGUIEnvironment *gui = device->getGUIEnvironment();
    IMeshManipulator *manipulator = smgr->getMeshManipulator();

    cursor->setVisible(false);

    device->setWindowCaption(L"Secret of Ragnor");

    driver->setFog(
        SColor(0,255,255,255),
        EFT_FOG_LINEAR,
        50.0f,
        4000.0f,
        0.01f,
        true,
        true);

    smgr->setShadowColor(SColor(150,0,0,0));

    ITexture * cursorImage = driver->getTexture("textures/curseur3.png");
    dimension2d<u32> taille = cursorImage->getSize();
    position2d<s32> position0;
    position0.X = 0;
    position0.Y = 0;
    position2d<s32> position1;
    position1.X = taille.Width;
    position1.Y = taille.Height;
    rect<s32> rectangle1;
    rectangle1.UpperLeftCorner = position0;
    rectangle1.LowerRightCorner = position1;



    ICameraSceneNode * camera = smgr->addCameraSceneNode();

    IAnimatedMeshSceneNode *creation_scene_floor = smgr->addAnimatedMeshSceneNode(smgr->getMesh("meshes/creation_scene_floor.3ds"), 0, -1, vector3df(0,0,0), vector3df(0,0,0), vector3df(30.0f,30.0f,30.0f));
    creation_scene_floor->setMaterialFlag(EMF_LIGHTING, false);
    creation_scene_floor->setMaterialTexture(0, driver->getTexture("textures/creation_scene_floor.png"));
    creation_scene_floor->getMesh()->setHardwareMappingHint(EHM_STATIC);
    creation_scene_floor->setMaterialFlag(EMF_FOG_ENABLE, true);
    creation_scene_floor->addShadowVolumeSceneNode();
    creation_scene_floor->setVisible(true);
    manipulator->makePlanarTextureMapping(creation_scene_floor->getMesh(), 0.4f);

    camera->setPosition(creation_scene_floor->getPosition() + vector3df(0,100,0));
    camera->setTarget(vector3df(-180,-20,0));

    IGUIButton *bouton_entrer_dans_le_jeu = gui->addButton(rect<s32>(100+175,80+400,200+175,120+400), 0, idBoutonEntrer, L"Entrer dans le jeu");
    IGUIButton *bouton_nouveau_perso = gui->addButton(rect<s32>(100+300,80+400,200+300,120+400), 0, idBoutonNew, L"Nouveau personnage");

    SAppContext context;
    MyEventReceiver receiver(context);
    device->setEventReceiver(&receiver);

    //Skydome
    driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, false);
    scene::ISceneNode* skydome = smgr->addSkyDomeSceneNode(driver->getTexture("textures/skydome.png"), 16, 8, 0.95f, 2.0f);
    driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, true);

    while(device->run())
    {
        driver->beginScene(false, false, SColor(255,150,150,150));


        smgr->drawAll();
        gui->drawAll();

        driver->draw2DImage(cursorImage, cursor->getPosition(), rectangle1, 0, SColor(255,255,255,255));
        s32 posx = camera->getPosition().X;
        s32 posy = camera->getPosition().Y;
        s32 posz = camera->getPosition().Z;
                int fps = driver->getFPS();
                stringw str = L"Secret of Ragnor [";
                str += driver->getName();
                str += "] FPS : ";
                str += fps;
                str += " | X : ";
                str += posx;
                str += " | Y : ";
                str += posy;
                str += " | Z : ";
                str += posz;
                str += " |";

                device->setWindowCaption(str.c_str());
        //receiver.checkBoutons(smgr, camera);


        driver->endScene();
    }

    device->drop();
    return 0;
}

Hors ligne


#1 

10-09-2012 11:54:53

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

Tu créés ta variable context mais faut peut-être affecter ses membres parce que actuellement dans ton event receiver la variable contexte que tu utilises ne contient pas les pointeurs de ton application.

De plus, des pointeurs sans initialisation c'est super dangereux!
Pour l'anecdote, j'ai eu une fois un pointeur "perdu" (la ressource pointée avait été libérée mais le pointeur contenait encore l'adresse) qui m'a fait planté Windows. Vu que j'avais libéré l'espace, Windows l'a utilisé pour ces petites affaires et résultat : un redémarrage brusque de Windows. Donc les pointeurs c'est super mais faut faire super gaffe! Les pointeurs exigent une certaine rigueur (création + initialisation à NULL si rien à affecter à la création, utilisation, destruction de la ressources pointée, mise à NULL du pointeur). Crois-moi, ça t'éviteras de très mauvaises surprises!^^

Code c++ :


struct SAppContext
{
    IrrlichtDevice *device;
    s32 counter;
    ISceneManager *smgr;
    ICameraSceneNode *camera;

    //! constructeur par defaut
    SAppContext() : device(NULL), counter(0), smgr(NULL), camera(NULL) {}
};



Ensuite dans ton main :

Code c++ :


    SAppContext context;
    context.device = device;
    context.smgr = smgr;
    context.camera = camera;
    MyEventReceiver receiver(context);
    device->setEventReceiver(&receiver);



Voilà ça devrait marcher maintenant. Enfin, si il n'y a rien d'autres.^^


core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

Hors ligne


#2 

10-09-2012 18:22:39

Copland
Modérateur
Lieu: ZarbiLand
Date d'inscription: 22-09-2006
Messages: 657
Site web

un pointeur qui pointe dans du vent = segfault...Hey au fait les gars, oui un post pour rien je sais je sais....mais heu vous passez vos journée à coder sur irrlicht ou quoi ? Moi j'ai que le soir de dispo et encore.... Je vous envie vous savez....Ok je sors j'avais rien à dire toute manière.....et puis johnplayer à très bien décrit le souci ici... je prends ma retraite lol


Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.

Hors ligne


#3 

10-09-2012 19:34:54

Lagiol
Membre
Date d'inscription: 17-11-2011
Messages: 24

Merci !!! Mille fois merci johnplayer ! Ca marche à présent, c'est vrai que j'ai été bête d'avoir fait toutes ces erreurs.

Hors ligne


#4 

10-09-2012 20:22:55

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

De toutes façons, on fait tous des erreurs, c'est comme ça qu'on apprend mais avec les pointeurs vaut mieux éviter.^^ Comme on dit : "Se tromper 1 fois, c'est une erreur. La refaire, c'est une faute.", donc souviens-toi de tes erreurs pour ne pas les refaire. Et on ne le dira jamais trop : "Fais gaffe aux pointeurs!!!". Ca y est, je l'ai traumatisé, il va devenir "Pointeurphobe".^^

Copland, tu n'avais rien à dire mais c'est l'intention qui compte. wink


core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

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
139 invités en ligne
Aucun membre connecté
RSS Feed