20-05-2012 00:53:56
- Dante03
- Membres
- Date d'inscription:
- Messages: 5
- IP: 46.193.133.60
- Courriel
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
) 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
20-05-2012 10:22:57
- Magun
- Administrateurs

- Date d'inscription:
- Messages: 910
- IP: 90.5.161.3
- Courriel 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
20-05-2012 10:40:59
- Dante03
- Membres
- Date d'inscription:
- Messages: 5
- IP: 46.193.133.60
- Courriel
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
si tu peut m'expliquer comment faire pour gérer un bouton çà m'aidera beaucoup .
Hors ligne



