31-05-2011 19:04:40
- defrgly
- Membres
- Date d'inscription:
- Messages: 14
- IP: 88.169.0.182
- Courriel
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++ ![]()
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
01-06-2011 16:20:06
- tmyke
- Administrateurs

- Date d'inscription:
- Messages: 1025
- IP: 92.130.143.79
- Courriel
Salut,
Ta classe a-t-elle une méthode Render() ?
Force et sagesse...
Hors ligne
01-06-2011 19:22:24
- defrgly
- Membres
- Date d'inscription:
- Messages: 14
- IP: 88.169.0.182
- Courriel
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"Anim Foot");
IVideoDriver *driver = device->getVideoDriver();
ISceneManager *smgr = device->getSceneManager();
IGUIEnvironment *guienv = device->getGUIEnvironment();
guienv->addStaticText(L"OM - PSG", rect<s32>(10,10,260,22), true);
IAnimatedMesh *mesh = smgr->getMesh("../../media/sydney.md2");
if (!mesh)
{
device->drop();
return 1;
}
Player joueur1();
}
[...]Hors ligne
01-06-2011 19:32:24
- tmyke
- Administrateurs

- Date d'inscription:
- Messages: 1025
- IP: 92.130.143.79
- Courriel
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
02-06-2011 07:31:39
- defrgly
- Membres
- Date d'inscription:
- Messages: 14
- IP: 88.169.0.182
- Courriel
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
02-06-2011 08:08:12
- tmyke
- Administrateurs

- Date d'inscription:
- Messages: 1025
- IP: 92.130.143.79
- Courriel
Salut ![]()
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 ![]()
(j'espère ne pas avoir été trop brouillon dans mon explication)
Force et sagesse...
Hors ligne
03-06-2011 17:02:55
- defrgly
- Membres
- Date d'inscription:
- Messages: 14
- IP: 88.169.0.182
- Courriel
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
04-06-2011 07:54:33
- tmyke
- Administrateurs

- Date d'inscription:
- Messages: 1025
- IP: 92.130.143.79
- Courriel
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
05-06-2011 09:18:01
- defrgly
- Membres
- Date d'inscription:
- Messages: 14
- IP: 88.169.0.182
- Courriel
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"Anim Foot");
IVideoDriver *driver = device->getVideoDriver();
ISceneManager *smgr = device->getSceneManager();
IGUIEnvironment *guienv = device->getGUIEnvironment();
guienv->addStaticText(L"OM - PSG", rect<s32>(10,10,260,22), true);
IAnimatedMesh *mesh = smgr->getMesh("../../media/sydney.md2");
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
05-06-2011 09:46:02
- tmyke
- Administrateurs

- Date d'inscription:
- Messages: 1025
- IP: 86.218.242.157
- Courriel
Dans le principe c'est mieux ![]()
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
05-06-2011 16:43:29
- defrgly
- Membres
- Date d'inscription:
- Messages: 14
- IP: 88.169.0.182
- Courriel
Ouais tu as raison, mes entêtes de constructeur étaient un peu erronés ![]()
Mais sinon, l'erreur est toujours la même... Une idée ?
Hors ligne
05-06-2011 16:56:26
- tmyke
- Administrateurs

- Date d'inscription:
- Messages: 1025
- IP: 86.218.242.157
- Courriel
essais plutôt un Player *joueur = new Player(mesh);
Force et sagesse...
Hors ligne
05-06-2011 17:28:43
- defrgly
- Membres
- Date d'inscription:
- Messages: 14
- IP: 88.169.0.182
- Courriel
C'est toujours pareil ![]()
Au risque de passer pour le relou de base... Pourquoi construire mon Player de cette manière ?
Hors ligne
05-06-2011 17:35:30
- tmyke
- Administrateurs

- Date d'inscription:
- Messages: 1025
- IP: 86.218.242.157
- Courriel
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 ![]()
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
06-06-2011 05:07:06
- defrgly
- Membres
- Date d'inscription:
- Messages: 14
- IP: 195.218.8.42
- Courriel
Oui j'ai bien ça...
Hors ligne
06-06-2011 19:08:10
- tmyke
- Administrateurs

- Date d'inscription:
- Messages: 1025
- IP: 90.56.196.224
- Courriel
éventuellement un problème de namespace ou de header Irrlicht, sinon je ne vois pas...
Force et sagesse...
Hors ligne
09-06-2011 19:00:10
- defrgly
- Membres
- Date d'inscription:
- Messages: 14
- IP: 88.169.0.182
- Courriel
J'avoue être bloqué...
tmyke, merci pour ton aide.
Sinon, il n'y a personne d'autre qui aurait une idée.
Hors ligne



