#1 

26-01-2010 19:32:29

jonath313
Membres
Date d'inscription:
Messages: 240
IP: 195.221.123.215
Courriel

Tenez les ptits gars je suis généreux je vous donne mon travail qui a monopolisé mon petit cerveau de graphiste pour m'orienter vers la programmation.
Ce code sert au déplacement d'un personnage à la troisiéme personne et autorise le déplacement avant, arrière, droite et gauche dans la direction où le personnage s'auriente, en utilisant l'animation marcher.

Il est constitué de 3 fichier :

  • 1 main
  • 1 CEventReceiver.cpp
  • 1 CEventReceiver.h






CEventReceiver.hCEventReceiver.cppmain.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32


#include <irrlicht.h>

//Les namespaces nous évitent d'avoir toujours à recopier le parent de la classe qu'on appelle .Je sais , c'est pas bien ...
using namespace irr;
using namespace core;
using namespace gui;
using namespace video;
using namespace scene;

class CEventReceiver : public irr::IEventReceiver//On créé une classe CEventReceiver , fille de la classe IEventReceiver
{

public ://dans la partie publique , on va mettre les prototypes de nos fonctions

    CEventReceiver(irr::scene::IAnimatedMeshSceneNode* Nmodele);//On créé le constructeur , qui prend en parametre le node de notre modele(ici , Sydney , donc)
    virtual bool OnEvent(const irr::SEvent &event);//Cette fonction est lancée en cas d'évenement
    void majPosMesh();//On met à jour la position de notre mesh
    void majAnimMesh();//On met à jour l'animation du mesh , si besoin est

private ://dans la partie privée , on met nos attributs

    irr::scene::IAnimatedMeshSceneNode* m_Nmodele;//Le node que l'on va manipuler
    bool m_animrun;//Un booléen qui indique si l'animation du personnage est "courir"(EMAT_RUN) , ou pas
    bool m_isAvance;//Un booléen qui indique si on bouge , ou pas
    bool m_isRecule;
    bool m_isDroite;
    bool m_isGauche;
    bool m_isSauter;
};

voila il demande à être optimisé car je suis seulement débutant dans la programmation ... J'aimerais avoir vos avis svp merci smile


Hors ligne


#2 

26-01-2010 23:20:57

jonath313
Membres
Date d'inscription:
Messages: 240
IP: 195.221.123.215
Courriel

A oui j'oubliai, j'ai repris le tutorial de ramis pour le compléter par le changement de direction ! merci ramis !


Hors ligne


#3 

27-01-2010 09:56:35

Hawk
Membres
Date d'inscription:
Messages: 91
IP: 91.103.40.50
Courriel  Site web

Bon tutoriel, mais j'ai quelques questions/remarques.

Code c++ :


m_animrun=true;//et comme l'animation n'est du coup pas "courir" , on met notre booléen à false aussi

Ben pourquoi il est à True alors ? Faut d'inattention je suppose.

Code c++ :


if(m_Nmodele != 0 && m_isAvance == true)
    {
         c.X += speed * cos((d.Y) * 3.14 / 180);
         c.Z -= speed * sin((d.Y) * 3.14 / 180);
    }

    if(m_Nmodele != 0 && m_isRecule == true)
    {
        c.X -= speed * cos((d.Y) * 3.14 / 180);
        c.Z += speed * sin((d.Y) * 3.14 / 180);
    }


Là, il y a une petite optimisation à faire. Juste avant, tu a calculé diry qui est en fait d.Y en degré + 90°
or cos( a + 90) = - sin (a)
et sin (a + 90) = cos (a)

Donc cos (d.Y) = sin (diry)
et sin (d.Y) = - cos (diry)
(le tout en degré)

Du coup, ton code devient :

Code c++ :


if(m_Nmodele != 0 && m_isAvance == true)
    {
         c.X += speed * sin(diry);
         c.Z -= speed * - cos(diry));
    }

    if(m_Nmodele != 0 && m_isRecule == true)
    {
        c.X -= speed * sin(diry);
        c.Z += speed * -cos(diry);
    }

Enfin, ton code est juste quand même smile

Code c++ :


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


Là, j'ai l'impression que tu calcules un x, un y et un z que tu n'utilises pas . A quoi servent-ils ?


Hors ligne


#4 

27-01-2010 12:07:26

jonath313
Membres
Date d'inscription:
Messages: 240
IP: 195.221.123.215
Courriel

Dans mes dernière modif j'ai échangé EMAT_STAND et EMAT_RUN car la condition était à corriger :

m_Nmodele->setMD2Animation(EMAT_STAND);//on passe à l'animation "courir"

m_Nmodele->setMD2Animation(EMAT_RUN);//on arréte

Cependant je suis un vieu flémard c'est pour cela que j'ai pas changé les commentaires! wink

Effectivement tes améliorations sont juste mais bon pourquoi faire simple quand on peut faire compliqué ! non enfait c'est que j'ai posté ce code dès qu'il a été fonctionnel alors je ne l'ais pas optimisé directement.

Pour les variables qui ne servent à rien, effectivement elle servent à rien ... ce code à besoin d'être réorganisé et mis au propre car je suis un peu bordélique.


Hors ligne


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