Salut !
Je débute avec Irrlicht et j'ai faire une petite scène en 3D.
Mon but étant de faire un projet en 3D isomètrique, je me suis lancé dans la conception de la caméra.
J'ai donc chargé un model fourni avec Irrlicht: dwarf.x. Tant que je gère pas les événements, tout va bien. Mais dès que j'utilise la classe fourni dans le tuto EventReceiver, ça me met une erreur de segmentation lors du chargement du .x.
J'avoue que je suis un peu perdu.
Code:
#include <Irrlicht/irrlicht.h> using namespace irr; using namespace core; using namespace scene; using namespace video; using namespace io; using namespace gui; IrrlichtDevice *irr_device; IVideoDriver *video_driver; ISceneManager *scene_manager; IGUIEnvironment *env_manager; ICameraSceneNode *camera; int x = 0, y = 0, z = 0; IAnimatedMeshSceneNode *Dwarf; IAnimatedMeshSceneNode *Dwarf2; class EventReceiver : public IEventReceiver { public: virtual bool OnEvent(SEvent event) { if (event.EventType == irr::EET_KEY_INPUT_EVENT&& !event.KeyInput.PressedDown) { switch(event.KeyInput.Key) { case KEY_KEY_W: { y++; } return true; case KEY_KEY_S: { y--; } return true; case KEY_KEY_Q: { x--; } return true; case KEY_KEY_D: { x++; } return true; } } return false; } }; void init_irrlicht() { EventReceiver event; irr_device = createDevice(EDT_DIRECT3D9, dimension2d<s32>(640,480), 32, false, false, false, &event); irr_device->setWindowCaption(L"Irrlicht Test App"); video_driver = irr_device->getVideoDriver(); scene_manager = irr_device->getSceneManager(); env_manager = irr_device->getGUIEnvironment(); irr_device->getCursorControl()->setVisible(false); camera = scene_manager->addCameraSceneNode(); camera->setPosition(vector3df(580, 520, 350)); camera->setTarget(vector3df(0,0,0)); } void irrlicht_loop() { int last_fps = -1; while (irr_device->run()) { video_driver->beginScene(true, true, SColor(128, 128, 64, 32)); scene_manager->drawAll(); env_manager->drawAll(); video_driver->endScene(); int fps = video_driver->getFPS(); stringw driver_name = video_driver->getName(); Dwarf->setPosition(vector3df(x,y,z)); if (last_fps != fps) { stringw tmp; tmp += "FPS: "; tmp += fps; tmp += "; Driver: "; tmp += driver_name; env_manager->clear(); env_manager->addStaticText(tmp.c_str(), rect<int>(10,450,630,465), true, false, 0, -1, true); stringw pos; pos += "Position: X: "; pos += camera->getAbsolutePosition().X; pos += "; Y: "; pos += camera->getAbsolutePosition().Y; pos += "; Z: "; pos += camera->getAbsolutePosition().Z; env_manager->addStaticText(pos.c_str(), rect<int>(10,10,630,23), true, false, 0, -1, true); stringw target; target += "Target: X: "; target += camera->getTarget().X; target += "; Y: "; target += camera->getTarget().Y; target += "; Z: "; target += camera->getTarget().Z; env_manager->addStaticText(target.c_str(), rect<int>(10,27,630,40), true, false, 0, -1, true); last_fps = fps; } } } void load_mesh() { IAnimatedMeshX *DwarfX = (IAnimatedMeshX *)scene_manager->getMesh("Data/dwarf.x"); DwarfX->setCurrentAnimation("Attack"); Dwarf = scene_manager->addAnimatedMeshSceneNode(DwarfX); Dwarf->setRotation(core::vector3df(270,90,0)); Dwarf->setMaterialFlag(video::EMF_LIGHTING,false); Dwarf->setPosition(vector3df(0,0,0)); Dwarf->setRotation(vector3df(0,0,0)); Dwarf->setAnimationSpeed(50); Dwarf2 = scene_manager->addAnimatedMeshSceneNode(DwarfX); Dwarf2->setRotation(core::vector3df(270,90,0)); Dwarf2->setMaterialFlag(video::EMF_LIGHTING,false); Dwarf2->setPosition(vector3df(200,0,0)); Dwarf2->setRotation(vector3df(0,0,0)); Dwarf2->setAnimationSpeed(50); } void clean_up() { irr_device->drop(); } int main () { init_irrlicht(); load_mesh(); //load_map(); irrlicht_loop(); clean_up(); return 0; }
J'ai également une autre question (mais hors sujet) : Comment connaître les noms des animations disponibles du model ? Car j'ai essayé "Attack", "Walk" ou autre et j'obtiens toujours la même animation.
Merci pour votre aide.
Dernière modification par Manfeukou (18-04-2007 19:00:36)
Hors ligne
Manfeukou :
J'ai donc chargé un model fourni avec Irrlicht: dwarf.x. Tant que je gère pas les événements, tout va bien. Mais dès que j'utilise la classe fourni dans le tuto EventReceiver, ça me met une erreur de segmentation lors du chargement du .x.
je t'avoue que j'ai moi aussi un peu de mal avec la fonction OnEvent, elle est assez déclicate a coder, mon conseil va se résumer te dire de prendre le code de l'exemple et de le réutiliser en changeant encore moins de choses, pour un meilleur conseil; je vais laisser quelqu'un de plus doué te répondre
Manfeukou :
J'ai également une autre question (mais hors sujet) : Comment connaître les noms des animations disponibles du model ? Car j'ai essayé "Attack", "Walk" ou autre et j'obtiens toujours la même animation.
ca ne marche que si tu utilise le format MD2, pour une méthode totalement portable sur tout les types de modèles, utilise setframeloop
ton personnage a un nombre fini de mouvements pour toutes ses animations mises a la suite (ca fait parfois 1000 frames)
si tu n'en spécifie aucune, ou si tu la spécifie mal, elles sont toutes jouées a la suite (de la frame 0 a la 1000)
Chaque animation est une suite de frames, par exemple de la 50 a la 100 ca correspond a "courir" de la 100 a la 200 c'est "tomber" etc
Mais rien ne t'empeche de jouer l'animation de la frame 70 a la 125 (il va un peu courir et un peu tomber, )
ca marche comme ca :
IAnimatedMesh* mesh = smgr->getMesh("media/sydney.md2"); IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh ); // on définit la boucle d'animation node->setFrameLoop(1,200);
a noter que l'animation va etre jouée en boucle (normal, vu que la fonction s'appelle setframeloop ), si tu veux éviter cela, tu utilise setLoopMode(false)
Dernière modification par Jerry Kan (19-04-2007 16:13:14)
Hors ligne
Merci pour la petite explication, ça me servira pour plus tard.
Bon, j'ai repris le code de l'exemple et je l'ai modifié. Plus de seg fault apparement. Sujet résolu même si je sais tjs pas pourquoi.
Hors ligne
Je pense que t'as pas besoin de faire un cast ici (ca doit être ton erreur je suppose) :
IAnimatedMeshX *DwarfX = (IAnimatedMeshX *)scene_manager->getMesh("Data/dwarf.x");
DwarfX->setCurrentAnimation("Attack");
A mon avis, tu ferais mieux d'écrire ceci :
IAnimatedMesh* DwarfX = scene_manager->getMesh("Data/dwarf.x");
DwarfX->setCurrentAnimation("Attack");
Vu que la classe IAnimatedMeshX dérive de IAnimatedMesh, ca devrait pas poser de problème.
Hors ligne
Perceval :
Je pense que t'as pas besoin de faire un cast ici (ca doit être ton erreur je suppose) :
IAnimatedMeshX *DwarfX = (IAnimatedMeshX *)scene_manager->getMesh("Data/dwarf.x");
DwarfX->setCurrentAnimation("Attack");
A mon avis, tu ferais mieux d'écrire ceci :IAnimatedMesh* DwarfX = scene_manager->getMesh("Data/dwarf.x");
DwarfX->setCurrentAnimation("Attack");
Vu que la classe IAnimatedMeshX dérive de IAnimatedMesh, ca devrait pas poser de problème.
Pourtant il y a une erreur sans cast.
Hors ligne
Tu es sur d'avoir bien tapé ce que j'ai mis ? Parce que c'est texto un bout du tutorial 8.
Hors ligne
Manfeukou :
Pourtant il y a une erreur sans cast.
ca dépends beaucoup du compilateur et des options, donc ..
Hors ligne
De toute façon, le seg fault, se faisait même si j'enlevais IAnimatedMesh et que je faisais le getMesh() directement.
Hors ligne
Options | Liens officiels | Caractéristiques | Statistiques | Communauté |
---|---|---|---|---|
Corrections |
|
xhtml 1.0 css 2.1 Propulsé par FluxBB Traduit par FluxBB.fr |
882 membres 1429 sujets 11119 messages |
Dernier membre inscrit: LiseBuisson96 32 invités en ligne Aucun membre connecté RSS Feed |