#0 

23-04-2009 17:28:59

mari-ion
Membre
Date d'inscription: 06-04-2009
Messages: 13

Bonjour a tous
j'ai un problème avec la coordination de ma caméra FPS et de mon joystick
pour la caméra jutilise une SkeyMap :

     //Mouvements basiques de la caméra
        irr::SKeyMap keyMap[5];
        keyMap[0].Action = irr::EKA_MOVE_FORWARD;
        keyMap[0].KeyCode = irr::KEY_UP;
        keyMap[1].Action = irr::EKA_MOVE_BACKWARD;
        keyMap[1].KeyCode = irr::KEY_DOWN;
       keyMap[4].Action = irr::EKA_JUMP_UP;
       keyMap[4].KeyCode = irr::KEY_SPACE;

j'aimerai rajouter quelque chose du genre dans mon IEventReceiver:

if (event.EventType == irr::EET_JOYSTICK_INPUT_EVENT
            && event.JoystickEvent.Axis[1] == -32768) //mouvement vers l'avant
{
irr::EKA_MOVE_FORWARD;
}


car j'ai tout essayé, mais la caméra FPS me pose des problemes !!! donc je ne vois que cette solution!
mais apparemment c'est un peu trop facile :'(
quelqu'un aurait une solution?
car je ne trouve pas de solution a ce problème et ce depuis un moment!

merci d'avance

Marion

Hors ligne


#1 

23-04-2009 21:39:38

dark calculator
Abonné
Date d'inscription: 25-02-2007
Messages: 153

Désolé mais a mon avis il vaut mieux utilisé une caméra faite maison plutot qu'une fps car le keymap est utile que pour le clavier je crois(corrigé si je me trompe).

Je te conseil une nouvelle fois de regarder l'example d'irrlicht, le 19 il me semble, ils déplacent un node au lieu d'une caméra donc il y a quand même a adapté(en particulier concernant la cible)

Au pire tu peut faire quelquechose de bourrin avec une camera FPS :

Code:

if (event.EventType == irr::EET_JOYSTICK_INPUT_EVENT
            && event.JoystickEvent.Axis[1] == -32768) //mouvement vers l'avant
{
device->postEventFromUser(irr:KEY_UP);
}

Pas très joli mais bon, en plus je suis pas sur de ta valeur de -32768 et au lieu d'un == il vaudrait mieu un > ou <.

En espérant avoir aidé.

N'hésit pas à poster du code si sa ne marche pas.

dark calculator

P.S. : Quand au SKEYMAP il est sensé se passer à la caméra et permet d'utiliser d'autre touche que celle par défault, par example : z,q,s,d à la place des flèches du clavier

Hors ligne


#2 

23-04-2009 23:20:50

mari-ion
Membre
Date d'inscription: 06-04-2009
Messages: 13

merci pour la réponse mais :

device->postEventFromUser(irr::KEY_UP);


ne marche pas malheureusement mais c'est exactement ce que je voudrais faire!!!!!!!!!!!!
EXACTEMENT big_smile

Hors ligne


#3 

24-04-2009 09:21:10

dark calculator
Abonné
Date d'inscription: 25-02-2007
Messages: 153

Si tu pouvais donner le code et l'erreur exact, on pourrait peut être t'aider.

Dernière modification par dark calculator (24-04-2009 09:33:34)

Hors ligne


#4 

24-04-2009 12:45:46

mari-ion
Membre
Date d'inscription: 06-04-2009
Messages: 13

le probleme c'est que pour cette fonction il demande un événement en paramétré et non  une touche

C:\Users\Marion\Desktop\3DGame\Project\Projet\CEventReceiver.cpp|153|error: no matching function for call to `irr::IrrlichtDevice::postEventFromUser(irr::EKEY_CODE)'|

C:\Users\Marion\Desktop\3DGame\Project\Projet\CEventReceiver.cpp||In member function `virtual bool CEventReceiver::OnEvent(const irr::SEvent&)'neutral


:'(

Hors ligne


#5 

24-04-2009 17:34:15

dark calculator
Abonné
Date d'inscription: 25-02-2007
Messages: 153

a ouai sorry il faut construire un event avant :

Code:

SEvent myevent;
myevent.EventType = EET_KEY_INPUT_EVENT;
myevent.KeyInput.PressedDown = true;
myevent.KeyInput.Key = KEY_UP;
device->postEventFromUser(myevent);

J'ai jamais fais et j'ai la flemme de tester. Je pense qua sa marche mais je suis pas sur et il y aura surement des erreurs a la compilation et il faut rajouter les namespaces.

Hors ligne


#6 

24-04-2009 19:53:15

mari-ion
Membre
Date d'inscription: 06-04-2009
Messages: 13

il n'y a aucune erreur de compilation le problème et des que je vais tout droit avec mon joystick ça plante, la fenêtre deviens blanche !

Hors ligne


#7 

25-04-2009 00:02:31

dark calculator
Abonné
Date d'inscription: 25-02-2007
Messages: 153

Essaye donc sa :
Bon j'ai mis la borne 42 aléatoirement car sa me semble moin exotique que -32768 enfin change le commme tu pense que c'est bon je connais pas les joy.

Code:

if (event.EventType == irr::EET_JOYSTICK_INPUT_EVENT
            && event.JoystickEvent.Axis[1] > 42)
{
SEvent myevent;
myevent.EventType = EET_KEY_INPUT_EVENT;
myevent.KeyInput.PressedDown = true;
myevent.KeyInput.Key = KEY_UP;
device->postEventFromUser(myevent);
}
else if (event.EventType == irr::EET_JOYSTICK_INPUT_EVENT
            && event.JoystickEvent.Axis[1] < 42)
{
SEvent myevent;
myevent.EventType = EET_KEY_INPUT_EVENT;
myevent.KeyInput.PressedDown = false;
myevent.KeyInput.Key = KEY_UP;
device->postEventFromUser(myevent);
}

Mais sa ne devrait pas solutionné ton bug donne ton code pour voir pour le bug ou un backtrace

Hors ligne


#8 

25-04-2009 02:06:03

mari-ion
Membre
Date d'inscription: 06-04-2009
Messages: 13

Non ca ne marche pas :'( snif
enfait j'ai un Game et un CeventREceiver le CeventReceiver
j'essaie donc de gerer les evenements du joystick dans le CeventReceiver

Code:

if (event.EventType == irr::EET_JOYSTICK_INPUT_EVENT
            && event.JoystickEvent.Axis[0] == -257)

    {
     std::cout << "axe stable" <<std::endl;
     j_droit = false;
      j_gauche = false;
      j_face = false;
      j_arriere = false;
    }

if (event.EventType == irr::EET_JOYSTICK_INPUT_EVENT
            && event.JoystickEvent.Axis[0] == 32767)

    {
     std::cout << "axe droite" <<std::endl;
     j_droit = true;
     j_gauche = false;
    }

    if (event.EventType == irr::EET_JOYSTICK_INPUT_EVENT
            && event.JoystickEvent.Axis[0] == -32768)

    {
     std::cout << "axe gauche" <<std::endl;
     j_gauche = true;
    }

    if (event.EventType == irr::EET_JOYSTICK_INPUT_EVENT
            && event.JoystickEvent.Axis[1] == -32768)

    {
SEvent myevent;
myevent.EventType = EET_KEY_INPUT_EVENT;
myevent.KeyInput.PressedDown = true;
myevent.KeyInput.Key = KEY_UP;
device->postEventFromUser(myevent);


     std::cout << "axe avant" <<std::endl;
     j_face = true;
     j_arriere = false;
    }

    if (event.EventType == irr::EET_JOYSTICK_INPUT_EVENT
            && event.JoystickEvent.Axis[1] == 32767)

    {
     std::cout << "axe arriere" <<std::endl;
     j_arriere= true;
     j_face = false;
    }

Aorés plusieurs tests avec le joystick j'ai trouve les "nombres" représentant le fait d'aller en avant, ou en arriére
(d'ou le -32768) j'ai verifié ca marche, je detecte le fait d'aller en avant en arriére a droite, mais le probleme c'est d'associer ce mouvement au mouvement de la caméra

Hors ligne


#9 

25-04-2009 03:29:44

dark calculator
Abonné
Date d'inscription: 25-02-2007
Messages: 153

il faut rajouter dans ton if pour l'axe stable :

Code:

SEvent myevent;
myevent.EventType = EET_KEY_INPUT_EVENT;
myevent.KeyInput.PressedDown = false;
myevent.KeyInput.Key = KEY_UP;
device->postEventFromUser(myevent);

Et dire si tu as un bug avec sa ou si sa marche pas.

Hors ligne


#10 

25-04-2009 17:04:47

mari-ion
Membre
Date d'inscription: 06-04-2009
Messages: 13

non malheureusement avec ca , des que je lance mon programme cela bug : fenêtre blanche
car en fait l'axe stable signifie que l'on touche pas le joystick, donc voila :'(
je pense que c'est cette histoire d'event qui bug ... mais je comprend pas pourquoi !

Hors ligne


#11 

25-04-2009 20:39:40

dark calculator
Abonné
Date d'inscription: 25-02-2007
Messages: 153

Comme sa je peut difficilement t'aider mais il est possible que ton bug soit du au fait que trop de event sont envoyés se qui fait tout laguer dans se cas il faut mettre un variable bool(push par exemple) et n'envoyer l'event que en cas de changement d'état :

Ce qui devrai donner :

Dans la class eventreceiver ou en global :

Code:

bool push = false

et dans la fonction OnEvent :

Code:

if ((event.EventType == irr::EET_JOYSTICK_INPUT_EVENT
            && event.JoystickEvent.Axis[0] == -257) && push)

    {
SEvent myevent;
myevent.EventType = EET_KEY_INPUT_EVENT;
myevent.KeyInput.PressedDown = false;
myevent.KeyInput.Key = KEY_UP;
device->postEventFromUser(myevent);
    }

    if ((event.EventType == irr::EET_JOYSTICK_INPUT_EVENT
            && event.JoystickEvent.Axis[1] == -32768) && !push)

    {
SEvent myevent;
myevent.EventType = EET_KEY_INPUT_EVENT;
myevent.KeyInput.PressedDown = true;
myevent.KeyInput.Key = KEY_UP;
device->postEventFromUser(myevent);
    }

Je te laisse adapter a ton code.

Hors ligne


#12 

25-04-2009 21:02:52

mari-ion
Membre
Date d'inscription: 06-04-2009
Messages: 13

voici un extrait de ma fonction onEvent:

Code:

bool CEventReceiver::OnEvent(const irr::SEvent &event)
{

if (event.EventType == irr::EET_JOYSTICK_INPUT_EVENT
            && event.JoystickEvent.Axis[0] == -257)

    {


     std::cout << "axe stable" <<std::endl;
     j_droit = false;
      j_gauche = false;
      j_face = false;
      j_arriere = false;
      j_stable =true;
    }

if (event.EventType == irr::EET_JOYSTICK_INPUT_EVENT
            && event.JoystickEvent.Axis[0] == 32767)

    {
     std::cout << "axe droite" <<std::endl;
     j_droit = true;
     j_gauche = false;
     j_stable = false;
     j_face = false;
     j_arriere = false;
    }

    if (event.EventType == irr::EET_JOYSTICK_INPUT_EVENT
            && event.JoystickEvent.Axis[0] == -32768)

    {
     std::cout << "axe gauche" <<std::endl;
     j_gauche = true;
     j_droit = false;
     j_stable = false;
     j_face = false;
     j_arriere = false;

    }

    if (event.EventType == irr::EET_JOYSTICK_INPUT_EVENT
            && event.JoystickEvent.Axis[1] == -32768  )

    {

     j_gauche = false;
     j_droit = false;
     j_stable = false;
     j_face = true;
     j_arriere = false;



     std::cout << "axe avant" <<std::endl;

    }

    if (event.EventType == irr::EET_JOYSTICK_INPUT_EVENT
            && event.JoystickEvent.Axis[1] == 32767)

    {
     std::cout << "axe arriere" <<std::endl;
     j_gauche = false;
     j_droit = false;
     j_stable = false;
     j_face = false;
     j_arriere = true;


    }
}

voici un extrait de la fonction :majPosMesh() (toujours dans le CeventReceiver)

Code:

void CEventReceiver::majPosMesh()
{

if (j_droit == true)

    {
     std::cout << "axe droit" <<std::endl;
          //On commence par recuperer la position actuelle
                            irr::core::vector3df v = m_camera->getRotation();
                            //On y ajoute la valeur de deplacement
                            v.Y += 3.0f;
                            //On renvoie la nouvelle position
                            m_camera->setRotation(v);

    }

    if (j_gauche == true)

    {
                                            //On commence par recuperer la position actuelle
                                            irr::core::vector3df rotation = m_camera->getRotation();
                                            //On y ajoute la valeur de deplacement
                                            rotation.Y -= 3.0f;
                                            //On renvoie la nouvelle position
                                            m_camera->setRotation(rotation);
                                            m_camera->setPosition(rotation);

    }

    if (j_face == true)

    {
//On commence par recuperer la position actuelle
                                          /* irr::core::vector3df v = m_camera->getPosition();
                                            //On y ajoute la valeur de deplacement
                                            v.X += 2.0f;
                                  //On renvoie la nouvelle position
                                            m_camera->setPosition(v);*/
SEvent myevent;
myevent.EventType = EET_KEY_INPUT_EVENT;
myevent.KeyInput.PressedDown = true;
myevent.KeyInput.Key = KEY_UP;
device->postEventFromUser(myevent);



    }

    if (j_arriere == true)

    {
    //On commence par recuperer la position actuelle
                                            irr::core::vector3df v = m_camera->getPosition();
                                            //On y ajoute la valeur de deplacement
                                            v.X -= 2.0f;
                                            //On renvoie la nouvelle position
                                           m_camera->setPosition(v);
    }

}

et dans mon Game dans la boucle de rendu j'ai :

Code:

Event.majPosMesh();

en dehors de la boucle de rendu, dans mon game

Code:

   CEventReceiver  Event(camera,device);
        device->setEventReceiver(Event);

Sinon je peux contourner le probleme en modifiant la camera avec des setPosition()... getPosition()
mais le probleme c'est qu'a chaque mouvement je doit changer le repére, car pour aller en avant et en arriere ca bouge que sur un axe..
c'est difficil a expliquer... desole :s
mais par exemple je vais tout droit puis je tourne : ok ca marche jusqu'a la
mais une fois tourner si je veux aller tout droit cela ne marchera pas puisque ca ne bougera pas sur le bon axe

ya t'il une fonction pour mettre a jour le repére selon la rotation de la camera?

merci de votre aide j'apprecie votre rapidité!!

Hors ligne


#13 

25-04-2009 22:23:21

dark calculator
Abonné
Date d'inscription: 25-02-2007
Messages: 153

Bon deux choses, déjà est ce que tu utilise une camera FPS?

Par ce que si c'est le cas on évite en général de la déplacé manuellement, en tous cas moi sa m'a toujours posé des problèmes.

Ensuite comme tu l'a déplace manuellement le postEventFromUser devient inutile.

En ce qui concerne ton histoire de "repère" en cherchant sur le forum tu trouvera surement d'autre topic sur le sujet voir des codes de camera fais maisons qui te serait surement très utile.

Enfin si mes souvenirs sont bon le principe est de travaillé avec la cible au lieu des rotations, on mets la cible a une distance de 1 à la base et pour se déplacer on calcule le vecteur cible - position et on additionne à la cible et à la position, et pour la rotation on fais tourner la cible autours de la position.

J'ai vu en lisant les posts que dans la dernière version d'Irrlicht on pouvait activé la rotation de la caméra qui ne l'est pas par défault donc il se peut qu'il y est d'autre manière plus de simple de voir les choses.

Sinon la lecture de ce topic pourait peut être t'intéréssé : http://forum.irrlicht.fr/viewtopic.php?id=828

Hors ligne


#14 

25-04-2009 22:50:01

mari-ion
Membre
Date d'inscription: 06-04-2009
Messages: 13

Oui j'utilise bien une caméra FPS
et si je la bouge manuellement c'est juste pour le joystick car je n'ai pas d'autre solution sad
je vais ce lien, et voir tu connais des autres caméra si je trouve quelque chose pour m'éclairer
c'est vraiment pas facil cette histoire de joystick !!!

Hors ligne


#15 

25-04-2009 23:33:00

mari-ion
Membre
Date d'inscription: 06-04-2009
Messages: 13

je voulais vous remercier
car grace a vous et a votre lien j'ai reussi a faire marcher mon joystick
merci merci merci
vous m'enlevez une aiguille du pied !
je suis trop contente!!!!!!

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
881 membres
1426 sujets
11116 messages
Dernier membre inscrit: Bidule
23 invités en ligne
Aucun membre connecté
RSS Feed