#0 

13-06-2007 12:38:43

cryo25
Petit nouveau
Date d'inscription: 26-02-2007
Messages: 5

Bonjour a tous,

Je voudrai savoir comment faire pour ouvrir une porte, juste pour un test!
Ex: j'ai un joueur (camera en mode FPS), un monde modéliser en .X et j'ai ajouter une porte (en .X). Lorsque mon joueur s'approche de cette porte, j'aimerai qu'elle s'ouvre soit juste en s'approchant de celle-ci, soit en appuyant sur une touche.

J'ai deja essayer avec GetDistanceFrom, mais l'essai n'est pas tres concluant!!
Voila mon code actuel:

Code:

ICameraSceneNode* camera = smgr->addCameraSceneNodeFPS(0, 100, 150, -1, keyMap, 8);
    camera->setPosition(core::vector3df(100,150,100));

    core::vector3df camPos = camera->getAbsolutePosition();

///*************************************************************************************************
    IAnimatedMesh* mesh1 = smgr->getMesh("JUJU2/murs.x");
    IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh1 );
    node->setMaterialFlag(video::EMF_LIGHTING, true);
    //node->getMaterial(0).AmbientColor = SColor(255,0,0,0);
    node->setScale(core::vector3df(10.0f,1.0f,10.0f));

    scene::ITriangleSelector* selector = smgr->createOctTreeTriangleSelector(mesh1->getMesh(0),node);
            node->setTriangleSelector(selector);
            selector->drop();
///**************************************************************************************************
IAnimatedMesh* mesh2 = smgr->getMesh("JUJU2/porte.x");
    IAnimatedMeshSceneNode* node2 = smgr->addAnimatedMeshSceneNode( mesh2 );
    node2->setMaterialFlag(video::EMF_LIGHTING, true);
    node2->setDebugDataVisible(true);
    node2->setScale(core::vector3df(10.0f,1.0f,10.0f));


ITriangleSelector* doorSelector = smgr->createTriangleSelectorFromBoundingBox(node2);


scene::IMetaTriangleSelector* metaSelector = smgr->createMetaTriangleSelector();
metaSelector->addTriangleSelector(doorSelector);
metaSelector->addTriangleSelector(selector);



        core::vector3df start = node2->getPosition();
        core::vector3df end = start;


scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator(
    metaSelector, camera, core::vector3df(10,50,10),
    core::vector3df(0,-10.0f,0),//-200
    core::vector3df(0,60,0), 0.00005f);
camera->addAnimator(anim);
anim->drop();


bool ouvert = false;//Booleen pour l'ouverture, fermeture
if (ouvert = true)
      {
        core::vector3df end = start;
        end.Y = end.Y + 200;
        ISceneNodeAnimator* anim1 = smgr->createFlyStraightAnimator(start, end, 3000, false);
        node2->addAnimator(anim1);
        anim1->drop();
        //ouvert = false;

      }
if( ouvert = false)
      {

          //core::vector3df end = start;
        end.Y = end.Y - 200;
        ISceneNodeAnimator* anim1 = smgr->createFlyStraightAnimator(start, end, 3000, false);
        node2->addAnimator(anim1);
        anim1->drop();
        ouvert = true;

      }

ISceneNode* node1 = 0;
node1 = smgr->addLightSceneNode(0, core::vector3df(0,150,0),
        video::SColorf(1.0f, 0.6f, 0.7f, 1.0f), 800.0f);

IGUIStaticText* fpstext =
        env->addStaticText(L"", core::rect<s32>(10,150,200,200), false, true, 0, -1, true);


int lastFPS = -1;
    while(device->run())
    {


        driver->beginScene(true, true, SColor(0,20,20,20));

        smgr->drawAll();
        env->drawAll();
        
        if( node2->getPosition().getDistanceFrom(camera->getPosition()) > 120)
        ouvert = true;
        else if( node2->getPosition().getDistanceFrom(camera->getPosition()) < 120)
        ouvert = false;


        driver->endScene();

Ma porte est soit toujours ouverte, soit fermé......

Merci de votre aide!!!!

Hors ligne


#1 

13-06-2007 13:41:46

izguit
Administrateur
Lieu: 127.0.0.1
Date d'inscription: 14-09-2006
Messages: 306
Site web

essaie d'ajouter un label pour voir comment le getDistance évolue.
Si c'est bien ça qui merde, un bidon :

Code:

int getDistance(node from, node to)
{
    vector3df pos1 = from.getPosition()
    vector3df pos2 = to.getPosition()
    int distX = from.getX() - to.getX()
    int distY = from.getY() - to.getY()
    int distZ = from.getZ() - to.getZ()
    int distance = sqrt(distX*distX+distY*distY+distZ*distZ)
    return distance
}

devrait fonctionner (attention, pas testé et c'est pas vraiment du c++)


Athlon 64 3000+ // 1Go RAM // Geforce 6600GT 128Mo
Turion 64 X2 // 1Go RAM // ATI X1250

Hors ligne


#2 

13-06-2007 15:58:35

diOxy
Abonné
Date d'inscription: 10-10-2006
Messages: 153

Salut !

Le test ci-dessous ne prend pas du temps ? Il fait 2 test dans le cas ou le premier est mauvais, c'est un peu inutile, non ?

Code:

 if( node2->getPosition().getDistanceFrom(camera->getPosition()) > 120)
        ouvert = true;
        else if( node2->getPosition().getDistanceFrom(camera->getPosition()) < 120)
        ouvert = false;

Ce ne serait pas mieux ainsi ? d'autant plus que le précédent teste si supérieur OU inférieur a 120, mais pas l'égalité.

Code:

 if( node2->getPosition().getDistanceFrom(camera->getPosition()) > 120)
        ouvert = true else ouvert = false;

Est-ce que l'écriture suivante ne serait pas également valide ?

Code:

 ouvert = ( node2->getPosition().getDistanceFrom(camera->getPosition()) > 120);

Bon, je sais, le dernier est plus une figure de style qu'autre chose, mais bon. C'est le non test de l'égalité qui me gêne le plus.

Hors ligne


#3 

15-06-2007 11:08:36

cryo25
Petit nouveau
Date d'inscription: 26-02-2007
Messages: 5

Bonjour et merci de vos réponses si rapide!!!

Je me suis mal exprimé, ce que je cherche a faire est un déclencheur d'evenement:
lorsque le joueur trouve un interrupteur (c'est un exemple), qu'il puisse interagir avec celui-ci en appuyant sur une touche, ou alors, lorsqu'il trouve une poignée de porte, qu'il apparaisse automatiquement sur l'écran un message didactique (une sorte d'aide comme on peut trouver dans de nombreux premier niveau de jeu), ou encore, lors de l'approche d'une issue, qu'il puisse se mettre a pleuvoir dehors (je sais faire la pluie et le beau temps, lol!!)!

Je ne sais pas comment m'y prendre en faite, dois-je crée un objet invisible (sorte d'entité??) et lors de la collision avec celui-ci, ca déclencherai l'evenement voulu?? ou plutot une fonction pour chaque evenement voulu (un peu lourd peut etre?) ????

Le getdistancefrom ne me donne pas entiere satisfaction et je me tourne vers vous pour trouver des réponses, lol!

A savoir que je n'utilise qu'Irrlicht 1.2, sans moteur physique (celui integrer dans Irrlicht me convient bien pour l'instant!!).

Merci beaucoup de votre aide!!

Hors ligne


#4 

15-06-2007 13:26:14

izguit
Administrateur
Lieu: 127.0.0.1
Date d'inscription: 14-09-2006
Messages: 306
Site web

perso j'aurais fait un fichier xml avec les interactions dedans avec ce qu'il faut que ça déclenche, la position du truc, etc.
Puis une fonction checkTriggers dans la boucle qui vérifie si la position courante doit déclencher qqch. Si t'as trop de triggers du peux aussi découper ton monde (cf octrees)


Athlon 64 3000+ // 1Go RAM // Geforce 6600GT 128Mo
Turion 64 X2 // 1Go RAM // ATI X1250

Hors ligne


#5 

17-12-2010 21:31:06

christianclavet
Membre
Lieu: Montreal, Canada
Date d'inscription: 25-11-2009
Messages: 10
Site web

Humm... Je peut te dire comment je pourrais m'y
Tu doit faire un test de "BOUNDING box". Ton test de distance va regarder de n'importe quel angle... À moins c'est ce que tu veut...

Dans ce test, tu doit vérifier si ton mesh entre dans les position de ton "bounding box" qui test (trigger object). Je pense que IRRlicht as des bounding box test (Je suis sur qu'il y a une classe la dessus)

Je ferais ce test, genre une, ou deux fois par secondes pour par prendre trop de FPS.

Un fois que tu as le déclenchement (condition est bonne), tu peut faire apparaitre un gui ou quelque chose, pour t'aviser que tu peut "interagir".
Avec la bonne condition déclenchée, tu pourrais presser sur un bouton (gui) ou presser sur une touche, ça dépend uniquement du genre d'application.

L'idée de izguit est bonne de prendre un fichier .xml pour mettre les infos sur ton "trigger", si tu as des changements, tu n'aurais qu'as modifier ce fichier, qui peut même ouvrir la porte à un éditeur...


Projet:
The First King
http://first-king.sourceforge.net

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
1426 sujets
11116 messages
Dernier membre inscrit: Bidule
12 invités en ligne
Aucun membre connecté
RSS Feed