Historique des modifications - Message

Message #11178

Sujet: Classe Événement Manette X360 pc ne fonctionne pas


Type Date Auteur Contenu
Création du message 09-04-2013 19:00:40 jonath313
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.

Retour

Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
169 invités en ligne
membre en ligne: -
RSS Feed