Ah, je ne pense pas être la meilleure personne pour t'aider

J'ai viré la 3ème personne, je me concentre sur l'utile !
J'ai éclaircis un peu le code, je reposte si jamais ça interesse des débutants qui auront autant merdouillé que moi ^^
Ne pas tenir compte de la fonction pour avoir Sydney qui court, c'est en cours ...
CEventReceiver.h#ifndef H_EVENT
#define H_EVENT
#include <IRR/irrlicht.h>
#include "Demo.h"
class CEventReceiver : public irr::IEventReceiver
{
public :
//Le constructeur.
CEventReceiver(irr::scene::IAnimatedMeshSceneNode* Nmodele);
//Capte automatiquement les events.
bool OnEvent(const irr::SEvent &event);
//Met a jour la position du mesh.
void majPosMesh(irr::scene::ICameraSceneNode &camera);
void majAnimMesh(); //On met à jour l'animation du mesh , si besoin est
private :
//Le modele qu'on va controler.
irr::scene::IAnimatedMeshSceneNode* m_Nmodele;
char touche;
//Indique si on est deja en mouvement ou pas.
bool m_isMoving;
bool m_animrun;
struct SCamKeyMap
{
SCamKeyMap() {};
SCamKeyMap(s32 a, EKEY_CODE k) : action(a), keycode(k) {}
s32 action;
EKEY_CODE keycode;
};
core::array<SCamKeyMap> KeyMap;
bool CursorKeys[6];
};
#endif
CEventReceiver.cpp#include "CEventReceiver.h"
#include "Demo.h"
#include <iostream>
using namespace std;
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;
int speed = 5;
CEventReceiver::CEventReceiver(scene::IAnimatedMeshSceneNode* Nmodele)
{
cout << "--> Construction evenement" << endl;
//On pointe le mesh passe en parametre.
m_Nmodele = Nmodele;
//Par defaut on ne bouge pas
m_isMoving = false;
m_animrun = false;
KeyMap.push_back(SCamKeyMap(0, irr::KEY_KEY_Z));
KeyMap.push_back(SCamKeyMap(1, irr::KEY_KEY_S));
KeyMap.push_back(SCamKeyMap(2, irr::KEY_KEY_Q));
KeyMap.push_back(SCamKeyMap(3, irr::KEY_KEY_D));
KeyMap.push_back(SCamKeyMap(4, irr::KEY_SPACE));
KeyMap.push_back(SCamKeyMap(5, irr::KEY_CONTROL));
KeyMap.push_back(SCamKeyMap(6, irr::KEY_ESCAPE));
}
bool CEventReceiver::OnEvent(const irr::SEvent &event)
{
if(m_Nmodele != 0 && event.EventType == irr::EET_KEY_INPUT_EVENT)
{ // Recherche de la touche associee
s32 cnt = (s32)KeyMap.size(); // nombre de touches enregistrees
for (s32 i=0; i<cnt; ++i)
if (KeyMap[i].keycode == event.KeyInput.Key) // si la touche est enregistree
{
CursorKeys[KeyMap[i].action] = event.KeyInput.PressedDown; // on enregistre la pression
m_isMoving = true; // mouvement detecte
return event.KeyInput.PressedDown; // on renvoie la pression
}
return false;
} else
return false;
}
void CEventReceiver::majPosMesh(irr::scene::ICameraSceneNode &camera)
{
if(m_Nmodele != 0 && m_isMoving == true)
{ // Mouvement en cours
core::vector3df c = m_Nmodele->getPosition(); // Position du modele
core::vector3df d = m_Nmodele->getRotation(); // Rotation du modele
float diry = ((d.Y+90)*3.14)/180;
if (CursorKeys[0]) // Si on veut avancer
{
c.X += speed * cos((d.Y) * 3.14 / 180);
c.Z -= speed * sin((d.Y) * 3.14 / 180);
}
if (CursorKeys[1]) // Si on veut reculer
{
c.X -= speed * cos((d.Y) * 3.14 / 180);
c.Z += speed * sin((d.Y) * 3.14 / 180);
}
if (CursorKeys[2]) // Si on va a gauche
{
//d.Y -= 0.1;
c.Z += speed * cos((d.Y) * 3.14 / 180);
c.X += speed * sin((d.Y) * 3.14 / 180);
}
if (CursorKeys[3]) // Si on va a droite
{
//d.Y += 0.1;
c.Z -= speed * cos((d.Y) * 3.14 / 180);
c.X -= speed * sin((d.Y) * 3.14 / 180);
}
if (CursorKeys[4]) // Si on veut monter
{
c.Y += 5.0f;
}
if (CursorKeys[5]) // Si on veut monter
{
c.Y -= 5.0f;
}
m_Nmodele->setRotation(d);
int xf = (c.X-sin(diry)*125);
int yf = (c.Z-cos(diry)*125);
int zf = 100;
m_Nmodele->setPosition(c);
m_isMoving = false;
//camera.setPosition(m_Nmodele->getPosition() + core::vector3df(0,25,0));
}
}
void CEventReceiver::majAnimMesh()//Ici , on met à jour l'animation
{
cout << "m_isMoving="<< m_isMoving << " || m_animrun="<< m_animrun << endl;
if(m_isMoving == true && m_animrun == false) //Si le pointeur vers le mesh est ok , si l'on bouge et si l'on n'a pas encore mis à jour l'animation ...
{
m_Nmodele->setMD2Animation(EMAT_RUN);//on passe à l'animation "courir"
m_animrun=true;//on declare que l'animation courir est bien en trainde se derouler
}
if(m_isMoving == false && m_animrun == true) //Si le pointeur vers le mesh est ok , si l'on ne bouge plus et si l'on n'a pas encore mis à jour l'animation ...
{
m_Nmodele->setMD2Animation(EMAT_STAND);//on passe à l'animation "rester en place"
m_animrun=false;//et on declare que l'animation courir ne se deroule plus , du coup
}
}