Historique des modifications - Message

Message #6060

Sujet: Mouvement & Caméra FPS


Type Date Auteur Contenu
Création du message 20-02-2009 13:40:33 NeoCrysis
Ah, je ne pense pas être la meilleure personne pour t'aider wink

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
    }
}

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
152 invités en ligne
membre en ligne: -
RSS Feed