#0 

02-04-2012 01:09:55

Dante03
Petit nouveau
Date d'inscription: 02-04-2012
Messages: 5

Bonsoir je suis débutant avec irrlicht et je tente de développer un simple jeu de plateau (jeu de go plus exactement) pour l'instant j'ai un mesh en forme de pierre de go que je peut balader sur le Goban (plateau du jeu de go),je voudrais lors d'un clic placer la pierre en question , problème la pierre ce place le programme cesse de fonctionner plante et puis demande a être fermer ,je vous poste mon code en espérant recevoir un peu d'aide ^^ ,aussi je n'aipas beaucoup d'idées de comment structurer mon programme pour gerer les évènement sur le code présenter j'utilise une Class imbriquer ,peut etre y'a t'il un meilleur moyen (je suis a l’écoute de toute proposition ^^).


l'erreur ce produit lors de l’appelle de la fonction addStone

Code c++ :



#include "C:\Users\Dante\Desktop\projet rogrammation s6\jeuDeGo\include\Display.h"
#include <irrlicht.h>


Display::Display()
{
    IrrlichtDevice* device = createDevice(EDT_OPENGL,dimension2d<u32>(640,480),32);
    IVideoDriver* driver = device->getVideoDriver ();
    ISceneManager* sceneManager =device->getSceneManager ();
    device->getCursorControl ()-> setVisible (true);
    /* GOBAN */
     ImeshSceneNode* cube =sceneManager->addCubeSceneNode(1,0,-1,vector3df(0,0,0),vector3df(0,0,0),vector3df(1,0.2,1));
     cube->setMaterialFlag(video::EMF_LIGHTING, false);
     cube->setMaterialTexture( 0, driver->getTexture("C:\\Users\\Dante\\Desktop\\projet rogrammation s6\\jeuDeGo\\9x9.png") );
     /* STONE*/
     ImeshSceneNode* sphere =sceneManager->addSphereSceneNode(0.4f,100,0,-1,vector3df(0,0.12,0),vector3df(0, 0, 0),vector3df(0.1, 0.06, 0.1));
     sphere->setMaterialFlag(video::EMF_LIGHTING, false);
     sphere->setMaterialTexture( 0, driver->getTexture("C:\\Users\\Dante\\Desktop\\projet rogrammation s6\\jeuDeGo\\stone_black.png") );
    /* CAMERA */
    sceneManager->addCameraSceneNode (0,vector3df (0,0.8,0),vector3df (0,0.1,0));
    /*gestion de l'evenement*/
    Display::CEventReceiver receiver(sphere);
    device->setEventReceiver(&receiver);

    /* RENDU */
    SColor color(                  // contient la couleur blanc
        255,                                   // composante A alpha (transparence)
        255,                                   // composante R rouge
        255,                                   // composante G verte
        255);                                  // composante B bleue
    while (device->run()) {                    // la boucle de rendu
        driver->beginScene(true, true, color); // demarre le rendu
        if(receiver.getM_isAdded())
        {
            addStone(receiver.getXref(),0.8,receiver.getYref());
            receiver.setM_isAdded(false);
        }
        receiver.majPosMesh();
        sceneManager->drawAll ();              // calcule le rendu
        driver->endScene ();                   // affiche le rendu

    }

    device->drop ();                           // libere la memoire
}
Display::CEventReceiver::CEventReceiver(irr::scene::ImeshSceneNode* Nmodele)
{
    //On pointe le mesh passe en parametre.
    m_Nmodele = Nmodele;
    //Par defaut on ne bouge pas
    m_isMoving = false;
    m_isAdded =false;

}

bool Display::CEventReceiver::OnEvent(const irr::SEvent &event){
    //On verifie que le pointeur est ok et que cest un evenemetn liée a la souris
    if(m_Nmodele != 0 && event.EventType == irr::EET_MOUSE_INPUT_EVENT)
    {


        m_isMoving = true;
        //on recupereles coordonee exacte par rapport au goban
        xref = -(event.MouseInput.Y-240)*0.002;
        yref = -(event.MouseInput.X-320)*0.002;
        if(event.MouseInput.Event== irr::EMIE_LMOUSE_PRESSED_DOWN){
            std::cout<<"xref egal a "<<xref<<std::endl;
            std::cout<<"Yref egal a "<<yref<<std::endl;
            m_isAdded=true;
        }

        //L'event est traite, on retourne true
        return true;
    }
    //Si on arrive la, c'est qu'on a pas traite l'event
    m_isMoving = false;
    return false;
}
//on ajoute une pierre au goban
void Display::addStone(float x,float y,float z){

     ImeshSceneNode* Stone =sceneManager->addSphereSceneNode(0.4f,1000,0,0,vector3df(x, 0.12, y),vector3df(0, 0, 0),vector3df(0.1, 0.06, 0.1));
     Stone->setMaterialFlag(video::EMF_LIGHTING, false);
     Stone->setMaterialTexture( 0, driver->getTexture("C:\\Users\\Dante\\Desktop\\projet rogrammation s6\\jeuDeGo\\stone_black.png") );
}

void Display::CEventReceiver::majPosMesh(){
    //On verifie que le pointeur vers le mesh est
    //ok et que la touche est enfoncee
    if(m_Nmodele != 0 && m_isMoving == true)
    {
        //On commence par recuperer la position actuelle
        irr::core::vector3df v = m_Nmodele->getPosition();
        //On y ajoute la valeur de deplacement
        v.X =xref;
        v.Z= yref;
        //On renvoie la nouvelle position
        m_Nmodele->setPosition(v);
    }
}


Hors ligne


#1 

02-04-2012 10:25:15

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

Si j'étais toi, je mettrais mes variables (surtout les pointeurs) en variables de la classe Display. Sinon pour libérer la mémoire...
Donc : IrrlichtDevice* device, IVideoDriver* driver, ISceneManager* sceneManager, CEventReceiver receiver et tes trois nodes, je les mettrais en variables de classe. Tu n'auras plus besoin de passer sphere en paramètre.
De plus, si je ne me trompe pas, CEventReceiver receiver est détruite à la fin du constructeur donc la référence que tu donnes à device n'existe plus et l'espace mémoire que device va essayer de lire sera certainement réatribué à un autre programme par l'OS.
Pour event receiver fait plutot :

Dans Display.h
CEventReceiver* receiver;

Dans Display.cpp
CEventReceiver receiver = new CEventReceiver();
device->setEventReceiver(receiver);


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 

02-04-2012 16:04:50

Dante03
Petit nouveau
Date d'inscription: 02-04-2012
Messages: 5

j'ai écouté tes conseil et effectivement ça a régler le problème de plantage ^^ je te remercie d'avoir pris de ton temps pour m'aider big_smile .

Hors ligne


#3 

02-04-2012 23:42:37

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

De rien, il n'y a plus grand monde sur le forum mais on aide quand l'on peut.


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