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
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 :
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
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
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&)'
:'(
Hors ligne
a ouai sorry il faut construire un event avant :
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
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
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.
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
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
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
il faut rajouter dans ton if pour l'axe stable :
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
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
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 :
bool push = false
et dans la fonction OnEvent :
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
voici un extrait de ma fonction onEvent:
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)
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 :
Event.majPosMesh();
en dehors de la boucle de rendu, dans mon game
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
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
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
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
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