#0 

09-04-2013 21:00:40

jonath313
Abonné
Date d'inscription: 28-12-2009
Messages: 240

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

Code:

#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

Code:

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:

Code:

...
  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 :  \n \n");
        fprintf(fichier,"  Il y a %d joysticks connéctés. \n \n", 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 \n",i,SDL_JoystickName(i));               // on écrit les noms des joysticks
            fprintf(fichier,"   Nombre de boutons         : %d \n",SDL_JoystickNumButtons(manette1));    // nombre de boutons
            fprintf(fichier,"   Nombre d'axes             : %d \n",SDL_JoystickNumAxes(manette1));       // nombre d'axes
            fprintf(fichier,"   Nombre de chapeaux        : %d \n",SDL_JoystickNumHats(manette1));       // nombre de chapeaux
            fprintf(fichier,"   Nombre de trackballs      : %d \n\n ",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.

Hors ligne


#1 

10-04-2013 14:42:35

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

Juste une question. Pourquoi tu n'utilises pas la gestion d'événement d'irrlicht (irr::SEvent::SJoystickEvent). Pour l'avoir utilisé plein de fois, je n'ai jamais eu de problème. Surtout qu'il y a des chances pour qu'irrlicht utilise la SDL pour les événements, donc c'est réinventer la roue.


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-04-2013 22:57:37

jonath313
Abonné
Date d'inscription: 28-12-2009
Messages: 240

Bin enfait j'ai appris à programmé tout seul , alors je ne sais pas me servir d'une doc, si j'ai pas un tuto clair j'avance pas.
Alors vue que je connais un peut la SDL je me suis lancé sur ce qu'il me paraissait le plus simple, même si c'est pas le plus logique niveau code.
Du coup j'ai résolu mon problème, j'avais juste à recréer une fonction adapté :

CLEventReceiver .cpp

Code c++ :

bool CLEventReceiver::process_events() //En cas d'événnement MANETTE X360
{
SDL_Event m_evenements;
SDL_PollEvent(&m_evenements);

        switch(m_evenements.type)
        {
///////////////////////////////////////////////////LES BOUTONS////////////////////////////////////////////////////////
        case SDL_JOYBUTTONDOWN: //Cas appuie sur le bouton
            if (m_evenements.jbutton.button == 0) { //appuie sur le bouton 0 : A sur la manette
                m_isAvance = true;
                m_isMarcher = true;
            }
            if (m_evenements.jbutton.button == 1) { //appuie sur le bouton 1 : B sur la manette
                m_isRecule = true;
            }
            if (m_evenements.jbutton.button == 2) { //appuie sur le bouton 2 : X sur la manette
                m_isAvance = true;
                m_isMarcher = true;
            }
            if (m_evenements.jbutton.button == 3) { //appuie sur le bouton 3 : Y sur la manette
                m_isAvance = true;
                m_isMarcher = true;
            }
            if (m_evenements.jbutton.button == 4) { //appuie sur le bouton 4 : LB sur la manette
                m_isAvance = true;
                m_isMarcher = true;
            }
            if (m_evenements.jbutton.button == 5) { //appuie sur le bouton 5 : RB sur la manette
                m_isAvance = true;
                m_isMarcher = true;
            }
            if (m_evenements.jbutton.button == 6) { //appuie sur le bouton 6 : BACK sur la manette
                m_isAvance = true;
                m_isMarcher = true;
            }
            if (m_evenements.jbutton.button == 7) { //appuie sur le bouton 7 : START sur la manette
                m_isAvance = true;
                m_isMarcher = true;
            }
            if (m_evenements.jbutton.button == 8) { //appuie sur le bouton 8 : STICK GAUCHE sur la manette
                m_isAvance = true;
                m_isMarcher = true;
            }
            if (m_evenements.jbutton.button == 9) { //appuie sur le bouton 9 : STICK DROITE sur la manette
                m_isAvance = true;
                m_isMarcher = true;
            }
            break;

        case SDL_JOYBUTTONUP: //Cas RELACHE du bouton
            if (m_evenements.jbutton.button == 0) { //RELACHE sur le bouton 0 : A sur la manette
                m_isAvance = false;
                m_isMarcher = false;
            }
            if (m_evenements.jbutton.button == 1) { //RELACHE sur le bouton 1 : B sur la manette
                m_isRecule = false;
               // m_isMarcher = false;
            }
            if (m_evenements.jbutton.button == 2) { //RELACHE sur le bouton 2 : X sur la manette
            }
            if (m_evenements.jbutton.button == 3) { //RELACHE sur le bouton 3 : Y sur la manette
                m_isAvance = false;
                m_isMarcher = false;
            }
            if (m_evenements.jbutton.button == 4) { //RELACHE sur le bouton 4 : LB sur la manette
            }
            if (m_evenements.jbutton.button == 5) { //RELACHE sur le bouton 5 : RB sur la manette
                m_isAvance = false;
                m_isMarcher = false;
            }
            if (m_evenements.jbutton.button == 6) { //RELACHE sur le bouton 6 : BACK sur la manette
            }
            if (m_evenements.jbutton.button == 7) { //RELACHE sur le bouton 7 : START sur la manette
           }
            if (m_evenements.jbutton.button == 8) { //RELACHE sur le bouton 8 : STICK GAUCHE sur la manette
                m_isAvance = false;
                m_isMarcher = false;
            }
            if (m_evenements.jbutton.button == 9) { //RELACHE sur le bouton 9 : STICK DROITE sur la manette
            }
            break;
///////////////////////////////////////////////////////LES AXES/////////////////////////////////////////////////////////////////////
        case SDL_JOYAXISMOTION : //Cas mouvement des axes
                if(m_evenements.jaxis.axis == 0 && m_evenements.jaxis.value < - 5000) //Mouvement vers la gauche NUMERO 0 = STICK GAUCHE
                {
                m_isAvance = true;
                m_isMarcher = true;
                }
                else {
                        m_isAvance = false;
                        m_isMarcher = false;
                }
                if(m_evenements.jaxis.axis == 0 && m_evenements.jaxis.value >  5000) //Mouvement vers la DROITE NUMERO 0 = STICK GAUCHE
                {
                }
                if(m_evenements.jaxis.axis == 1 && m_evenements.jaxis.value <  -5000) //Mouvement vers la HAUT NUMERO 1 = STICK GAUCHE
                {
                }

                if(m_evenements.jaxis.axis == 1 && m_evenements.jaxis.value >  5000) //Mouvement vers la BAS NUMERO 1 = STICK GAUCHE
                {
                }

                if(m_evenements.jaxis.axis == 2 && m_evenements.jaxis.value < -5000) //BOUTON AXE RT NUMERO 2
                {
                }
                if(m_evenements.jaxis.axis == 2 && m_evenements.jaxis.value > 5000) //BOUTON AXE LT NUMERO 2
                {
                }

                if(m_evenements.jaxis.axis == 3 && m_evenements.jaxis.value < - 5000) //Mouvement vers la HAUT NUMERO 3 = STICK DROIT
                {
                }
                if(m_evenements.jaxis.axis == 3 && m_evenements.jaxis.value >  5000) //Mouvement vers la BAS NUMERO 3 = STICK DROIT
                {
                }
                if(m_evenements.jaxis.axis == 4 && m_evenements.jaxis.value < - 5000) //Mouvement vers la GAUCHE NUMERO 3 = STICK DROIT
                {
                }
                if(m_evenements.jaxis.axis == 4 && m_evenements.jaxis.value >  5000) //Mouvement vers la DROITE NUMERO 3 = STICK DROIT
                {
                }
                 break;
/////////////////////////////////////////////////LES CHAPEAUX//////////////////////////////////////////////////////////////////////
        case SDL_JOYHATMOTION:
                if(m_evenements.jhat.hat == 0 && m_evenements.jhat.value == SDL_HAT_UP) //SI CHAPEAU HAUT
                {
                m_isAvance = true;
                m_isMarcher = true;
                //break;
                }
                else {
                        m_isAvance = false;
                        m_isMarcher = false;
                }
                if(m_evenements.jhat.hat == 0 && m_evenements.jhat.value == SDL_HAT_DOWN) //SI CHAPEAU BAS
                {
                }
                if(m_evenements.jhat.hat == 0 && m_evenements.jhat.value == SDL_HAT_RIGHT) //SI CHAPEAU DROITE
                {
                }
                if(m_evenements.jhat.hat == 0 && m_evenements.jhat.value == SDL_HAT_RIGHTDOWN) //SI CHAPEAU BAS DROITE
                {
                }
                if(m_evenements.jhat.hat == 0 && m_evenements.jhat.value == SDL_HAT_RIGHTUP) //SI CHAPEAU HAUT DROITE
                {
                }
                if(m_evenements.jhat.hat == 0 && m_evenements.jhat.value == SDL_HAT_LEFT) //SI CHAPEAU GAUCHE
                {
                }
                if(m_evenements.jhat.hat == 0 && m_evenements.jhat.value == SDL_HAT_LEFTDOWN) //SI CHAPEAU BAS GAUCHE
                {
                }
                if(m_evenements.jhat.hat == 0 && m_evenements.jhat.value == SDL_HAT_LEFTUP) //SI CHAPEAU HAUT GAUCHE
                {
                }
                break;
        }

}


Dans le . h on déclare:

Code c++ :

     virtual bool process_events();


main.cpp

Code c++ :

...
while (device->run()) {

        driver->beginScene(true, true, irr::video::SColor(0,255,255,255));


        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
    receiver.process_events();
   
    sceneManager->drawAll ();
    driver->endScene ();
    }
    device->drop ();
    SDL_JoystickClose(manette1);
    SDL_Quit();
    return EXIT_SUCCESS;
}


Et voila au cas où il y est d'autres personnes qui aiment se compliquer la vie , le code fonctionne wink

Hors ligne


#3 

11-04-2013 18:30:23

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

Salut,
Les "if" à rallonge je suis pas fan, tu devrais essayer de caser ça au minimum dans un switch case wink.
Sinon, il est vrai que d'utiliser directement Irrlicht aurait été plus approprié mais bon, si t'es plus à l'aise sur SDL....
A+


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

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
882 membres
1429 sujets
11119 messages
Dernier membre inscrit: LiseBuisson96
17 invités en ligne
Aucun membre connecté
RSS Feed