#1 

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++ 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


#2 

01-06-2011 16:20:06

tmyke
Administrateurs
Avatar de tmyke
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


#3 

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


#4 

01-06-2011 19:32:24

tmyke
Administrateurs
Avatar de tmyke
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


#5 

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


#6 

02-06-2011 08:08:12

tmyke
Administrateurs
Avatar de tmyke
Date d'inscription:
Messages: 1025
IP: 92.130.143.79
Courriel

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


#7 

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


#8 

04-06-2011 07:54:33

tmyke
Administrateurs
Avatar de tmyke
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


#9 

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


#10 

05-06-2011 09:46:02

tmyke
Administrateurs
Avatar de tmyke
Date d'inscription:
Messages: 1025
IP: 86.218.242.157
Courriel

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


#11 

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 smile

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


Hors ligne


#12 

05-06-2011 16:56:26

tmyke
Administrateurs
Avatar de tmyke
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


#13 

05-06-2011 17:28:43

defrgly
Membres
Date d'inscription:
Messages: 14
IP: 88.169.0.182
Courriel

C'est toujours pareil sad

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


Hors ligne


#14 

05-06-2011 17:35:30

tmyke
Administrateurs
Avatar de tmyke
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 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


#15 

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


#16 

06-06-2011 19:08:10

tmyke
Administrateurs
Avatar de tmyke
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


#17 

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


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