#0 

18-04-2007 18:58:59

Manfeukou
Petit nouveau
Date d'inscription: 18-04-2007
Messages: 6

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:

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


#1 

19-04-2007 16:09:39

Jerry Kan
Habitué
Date d'inscription: 21-11-2006
Messages: 265

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 :

Code:

    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


#2 

20-04-2007 23:47:05

Manfeukou
Petit nouveau
Date d'inscription: 18-04-2007
Messages: 6

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


#3 

21-04-2007 12:50:01

Perceval
Abonné
Date d'inscription: 20-10-2006
Messages: 105

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


#4 

21-04-2007 18:04:23

Manfeukou
Petit nouveau
Date d'inscription: 18-04-2007
Messages: 6

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. hmm

Hors ligne


#5 

21-04-2007 19:32:16

Perceval
Abonné
Date d'inscription: 20-10-2006
Messages: 105

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

Hors ligne


#6 

21-04-2007 20:19:17

Jerry Kan
Habitué
Date d'inscription: 21-11-2006
Messages: 265

Manfeukou :

Pourtant il y a une erreur sans cast. hmm


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

Hors ligne


#7 

21-04-2007 20:56:00

Manfeukou
Petit nouveau
Date d'inscription: 18-04-2007
Messages: 6

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
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
881 membres
1427 sujets
11117 messages
Dernier membre inscrit: Bidule
20 invités en ligne
Aucun membre connecté
RSS Feed