#0 

25-01-2010 23:36:49

jonath313
Abonné
Date d'inscription: 28-12-2009
Messages: 240

Je suis entrein de faire le déplacement d'un objet en 3d mais je n'arrive pas à le faire aler dans la direction où il pointe j'ai essayer multiples methodes mais je ne trouve pas, j'ai essayer de faire une rotation progressive pedant un déplacement à droite ou à guauche mais je me suis aperçu que l'objet ne tournait pas autour de lui même mais autour d'un orbite par raport à la caméra ...

Mon code il y a pas grand chose mais au cas où :

#include "CEventReceiver2.h"

CEventReceiver::CEventReceiver(irr::scene::IAnimatedMeshSceneNode* Nmodele)//revoilà notre constructeur smile
{
    m_Nmodele = Nmodele;//On pointe le mesh passe en parametre.
    m_isAvance = false;//Par défaut , le modele est immobile .Donc le booléen qui indique si l'on bouge est à false
    m_animrun=true;//et comme l'animation n'est du coup pas "courir" , on met notre booléen à false aussi
    m_isRecule=false;
    m_isDroite=false;
    m_isGauche=false;
}


bool CEventReceiver::OnEvent(const irr::SEvent &event)//En cas d'évenement :
{
    //On verifie que le pointeur est ok
    if(m_Nmodele != 0
    //Qu'il s'agit d'un event concernant un appui/relachement de touche
    && event.EventType == irr::EET_KEY_INPUT_EVENT
    //Qu'il s'agit bien de la touche z
    && event.KeyInput.Key == irr::KEY_KEY_Z)
    {
        //Si il s'agit d'un appui
        if(event.KeyInput.PressedDown == true)
            m_isAvance = true;//On passe notre booléen "est en train de bouger" à true


        //Sinon c'est un relachement
        else
            m_isAvance = false;//Donc , comme on doit s'arrêter , on met ce même booléen à false
        //L'event est traite, on retourne true
        return true;
    }
    //Si on arrive la, c'est qu'on a pas traite l'event , donc on retourne false

  if(m_Nmodele != 0  && event.EventType == irr::EET_KEY_INPUT_EVENT && event.KeyInput.Key == irr::KEY_KEY_S)
    {
        if(event.KeyInput.PressedDown == true)
            m_isRecule = true;
        else
            m_isRecule = false;
        return true;
    }
    //Si on arrive la, c'est qu'on a pas traite l'event , donc on retourne false

    if(m_Nmodele != 0  && event.EventType == irr::EET_KEY_INPUT_EVENT && event.KeyInput.Key == irr::KEY_KEY_D)
    {
        if(event.KeyInput.PressedDown == true)
            m_isDroite = true;
        else
            m_isDroite = false;
        return true;
    }
    //Si on arrive la, c'est qu'on a pas traite l'event , donc on retourne false

    if(m_Nmodele != 0  && event.EventType == irr::EET_KEY_INPUT_EVENT && event.KeyInput.Key == irr::KEY_KEY_Q)
    {
        if(event.KeyInput.PressedDown == true)
            m_isGauche = true;
        else
            m_isGauche = false;
        return true;
    }
    //Si on arrive la, c'est qu'on a pas traite l'event , donc on retourne false

    return false;
}


void CEventReceiver::majPosMesh()//revoilà notre chère fonction de mise à jour de la position
{
    //On verifie que le pointeur vers le mesh est
    //ok et que la touche est enfoncee
    if(m_Nmodele != 0 && m_isAvance == true)
    {
       //On commence par recuperer la position actuelle
        irr::core::vector3df v = m_Nmodele->getPosition();

        //On y ajoute la valeur de deplacement
        v.Z += 0.1f;
        //On renvoie la nouvelle position .Sydney va avancer !!!
        m_Nmodele->setPosition(v);
    }


    if(m_Nmodele != 0 && m_isRecule == true)
    {
        irr::core::vector3df v = m_Nmodele->getPosition();
        v.Z -= 1.1f;
        m_Nmodele->setPosition(v);
    }

       if(m_Nmodele != 0 && m_isDroite == true)
    {
        //irr::core::vector3df v = m_Nmodele->getPosition();
       // v.X += 1.1f;
       // m_Nmodele->setPosition(v);
        irr::core::vector3df w = m_Nmodele->getRotation();
        w.Y += 0.1f;
        m_Nmodele->setRotation(w);


    }

        if(m_Nmodele != 0 && m_isGauche == true)
    {
       // irr::core::vector3df v = m_Nmodele->getPosition();
       // v.X -= 1.1f;
       // m_Nmodele->setPosition(v);
        irr::core::vector3df w = m_Nmodele->getRotation();
        w.Y -= 0.1f;
        m_Nmodele->setRotation(w);
    }
}

void CEventReceiver::majAnimMesh()//Ici , on met à jour l'animation
{
    if(m_Nmodele != 0 && m_isAvance == 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_STAND);//on passe à l'animation "courir"
        m_Nmodele->setFrameLoop(1,44);
        m_Nmodele->setAnimationSpeed(22);
        m_animrun=true;//on declare que l'animation courir est bien en trainde se derouler
    }
        if(m_Nmodele != 0 && m_isAvance == 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_RUN);//on passe à l'animation "rester en place"
        m_animrun=false;//et on declare que l'animation courir ne se deroule plus , du coup
    }



}

Merci pour vôtre aide

Hors ligne


#1 

26-01-2010 20:18:56

jonath313
Abonné
Date d'inscription: 28-12-2009
Messages: 240

C'est bon laissez faire je me suis déchiré le cerveau et j'ai trouvé une solution bourrine certe mais elle fonctionne !

Je vous file çà dans une autre section les ptits gars !

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
883 membres
1429 sujets
11121 messages
Dernier membre inscrit: Saidov17
44 invités en ligne
Aucun membre connecté
RSS Feed