#0 

31-05-2011 21:04:40

defrgly
Membre
Date d'inscription: 09-07-2009
Messages: 14

Bonjour à tous,

Etant passionné de foot et d'informatique, je me suis mis dans la tête de faire une petite vidéo d'une action de football.
Donc, depuis quelques temps, je "m'amuse" avec irrlicht et c++ smile
J'ai découvert les objets md2 et les fameuses sydney qui court, marche et saute déjà comme une grande.
Cela est bien pour commencer et m'évite du coup de mettre les mains dans blender pour fabriquer mon propre md2.
J'ai réussi à la déplacer d'un point A à un autre point B en la faisant marcher puis courir etc...

Par contre, je bloque dès que je veux pousser la chose un peu plus loin.
Vu que je dois mettre 22 sydney dans la scène, je me suis dit "Tiens, si je faisais une classe joueur qui hériterait de IAnimatedMeshSceneNode".
Et là patatra, des erreurs car c'est une classe abstraite.
Je fais des recherches comme d'habitude sur mon ami google. Et je tombe une nouvelle fois (comme par hasard) sur ce forum : http://irrlicht-fr.org/viewtopic.php?id=1006
Du coup, je modifie mon header comme expliqué mais, sydney ne s'affiche pas dans la scène.

Bref, tout ça pour vous demander si ma méthode est la bonne. Si ce n'est pas le cas, pourriez-vous m'indiquer ce qui n'est pas bon.

Merci d'avance.
Nico

Hors ligne


#1 

01-06-2011 18:20:06

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

Salut,

Ta classe a-t-elle une méthode Render() ?


Force et sagesse...

Hors ligne


#2 

01-06-2011 21:22:24

defrgly
Membre
Date d'inscription: 09-07-2009
Messages: 14

Voici une partie de mon code.
J'ai bien render dans mon .h mais pas dans mon .cpp

Merci pour ton aide en tout cas.

Code c++ :

player.h


[...]
class Player : public IAnimatedMeshSceneNode
{
    public:
        Player(); // Constructeur
        Player(int x,int z); // Constructeur
        void move(int x, int z);
        void rotate(int x, int z);
        virtual void render();
        virtual const aabbox3d<float>& getBoundingBox() const;
        virtual ISceneNode* clone(ISceneNode* newParent=0, ISceneManager* newManager=0);
        [...]
        virtual void animateJoints(bool CalculateAbsolutePositions=true);
        virtual void setRenderFromIdentity( bool On );

    private:
        IAnimatedMeshSceneNode* node;

};
[...]





Code c++ :

player.cpp


#include "Player.h"

Player::Player()
{
    IAnimatedMeshSceneNode *node = smgr->addAnimatedMeshSceneNode(mesh);
    node->setMaterialFlag(EMF_LIGHTING, false);
    node->setMaterialTexture( 0, driver->getTexture("../../media/sydney.bmp") );
    node->setMD2Animation(scene::EMAT_RUN);
    node->setPosition(vector3df(0,0,0));
    node->setRotation(vector3df(0,0,0));
}

Player::Player(x,z)
{
    IAnimatedMeshSceneNode *node = smgr->addAnimatedMeshSceneNode(mesh);
    node->setMaterialFlag(EMF_LIGHTING, false);
    node->setMaterialTexture( 0, driver->getTexture("../../media/sydney.bmp") );
    node->setMD2Animation(scene::EMAT_RUN);
    node->setPosition(vector3df(x,0,z));
    node->setRotation(vector3df(0,0,0));
}


void Player::move(int x, int z)
{
    node->setPosition(vector3df(x,0,z));
}

void Player::rotate(int x, int y, int z)
{
    node->setRotation(vector3df(x,y,z));
}





Code c++ :

main.cpp


[...]
int main(int argc, char *argv[])
{
    IrrlichtDevice *device = createDevice(video::EDT_OPENGL,dimension2d<u32>(640, 480),16,false,false,false,0);

    if (!device)
        return 1;

    device->setWindowCaption(L"../../media/sydney.bmp");

    IVideoDriver *driver = device->getVideoDriver();
    ISceneManager *smgr = device->getSceneManager();
    IGUIEnvironment *guienv = device->getGUIEnvironment();

    guienv->addStaticText(L"../../media/sydney.bmp", rect<s32>(10,10,260,22), true);

    IAnimatedMesh *mesh = smgr->getMesh("Anim Foot");
    if (!mesh)
    {
        device->drop();
        return 1;
    }
    Player joueur1();
}
[...]

Dernière modification par defrgly (02-06-2011 09:31:56)

Hors ligne


#3 

01-06-2011 21:32:24

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

Hmm, j'suis pas persuadé que tu emprunte la bonne voie...

Dans ton constructeur, tu as smgr->addAnimatedMeshSceneNode(mesh);
'mesh' il vient d'ou ?


Force et sagesse...

Hors ligne


#4 

02-06-2011 09:31:39

defrgly
Membre
Date d'inscription: 09-07-2009
Messages: 14

J'ai édité mon post précédent, en mettant quasi en entier mon main.cpp où se trouve mon mesh.

Tu dis que je ne suis pas sur la bonne voie...
Comment penses-tu qu'il serait mieux de faire ?

Merci d'avance.

Hors ligne


#5 

02-06-2011 10:08:12

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

Salut smile

Pour ce qui est du mesh, je ne vois toujours pas comment tu le passe
à ton constructeur, ou alors il y a quelque chose qui m'a échappé...
Tu définis effectivement *mesh dans la fonction main, mais je ne vois
pas comment le paramètre est envoyé 'joueur1' ?

Sinon, si j'ai bien compris, tu cherches à gérer un certains nombre de joueur sur un terrain.
Créer une classe Player, c'est très bien, mais perso je n'en aurais pas fait une classe dérivée
de IAnimateMeshSceneNode.

Crées une classe bien à part, qui colle mieux à l'application que tu veux monter. Car ton player aura
certes une représentation graphique à l'écran, mais certainement aussi bien d'autre paramètre lié à son
intégration et son évolution dans le jeux.
En règle générale, on essais toujours de séparer autant que possible les éléments du programme que l'on
écris de ceux des librairies que l'on utilise, en particulier le moteur de rendu.

Donc tu écris une classe Player, qui contiendra un ensemble de données et de méthodes pour que tes joueurs
vivent leur vie dans ton jeux, dont un des éléments sera le lien avec l’élément graphique lié au moteur de rendu
(dans ton cas on va dire un AnimateMeshSceneNode), cela sera à mon sens bien plus facile en terme de lisibilité
et de maintient du code, et te causera moins de soucis de compréhension wink
(j'espère ne pas avoir été trop brouillon dans mon explication)


Force et sagesse...

Hors ligne


#6 

03-06-2011 19:02:55

defrgly
Membre
Date d'inscription: 09-07-2009
Messages: 14

Donc si je comprends bien, j'aurai 22 instances de AnimatedMeshSceneNode ?

Petite question : quelle est la différence entre IAnimatedMeshSceneNode et AnimatedMeshSceneNode (sans le I) ?

Ma classe Player possèdera des propriétés : coordonnées x et z.
Et des méthodes pour changer les x et z ?

Mais de quoi héritera ma classe ? AnimatedMeshSceneNode ou IAnimatedMeshSceneNode ?

Merci d'avance.

Hors ligne


#7 

04-06-2011 09:54:33

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

tu auras 22 Players, et évidement chacun aura son propre IAnimatedMeshSceneNode, ce qui est  normal vue que chacun de tes 22 joueurs doit pouvoir avoir des
comportements indépendants. Chacun des joueurs aura aussi un comportement propre au niveau IA (attaquant, gardien, etc...). Bref, ta classe Player est le socle
global reflétant l'enssemble des élément constituant chaque joueur, et pas seulement sur le plan graphique.
Et pourquoi veux nescesserement que cette classe hérite d'une autre ?

[PS] quand à IAnimatedMeshSceneNode et AnimatedMeshSceneNode, c'était un abus de langage dans mon message précédent, elle reflète globelement la même chose.


Force et sagesse...

Hors ligne


#8 

05-06-2011 11:18:01

defrgly
Membre
Date d'inscription: 09-07-2009
Messages: 14

En suivant tes conseils, voilà ce que ça donne si j'ai bien analysé tes dires.
En espérant que ça corresponde à ce que tu m'as expliqué.

J'ai créé une classe Player qui possède une seule donnée : IAnimatedMeshSceneNode* node
J'ai fait les constructeurs pour alimenter cette donnée.
Et j'ai fait 2 méthodes pour bouger le node (orientation et positionnement).



Code c++ :

player.h


[...]

class Player
{
    private:
        IAnimatedMeshSceneNode* node;

    public:
        Player(IAnimatedMesh* mesh); // Constructeur
        Player(IAnimatedMesh* mesh,int x,int z); // Constructeur
        void move(int x, int z);
        void rotate(int x, int z);
};

[...]





Code c++ :

player.cpp


#include "Player.h"

Player::Player(mesh)
{
    node = smgr->addAnimatedMeshSceneNode(mesh);
    node->setMaterialFlag(EMF_LIGHTING, false);
    node->setMaterialTexture( 0, driver->getTexture("../../media/sydney.bmp") );
    node->setMD2Animation(scene::EMAT_RUN);
    node->setPosition(vector3df(0,0,0));
    node->setRotation(vector3df(0,0,0));
}

Player::Player(mesh,x,z)
{
    node = smgr->addAnimatedMeshSceneNode(mesh);
    node->setMaterialFlag(EMF_LIGHTING, false);
    node->setMaterialTexture( 0, driver->getTexture("../../media/sydney.bmp") );
    node->setMD2Animation(scene::EMAT_RUN);
    node->setPosition(vector3df(x,0,z));
    node->setRotation(vector3df(0,0,0));
}


void Player::move(int x, int z)
{
    node->setPosition(vector3df(x,0,z));
}

void Player::rotate(int x, int y, int z)
{
    node->setRotation(vector3df(x,y,z));
}





Code c++ :

main.cpp


[...]
int main(int argc, char *argv[])
{
    IrrlichtDevice *device = createDevice(video::EDT_OPENGL,dimension2d<u32>(640, 480),16,false,false,false,0);

    if (!device)
        return 1;

    device->setWindowCaption(L"../../media/sydney.bmp");

    IVideoDriver *driver = device->getVideoDriver();
    ISceneManager *smgr = device->getSceneManager();
    IGUIEnvironment *guienv = device->getGUIEnvironment();

    guienv->addStaticText(L"../../media/sydney.bmp", rect<s32>(10,10,260,22), true);

    IAnimatedMesh *mesh = smgr->getMesh("Anim Foot");
    if (!mesh)
    {
        device->drop();
        return 1;
    }
    Player joueur1(mesh);
}
[...]




Mais du coup j'ai une erreur que je n'arrive pas à expliquer :

/tmp/ccujIpP3.o: In function `main':
main.cpp:(.text+0x20e): undefined reference to `Player::Player(irr::scene::IAnimatedMesh*)'

Hors ligne


#9 

05-06-2011 11:46:02

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

Dans le principe c'est mieux wink

Sinon ben c'est un peu normal, il faudrait que la définition de tes méthodes correspondent
à ton header, et donc déjà écrire:

Code c++ :

player.cpp
#include "Player.h"

Player::Player(IAnimatedMesh* mesh)
{
    node = smgr->addAnimatedMeshSceneNode(mesh);
    node->setMaterialFlag(EMF_LIGHTING, false);
    node->setMaterialTexture( 0, driver->getTexture("../../media/sydney.bmp") );
    node->setMD2Animation(scene::EMAT_RUN);
    node->setPosition(vector3df(0,0,0));
    node->setRotation(vector3df(0,0,0));
}

Player::Player(IAnimatedMesh* mesh, int x, int z)
{
...

Force et sagesse...

Hors ligne


#10 

05-06-2011 18:43:29

defrgly
Membre
Date d'inscription: 09-07-2009
Messages: 14

Ouais tu as raison, mes entêtes de constructeur étaient un peu erronés smile

Mais sinon, l'erreur est toujours la même... Une idée ?

Hors ligne


#11 

05-06-2011 18:56:26

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

essais plutôt un Player *joueur = new Player(mesh);


Force et sagesse...

Hors ligne


#12 

05-06-2011 19:28:43

defrgly
Membre
Date d'inscription: 09-07-2009
Messages: 14

C'est toujours pareil sad

Au risque de passer pour le relou de base... Pourquoi construire mon Player de cette manière ?

Hors ligne


#13 

05-06-2011 19:35:30

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

Ben en fait c'est selon chacun en fait, sur ce genre d'appli on passe souvent par les pointers de classes, mais tu architecture comme tu le sent wink
Sinon, la je vois pas oui peut être le problème au vu des élément que tu fournis.
Tu as bien un #include "Player.h" dans ton main.cpp des fois ?


Force et sagesse...

Hors ligne


#14 

06-06-2011 07:07:06

defrgly
Membre
Date d'inscription: 09-07-2009
Messages: 14

Oui j'ai bien ça...

Hors ligne


#15 

06-06-2011 21:08:10

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

éventuellement un problème de namespace ou de header Irrlicht, sinon je ne vois pas...


Force et sagesse...

Hors ligne


#16 

09-06-2011 21:00:10

defrgly
Membre
Date d'inscription: 09-07-2009
Messages: 14

J'avoue être bloqué...
tmyke, merci pour ton aide.

Sinon, il n'y a personne d'autre qui aurait une idée.

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
881 membres
1427 sujets
11117 messages
Dernier membre inscrit: Bidule
69 invités en ligne
Aucun membre connecté
RSS Feed