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.