Pages: 1
Bonjour,
Voici quelques temps que je m'amuser à tester les possibilités d'irrlicht, désirant aller un peu plus loin, j'aurais aimé créer un node personalisé ayant pour parent IAnimatedMeshSceneNode.
Malgré avoir suivi un tuto sur la création d'une classe personalisée pour les événements je bloque véritablement. (surtout au niveau des paramètres à passer)
Je cherche donc une piste, ou un bout de code que je pourrais prendre comme exemple pour la création de ma classe personalisée, car la, après moult essais infructueux rien n'a été concluent.
[PS] est-ce que je suis juste dans la création de ma classe et des paramètres du constructeur si on prend ce bout de code ? :
#ifndef CFPSANIMATEDNODE_H_INCLUDED #define CFPSANIMATEDNODE_H_INCLUDED // Include #include <irr/irrlicht.h> using namespace irr; using namespace scene; class CFPSAnimatedNode : public IAnimatedMeshSceneNode { public: CFPSAnimatedNode(ISceneNode* parent, ISceneManager* mgr, s32 id, const core::vector3df& position = core::vector3df(0,0,0), const core::vector3df& rotation = core::vector3df(0,0,0), const core::vector3df& scale = core::vector3df(1.0f, 1.0f, 1.0f)) : IAnimatedMeshSceneNode(parent, mgr, id, position, rotation, scale) {}; }; #endif // CFPSANIMATEDNODE_H_INCLUDED
Hors ligne
Ma première question est: que cherches-tu à faire en final avec ta classe dérivée de IAnimatedMeshSceneNode.
Et quel soucis exact as-tu avec les paramètres à passer. Tu parles d'essais infructueux, peux-tu donner un ou deux bout de ces
codes, cela aiderait peut-etre à mieux cerner ton impasse
Dernière modification par tmyke (03-10-2008 13:15:28)
Hors ligne
En fait, je chercherais à créer un type de node qui pourrait gérer les mesh animé (comme justement IAnimatedMeshSceneNode) mais qui pourrait en plus gérer des informations propre au mesh ou plutot au noeud.
En faite (bis) j'en suis au tuto officiel 7 nommé "Collision", et j'aurais aimé mettre ce code un peu à ma sauce, en permettant d'agire sur des variables propre au noeud, un peu de la manière ou lorsque le pointeur (le viseur) est sur une des fées on leur passe le setMaterialFlag à false.
en gros pouvoir faire sa (au clic de souris par exemple):
if (selectedSceneNode)
selectedSceneNode->setMaterialFlag(video::EMF_LIGHTING, false);
selectedSceneNode->diminueVie();
un noeud contenant des infomations comme la "vie" restante, et le fait qu'au dela d'un certain seuil (0) on supprime le node ou on affiche une autre frame, mais tout ceci à l'intérieur de cette classe pour après l'utiliser comme un node dans une classe de gestion d'événement.
oulala sa me semble pas trés clair tout sa, pourtant dans ma tête sa l'est
mon "blocus" se trouve plus simplement dans le fait que jusqu'a aujourd'hui je m'étais contenté d'utiliser les classes par défaut des bibliothèques, sans les modifier (sauf pour Qt), et que mes connaissances en la gestion de classes sont plutot basiques, il s'agit simplement d'un problême d'implémentation, je ne sais pas comment faire pour implémenter ma classe, voir la créer de manière juste, ou encore comment bien partir.
[EDIT] j'ai fait une classe perso pour les Evenements, quand j'appuie sur une touche je sais faire bouger un noeud, je voudrais dans ce cas la, ajouter un événement (le clic de la souris) (sa c'est ok je sais faire) et simplement à la place de faire monNode.X += newPosX faire monNode.diminueVie() (méthode de la classe que je sais pas comment implémenter)
Dernière modification par derrecks (03-10-2008 14:00:17)
Hors ligne
derrecks :
mon "blocus" se trouve plus simplement dans le fait que jusqu'a aujourd'hui je m'étais contenté d'utiliser les classes par défaut des bibliothèques, sans les modifier (sauf pour Qt), et que mes connaissances en la gestion de classes sont plutot basiques, il s'agit simplement d'un problême d'implémentation, je ne sais pas comment faire pour implémenter ma classe, voir la créer de manière juste, ou encore comment bien partir.
effectivement, c'est plus un soucis d'implémentation, car c'est en fait relativement simple, tu est d'ailleurs très proche de la solution.
tu peux ecrire donc sans problème :
class CFPSAnimatedNode : public IAnimatedMeshSceneNode { public: CFPSAnimatedNode(ISceneNode* parent, ISceneManager* mgr, s32 id, const core::vector3df& position = core::vector3df(0,0,0), const core::vector3df& rotation = core::vector3df(0,0,0), const core::vector3df& scale = core::vector3df(1.0f, 1.0f, 1.0f)) : IAnimatedMeshSceneNode(parent, mgr, id, position, rotation, scale) {}; void diminueVie(); int num_vie; };
et dans le code par exemple, il suffit d'ecrire:
CFPSAnimatedNode* node = 0;
par exemple à la place de
scene::IAnimatedMeshSceneNode* node = 0;
par contre, dans le reste du code il ne faut pas oublier l'adaptation du pointeur,
et ecrire ceci:
node = (CFPSAnimatedNode*) smgr->addAnimatedMeshSceneNode(faerie);
et donc en final, si tu ecris dans un endroit de ton code la sequence que tu donne en exemple
dans ton dernier message:
if (selectedSceneNode)
{ selectedSceneNode->setMaterialFlag(video::EMF_LIGHTING, false);
selectedSceneNode->diminueVie();
}
alors cela fonctionne sans soucis
Dernière modification par tmyke (03-10-2008 17:23:54)
Hors ligne
Merci pour ta réponse bien complète.
A vrai dire, je me suis mal expliqué, ce que je ne sais pas implémenter c'est le CFPSAnimatedNode.cpp
CFPSAnimatedNode::CFPSAnimatedNode(que mettre ici ?) { // le code }
en mettant ceci :
CFPSAnimatedNode::CFPSAnimatedNode(ISceneNode* parent, ISceneManager* mgr, s32 id, const core::vector3df& position = core::vector3df(0,0,0), const core::vector3df& rotation = core::vector3df(0,0,0), const core::vector3df& scale = core::vector3df(1.0f, 1.0f, 1.0f)) { // le code }
j'ai une erreur tel que : error: Redefinition of CFPSAnimatedNode(....)
Dernière modification par derrecks (04-10-2008 16:49:21)
Hors ligne
j'ecrirais plutôt:
Header
class CFPSAnimatedNode : public IAnimatedMeshSceneNode { public: CFPSAnimatedNode(ISceneNode* parent, ISceneManager* mgr, s32 id, const core::vector3df& position = core::vector3df(0,0,0), const core::vector3df& rotation = core::vector3df(0,0,0), const core::vector3df& scale = core::vector3df(1.0f, 1.0f, 1.0f)); };
et Methodes:
CFPSAnimatedNode::CFPSAnimatedNode(ISceneNode* parent, ISceneManager* mgr, s32 id, const core::vector3df& position, const core::vector3df& rotation, const core::vector3df& scale ) : IAnimatedMeshSceneNode(parent, mgr, id, position, rotation, scale) { code .... }
j'espère avoir mieux cerné ce qui te posait problème...
___________________________________________________________________________________________________
Ceci étant, plutôt que de passer par un héritage, pourquoi ne pas créer ta propre classe, décorrelée des classe d'Irrlicht,
genre:
class PersoPlayer
{
int num_vie;
IAnimatedMeshSceneNode *pNode;
PersoPlayer();
~PersoPlayer();
DiminueVie();
etc...
};
ce n'est qu'une suggestion....
Dernière modification par tmyke (04-10-2008 18:34:07)
Hors ligne
Un grand merci ! Désolé du malentendu, ce sont principalement mes connaissances en héritage qui me font défaut.
J'avais également pensé à créer une classe n'héritant pas d'une classe d'Irrlicht, mais cela me semblait plus simple de tout avoir dans un node, après ta première réponse ou tu me demandais pourquoi je voulais créer cette classe, n'ayant pas eu de remarque spéciale, je suis resté persuadé que j'étais "sur le bon chemin" du coup je n'ai pas été voir plus loin la seconde possibilité.
Dans un second temps sa me donne également une base "juste" pour créer des classes héritées d'Irrlicht, j'avais en gros besoin de voir un bout de code pour savoir comment partir, grace à sa, je devrais pouvoir me débrouiller plus ou moin convenablement avec cette bibliothèque.
C'est aussi et surtout sa que je cherchais à comprendre en faisant comme sa, bref, encore merci pour tes réponses et à bientôt
Hors ligne
Pas de soucis, c'est un plaisir, on est la pour s'entraider...
Hors ligne
Pages: 1