Historique des modifications - Message

Message #2033

Sujet: Problème avec EventReceiver


Type Date Auteur Contenu
Dernière modification 18-04-2007 17:00:36 Manfeukou
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.
Création du message 18-04-2007 16:58:59 Manfeukou
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.

Retour

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