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:
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
essaie d'ajouter un label pour voir comment le getDistance évolue.
Si c'est bien ça qui merde, un bidon :
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++)
Hors ligne
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 ?
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é.
if( node2->getPosition().getDistanceFrom(camera->getPosition()) > 120) ouvert = true else ouvert = false;
Est-ce que l'écriture suivante ne serait pas également valide ?
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
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
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)
Hors ligne
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...
Hors ligne
Options | Liens officiels | Caractéristiques | Statistiques | Communauté |
---|---|---|---|---|
Corrections |
|
xhtml 1.0 css 2.1 Propulsé par FluxBB Traduit par FluxBB.fr |
882 membres 1429 sujets 11119 messages |
Dernier membre inscrit: LiseBuisson96 6 invités en ligne Aucun membre connecté RSS Feed |