#0 

20-05-2012 02:53:56

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

Bonjour tout le monde je viens chercher un peu d'aide pour un premier projet irrlicht  ^^,je suis entrain de développé un petit jeu de plateau 3D un go-moku (sorte de jeu de morpion) mon problème est que je voudrais ajouter des bouton pour "nouvelle partie ",ou "quitter" et je n'arrive simplement pas a capter les clic de ma souris sur les bouton en question (les clic sont capté quand j'ajoute une pierre sur le plateau mais pour le bouton rien a y faire sad   ) j'ai passez plusieurs heurs a essayer ce que je trouve sur les sujets et tuto existant mais rien n y fait je poste une partie de mon code en espérant un peu d'aide (une méthode) pour que mes bouton soi enfin pris en compte .
ps:j'ai ajouter un  Screenshots de mon programme .

Code c++ :



Display::Display()
{

     game=new Game();
     round =0;
     device = createDevice(EDT_OPENGL,dimension2d<u32>(640,480),32);
     driver = device->getVideoDriver ();
     sceneManager =device->getSceneManager ();
     device->getCursorControl ()-> setVisible (false);

     irr::gui::IGUIEnvironment *gui = sceneManager->getGUIEnvironment();
 
     /*les bouton qui posent probleme */
      newPGame = gui->addButton(irr::core::rect<irr::s32>(10,10,120,50),0, 1, L"New Game(Player vs Player)");
      newIaGame = gui->addButton(irr::core::rect<irr::s32>(10,60,120,100),0, 2, L"New Game(Player vs IA)");
      leave = gui->addButton(irr::core::rect<irr::s32>(10,110,120,150),0, 3, L"Quit");
    /* GOBAN */
     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\\img\\13x13.png") );
     /* STONE*/
     sphere =sceneManager->addSphereSceneNode(0.4f,100,0,-1,vector3df(0,0.12,0),vector3df(0, 0, 0),vector3df(0.07, 0.04, 0.07));
     sphere->setMaterialFlag(video::EMF_LIGHTING, false);
     sphere->setMaterialTexture( 0, driver->getTexture("C:\\Users\\Dante\\Desktop\\projet rogrammation s6\\jeuDeGo\\img\\stone_black.png") );
    /* CAMERA */
    sceneManager->addCameraSceneNode (0,vector3df (-0.6,0.8,0),vector3df (0,0.1,0));
    /*gestion de l'evenement*/
    receiver = new CEventReceiver(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())
        {
                receiver->setM_isAdded(false);
                addStone(receiver->getnewX(),0.8,receiver->getnewY());
        }
        receiver->majPosMesh();

        sceneManager->drawAll ();
        gui->drawAll();             // calcule le rendu
        driver->endScene ();                   // affiche le rendu
    }

    device->drop ();                           // libere la memoire
}


Display::CEventReceiver::CEventReceiver(irr::scene::ImeshSceneNode* sphere)
{
    //On pointe le mesh passe en parametre.
    m_Nmodele =sphere;
    //Par defaut on ne bouge pas
    m_isMoving = false;
    m_isAdded =false;

}

bool Display::CEventReceiver::OnEvent(const irr::SEvent &event){
    if(event.EventType == irr::EET_GUI_EVENT)cout<<"evenement declencher"<<endl;
    //else cout<<"aucun evenement gui declencher";
    //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 && setCorrectPosition( xref,yref)){

            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(int x,float y,int z){
    if(isCaseFree(x,z)){
         ImeshSceneNode* Stone =sceneManager->addSphereSceneNode(0.4f,1000,0,0,vector3df(x*0.076, 0.12, z*0.076),vector3df(0, 0, 0),vector3df(0.07, 0.04, 0.07));
         Stone->setMaterialFlag(video::EMF_LIGHTING, false);
         int value=Game::NOBODY;
         if(round%2==0){
            Stone->setMaterialTexture( 0, driver->getTexture("C:\\Users\\Dante\\Desktop\\projet rogrammation s6\\jeuDeGo\\img\\stone_black.png") );
            value=Game::BLACK;
            game->setBoardValue(abs(x-6),abs(z-6),value);

         }
         else{
             Stone->setMaterialTexture( 0, driver->getTexture("C:\\Users\\Dante\\Desktop\\projet rogrammation s6\\jeuDeGo\\img\\stone_white.png") );
             value=Game::WHITE;
             game->setBoardValue(abs(x-6),abs(z-6),value);
         }
         stones[round]=Stone;
         round++;
         if(game->getWinner()!=Game::NOBODY){
            cout<<"il ya un vainquer la partie est terminer "<<endl;
            game->setGameFinish(true);//!je voudrais pouvoir tester le choix de l'utilisateur une fois la partie fini
            if(newPGame->isPressed()){//pour ca j'ai besoin de savoir comment savoir quand mon bouton a etai cliqué !
            clear();
            }
         }
    }
}


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 

20-05-2012 12:22:57

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 904
Corrections: 2
Site web

probleme de conception, personellement je ne ferais pas comme ça
je deriverais la class Display de IEventReveiver qui capteras les events ET ce chargeras de la gestions de 'screen' c'est a dire un 'int' qui definie ou ton programme est menu/ia/online
de la tu pouras interpreter les events différements
le probleme c'est que tu n'interprete pas les events des boutton dans ta fonction OnEvent, il ets donc normal qu'il ne face rien
regarde l'exemple irrlicht GraphiqueUserInterface

ps: a quoi sert la fonction set

Hors ligne


#2 

20-05-2012 12:40:59

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

Bonjour,d'abord merci d'avoir répondu rapidement ^^ ,j'ai fait déjà plusieurs tentative de capter les évènements liée au bouton sans succès en ayant déjà regarder le tuto de user interface mais il ne capte pas l’évènement (event.EventType == EET_GUI_EVENT) quand je clic sur un bouton de ma gui peut être que je n'ai pas bien saisie comment gérer les évènement sad si tu peut m'expliquer comment faire pour gérer un bouton çà m'aidera beaucoup .

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
880 membres
1424 sujets
11113 messages
Dernier membre inscrit: mandrifidy
46 invités en ligne
Aucun membre connecté
RSS Feed