#1 

18-04-2007 16:58:59

Manfeukou
Membres
Date d'inscription:
Messages: 6
IP: 88.136.211.236
Courriel

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.


Hors ligne


#2 

19-04-2007 14:09:39

Jerry Kan
Membres
Date d'inscription:
Messages: 265
IP: 82.243.77.149
Courriel

Manfeukou Ecris:

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 Ecris:

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)


Hors ligne


#3 

20-04-2007 21:47:05

Manfeukou
Membres
Date d'inscription:
Messages: 6
IP: 88.137.78.180
Courriel

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


#4 

21-04-2007 10:50:01

Perceval
Membres
Avatar de Perceval
Date d'inscription:
Messages: 105
IP: 90.32.44.136
Courriel

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


#5 

21-04-2007 16:04:23

Manfeukou
Membres
Date d'inscription:
Messages: 6
IP: 88.136.209.140
Courriel

Perceval Ecris:

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 :
[quote]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.[/quote]
Pourtant il y a une erreur sans cast. hmm


Hors ligne


#6 

21-04-2007 17:32:16

Perceval
Membres
Avatar de Perceval
Date d'inscription:
Messages: 105
IP: 90.32.44.136
Courriel

Tu es sur d'avoir bien tapé ce que j'ai mis ? Parce que c'est texto un bout du tutorial 8.


Hors ligne


#7 

21-04-2007 18:19:17

Jerry Kan
Membres
Date d'inscription:
Messages: 265
IP: 82.243.77.149
Courriel

Manfeukou Ecris:

Pourtant il y a une erreur sans cast. hmm

ca dépends beaucoup du compilateur et des options, donc ..


Hors ligne


#8 

21-04-2007 18:56:00

Manfeukou
Membres
Date d'inscription:
Messages: 6
IP: 88.136.209.140
Courriel

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