Historique des modifications - Message

Message #6057

Sujet: Mouvement & Caméra FPS


Type Date Auteur Contenu
Dernière modification 20-02-2009 11:24:23 NeoCrysis
EDIT : Il semblerait que j'ai trouvé une solution (un code que j'ai trouvé sur siteduzero.com), si ça fonctionne bien, je posterai mon code smile (ne pas tenir compte de la suite)

Merci de m'avoir répondu Capry smile
J'ai effectivement la fonction initKeys, que j'ai supprimé dans le .cpp car que je la laisse ou je la supprime je pouvais toujours bouger. (une bourde ?)
J'ai bien compris ton idée mais un petit bout de code me rassurerai smile

Je viens de voir que je n'ai pas donné tout le code !
Voici le CEventReceiver.cpp (et .h) manquant : (c'est de la grosse bidouille, je n'ai pas cherché à optimiser en faisant des boucles ou des tableaux pour les touches, j'ai fais au plus simple)
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;

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


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

    if(m_Nmodele != 0 && event.EventType == irr::EET_KEY_INPUT_EVENT && event.KeyInput.PressedDown == true)
    { // Recherche de la touche associee
        if(m_isMoving == false) {
            switch(event.KeyInput.Key) {
                case irr::KEY_KEY_Z:
                    touche = irr::KEY_KEY_Z;
                    break;
                case irr::KEY_KEY_S:
                    touche = irr::KEY_KEY_S;
                    break;
                case irr::KEY_KEY_Q:
                    touche = irr::KEY_KEY_Q;
                    break;
                case irr::KEY_KEY_D:
                    touche = irr::KEY_KEY_D;
                    break;
                case irr::KEY_SPACE:
                    touche = irr::KEY_SPACE;
                    break;
                case irr::KEY_CONTROL:
                    touche = irr::KEY_CONTROL;
                    break;
                default:;
            }
            m_isMoving = true; // Mouvement detecte
        }
        return true;
    }
    // Event non traite
    return false;

}


void CEventReceiver::majPosMesh(irr::scene::ICameraSceneNode &camera, bool thirdPerson)
{
    if(m_Nmodele != 0 && m_isMoving == true)
    { // Mouvement en cours
        core::vector3df v = m_Nmodele->getPosition(); // Recuperation position actuelle
        switch(touche) { // Valeur deplacement
            case irr::KEY_KEY_Z:
                v.X += 2.0f;
                break;
            case irr::KEY_KEY_S:
                v.X -= 2.0f;
                break;
            case irr::KEY_KEY_D:
                v.Z -= 2.0f;
                break;
            case irr::KEY_KEY_Q:
                v.Z += 2.0f;
                break;
            case irr::KEY_SPACE:
                v.Y += 5.0f;
                break;
            case irr::KEY_CONTROL:
                v.Y -= 5.0f;
                break;
            default:;
        }
        m_isMoving = false;
        core::vector3df direction = m_Nmodele->getRotation().rotationToDirection(v);
        //m_Nmodele->setPosition(m_Nmodele->getPosition() + direction);
        m_Nmodele->setPosition(v); // On renvoie la nouvelle position
        if(!thirdPerson)
            camera.setPosition(m_Nmodele->getPosition() + core::vector3df(0,25,0));

        cout << "Mouvement" << endl;
    }

}

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, bool thirdPerson = false);

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;

};
#endif
Création du message 20-02-2009 11:02:22 NeoCrysis
EDIT : Il semblerait que j'ai trouvé une solution (un code que j'ai trouvé sur siteduzero.com), si ça fonctionne bien, je posterai mon code smile (ne pas tenir compte de la suite)

Merci de m'avoir répondu Capry smile
J'ai effectivement la fonction initKeys, que j'ai supprimé dans le .cpp car que je la laisse ou je la supprime je pouvais toujours bouger. (une bourde ?)
J'ai bien compris ton idée mais un petit bout de code me rassurerai smile

Je viens de voir que je n'ai pas donné tout le code !
Voici le CEventReceiver.cpp (et .h) manquant : (c'est de la grosse bidouille, je n'ai pas cherché à optimiser en faisant des boucles ou des tableaux pour les touches, j'ai fais au plus simple)
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;

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


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

    if(m_Nmodele != 0 && event.EventType == irr::EET_KEY_INPUT_EVENT && event.KeyInput.PressedDown == true)
    { // Recherche de la touche associee
        if(m_isMoving == false) {
            switch(event.KeyInput.Key) {
                case irr::KEY_KEY_Z:
                    touche = irr::KEY_KEY_Z;
                    break;
                case irr::KEY_KEY_S:
                    touche = irr::KEY_KEY_S;
                    break;
                case irr::KEY_KEY_Q:
                    touche = irr::KEY_KEY_Q;
                    break;
                case irr::KEY_KEY_D:
                    touche = irr::KEY_KEY_D;
                    break;
                case irr::KEY_SPACE:
                    touche = irr::KEY_SPACE;
                    break;
                case irr::KEY_CONTROL:
                    touche = irr::KEY_CONTROL;
                    break;
                default:;
            }
            m_isMoving = true; // Mouvement detecte
        }
        return true;
    }
    // Event non traite
    return false;

}


void CEventReceiver::majPosMesh(irr::scene::ICameraSceneNode &camera, bool thirdPerson)
{
    if(m_Nmodele != 0 && m_isMoving == true)
    { // Mouvement en cours
        core::vector3df v = m_Nmodele->getPosition(); // Recuperation position actuelle
        switch(touche) { // Valeur deplacement
            case irr::KEY_KEY_Z:
                v.X += 2.0f;
                break;
            case irr::KEY_KEY_S:
                v.X -= 2.0f;
                break;
            case irr::KEY_KEY_D:
                v.Z -= 2.0f;
                break;
            case irr::KEY_KEY_Q:
                v.Z += 2.0f;
                break;
            case irr::KEY_SPACE:
                v.Y += 5.0f;
                break;
            case irr::KEY_CONTROL:
                v.Y -= 5.0f;
                break;
            default:;
        }
        m_isMoving = false;
        core::vector3df direction = m_Nmodele->getRotation().rotationToDirection(v);
        //m_Nmodele->setPosition(m_Nmodele->getPosition() + direction);
        m_Nmodele->setPosition(v); // On renvoie la nouvelle position
        if(!thirdPerson)
            camera.setPosition(m_Nmodele->getPosition() + core::vector3df(0,25,0));

        cout << "Mouvement" << endl;
    }

}

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, bool thirdPerson = false);

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;

};
#endif

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