Bonjour,
Je suis entrain de coder mes événements pour la manette XBOX360 PC, pour cela j'utilise SDL.
Tout ce passait bien lorsque je codais dans le main. Alors je me suis dis, pourquoi pas créer une classe CLEventReceiver pour la manette , une fois terminé mon code compile mais les événements ne fonctionnent plus.
Je vous laisse mon code, au cas où quelqu'un voit l'erreur, à tout les coups c'est ma classe qui est mal crée ...
CLEventReceiver .h
#include ...
class CLEventReceiver : public irr::IEventReceiver//On créé une classe CEventReceiver , fille de la classe IEventReceiver
{
public ://dans la partie publique , on va mettre les prototypes de nos fonctions
CLEventReceiver(irr::scene::IAnimatedMeshSceneNode* Nperso,
irr::scene::ICameraSceneNode* camera3,
SDL_Event evenements);//On créé le constructeur , qui prend en parametre le node de notre modele(ici , Sydney , donc)
virtual bool OnEvent(const SEvent& event);//Cette fonction est lancée en cas d'évenement
void majPosMesh();//On met à jour la position de notre mesh
void majAnimMesh();//On met à jour l'animation du mesh , si besoin est
private ://dans la partie privée , on met nos attributs
irr::scene::IAnimatedMeshSceneNode* m_Nperso;//Le node que l'on va manipuler
irr::scene::ICameraSceneNode* m_Ncamera3;//Le node que l'on va manipuler
SDL_Event m_evenements;
bool m_animrun;//Un booléen qui indique si l'animation du personnage est "courir"(EMAT_RUN) , ou pas
bool m_isAvance;//Un booléen qui indique si on bouge , ou pas
bool m_isCourrir;
bool m_isMarcher;
};
CLEventReceiver .cpp
CLEventReceiver::CLEventReceiver(irr::scene::IAnimatedMeshSceneNode* Nperso,
irr::scene::ICameraSceneNode* camera3,
SDL_Event evenements)//revoilà notre constructeur :)
{
m_Nperso = Nperso;//On pointe le mesh passe en parametre.
m_Ncamera3 = camera3;
m_evenements = evenements ;
m_animrun = true;//et comme l'animation n'est du coup pas "courir" , on met notre booléen à false aussi
m_isAvance = false;//Par défaut , le modele est immobile .Donc le booléen qui indique si l'on bouge est à false
m_isMarcher = false;
}
bool CLEventReceiver::OnEvent(const SEvent& event)//En cas d'évenement :
{
switch(m_evenements.type)
{
case SDL_JOYBUTTONDOWN: //Cas appuie sur le bouton
switch(m_evenements.jbutton.button)
{
///////////////////////////////////////////////////LES BOUTONS////////////////////////////////////////////////////////
case 0 : //appuie sur le bouton 0 : A sur la manette
/*speed=5;
c.X += 0.6*speed * sin(diry);
c.Z -= 0.6*speed * - cos(diry);*/
m_isAvance = true;
m_isMarcher = true;
break;
case 1 : //appuie sur le bouton 1 : B sur la manette
/*speed=-5;
c.X += 0.6*speed * sin(diry);
c.Z -= 0.6*speed * - cos(diry);*/
break;
case 2 : //appuie sur le bouton 2 : X sur la manette
break;
case 3 : //appuie sur le bouton 3 : Y sur la manette
break;
case 4 : //appuie sur le bouton 4 : LB sur la manette
break;
case 5 : //appuie sur le bouton 5 : RB sur la manette
break;
case 6 : //appuie sur le bouton 6 : BACK sur la manette
break;
case 7 : //appuie sur le bouton 7 : START sur la manette
break;
case 8 : //appuie sur le bouton 8 : STICK GAUCHE sur la manette
break;
case 9 : //appuie sur le bouton 9 : STICK DROITE sur la manette
break;
}
}
}
void CLEventReceiver::majPosMesh()//fonction de mise à jour de la position
{
core::vector3df c =m_Nperso->getPosition();
core::vector3df d= m_Nperso->getRotation();
float diry = ((d.Y+12)*3.1415926535897)/180; // +12 ajuste le pivot du model
int speed;
if(m_Nperso != 0 && m_isAvance == true){
if(m_isMarcher == true && m_isCourrir == false)
{
speed=5;
c.X += 0.6*speed * sin(diry);
c.Z -= 0.6*speed * - cos(diry);
m_animrun == true;
m_animrunCourrir == false;
}
else speed=0;
if(m_isCourrir == true && m_isMarcher == true)
{
speed=9;
c.X += 0.6*speed * sin(diry);
c.Z -= 0.6*speed * - cos(diry);
m_animrun == false;
m_animrunCourrir == true;
}
else speed=0;
}
m_Nperso->setPosition(c);
m_Nperso->setRotation(d);
}
void CLEventReceiver::majAnimMesh()//Ici , on met à jour l'animation
{
...
}
main.cpp:
...
irr::IrrlichtDevice* device = irr::createDevice(irr::video::EDT_OPENGL,irr::core::dimension2d<irr::u32>(1024,768),32);
irr::video::IVideoDriver* driver = device->getVideoDriver ();
irr::scene::ISceneManager* sceneManager = device->getSceneManager ();
int main ( int argc, char** argv )
{
irr::scene::IAnimatedMesh* perso;
perso = (irr::scene::IAnimatedMesh*)sceneManager->getMesh("model/perso22.b3d"); /*testbox5.X*/ //ennemi12.b3d ennemi15.b3d
irr::scene::IAnimatedMeshSceneNode* Nperso = sceneManager->addAnimatedMeshSceneNode(perso);
Nperso->setMaterialTexture(0, driver->getTexture("images/skin6.jpg"));
Nperso->setMaterialFlag(irr::video::EMF_LIGHTING, false);
Nperso->setPosition(irr::core::vector3df(0.0,0.0,100.0)) ;
Nperso->setScale(vector3df(0.1,0.1,0.1));
Nperso->setAnimationSpeed(0);
irr::scene::ICameraSceneNode *camera3 = sceneManager->addCameraSceneNode();
camera3->setFarValue(camera3->getFarValue() + 40000.0f);
camera3->setNearValue(0.3f); //0.03f
if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK) <0)
return EXIT_FAILURE;
SDL_JoystickEventState(SDL_ENABLE); //On active les événements de la manette
SDL_Event evenements;
SDL_Joystick *manette1; //on crée le joystick
manette1 = SDL_JoystickOpen(0); //On l'assigne au numéro 0
FILE* fichier = NULL;
fichier = fopen("Joystick.txt","w+");// on crée un fichier Joystick.txt
if(fichier != NULL)
{
fprintf(fichier," INFORMATIONS SUR LA MANETTE PC : \
\
");
fprintf(fichier," Il y a %d joysticks connéctés. \
\
", SDL_NumJoysticks()); // On écrit il y a combien de joystick (manette)
for(int i=0; i<SDL_NumJoysticks(); i++)
{
fprintf(fichier," Nom du joystick numero %d : %s \
",i,SDL_JoystickName(i)); // on écrit les noms des joysticks
fprintf(fichier," Nombre de boutons : %d \
",SDL_JoystickNumButtons(manette1)); // nombre de boutons
fprintf(fichier," Nombre d'axes : %d \
",SDL_JoystickNumAxes(manette1)); // nombre d'axes
fprintf(fichier," Nombre de chapeaux : %d \
",SDL_JoystickNumHats(manette1)); // nombre de chapeaux
fprintf(fichier," Nombre de trackballs : %d \
\
",SDL_JoystickNumBalls(manette1)); // nombre de trackballs
fclose(fichier); // on ferme le fichier
}
}
else
return EXIT_FAILURE;
//////////////////////////////RECEPTEUR EVENNEMENTS/////////////////////////////
CLEventReceiver receiver(Nperso,
camera3,
evenements);//On créé un objet instance de la classe CEventReceiver : c'est notre capteur d'évènements
device->setEventReceiver(&receiver);//on définit cet objet comme le capteur pour notre device
while (device->run()) {
driver->beginScene(true, true, irr::video::SColor(0,255,255,255));
SDL_PollEvent(&evenements);
SDL_JoystickUpdate();
receiver.majPosMesh();//a chaque frame , on appelle la fonction qui met à jour la position du Mesh
receiver.majAnimMesh();//a chaque frame , on appelle la fonction qui , si besoin est , modifie l'animation du mesh
sceneManager->drawAll ();
driver->endScene ();
}
device->drop ();
SDL_JoystickClose(manette1);
SDL_Quit();
return EXIT_SUCCESS;
}
Merci.