Partage
  • Partager sur Facebook
  • Partager sur Twitter

Irrlicht=>Collision

    9 juillet 2007 à 19:10:38

    Je sais je sais, encore une question sûrement stupide...
    mais je tente :)
    Sur irrlicht je sais gerer plusieurs collisions (grâce au metaSelector)
    et je compte maintenant integrer le système de tir de mon fps.
    Plusieurs problèmes se posent à moi :
    => Comment reconnaître le click gauche
    => et dans le cas d'un tir, dois-je créer un node qui part de mon canon dans la direction de la visée de la camera pour faire un tir invisible (cad du type fusil et pas lance-roquettes) ?
    =>Comment gérer les collisions de mon tir avec le node ? (cad comment savoir si il y a eu collision entre les deux?)
    • Partager sur Facebook
    • Partager sur Twitter
      10 juillet 2007 à 10:29:28

      Slt Pour reconnaitre les évenement tu as SDl qui fait trés bien sa.

      bool continuer = true;
      SDL_Event event;
      //SDL_EnableKeyRepeat(10, 10); //Tu décomente et tu rajoute une condition pour arme a un coup ou semi automatique.

      while(continuer) //boucle principale
      {
      SDL_WaitEvent (&event);

      switch(event.type)

      case SDL_QUIT :
      continuer = false; //Si klic sur la croix on quitte
      break;

      case SDL_MOUSEBUTTONDOWN:
      if (event.button.button == SDL_BUTTON_LEFT)
      tirer; //tu appel la fonction tiré
      break; // Pour refaire un tour de boucle

       


      Pour ta seconde question tu m'est une condition en fonction de l'arme.

      Pour la troisiéme ben je croi (je suis pas sur) qu'un node tu peu lui donné un nom (non ?)
      Dans se cas si la position de l'ennemi et celle du tir son la même tu enleve de la vie à l'ennemi...

      Voila en espérant t'avoir aider.
      • Partager sur Facebook
      • Partager sur Twitter
        10 juillet 2007 à 12:45:33

        Pourqoi s'encombrer de la sdl ?
        irrlicht gère très bien les évênements !

        Pour ce faire il faut créer une classe dérivée de irr::IEventReceiver, puis tu donne une instance de cette classe comme dernier argument à la déclaration du device.

        Un petit exemple :

        class EventReceiver : public IEventReceiver
        {
        public:
            virtual bool OnEvent(SEvent event)
            {
                if (event.EventType == EET_MOUSE_INPUT_EVENT)
                    if(event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN)
                    // Le bouton gauche de la souris est préssé
                    if(event.MouseInput.Event == EMIE_LMOUSE_LEFT_UP)
                    // Le bouton gauche de la souris est relaché
               
                // Evenement clavier
                if (event.EventType == irr::EET_KEY_INPUT_EVENT)
                {
                    switch (event.KeyInput.Key)
                    {
                        case irr::KEY_ESCAPE: // Touche echap
                            // Si la touche echap est relaché(donc précédemment préssée)
                            if(!event.KeyInput.PressedDown) continuer = false;
                            break;
                    }
                }
                return false;
            }
        };
         



        Puis tu créer une instance de classe dans la main que tu envoie à la création du device comme sa :


        EventReceiver receiver;
            IrrlichtDevice* device = createDevice(video::EDT_OPENGL, core::dimension2d<s32>(640, 480), 16,false,false,false,&receiver);


        Et voilà, à chaque fois que tu cliqueras le programme passeras pas le commentaire "// Le bouton gauche de la souris est préssé" à toi donc d'y rajouter ce que tu veut.

        Je te conseil tout de même de juste activer un booléen dans la classe et de faire la vérification ailleurs pour ne pas que sa soit la pagaille dans la classe ;)
        • Partager sur Facebook
        • Partager sur Twitter
          10 juillet 2007 à 19:44:58

          Merci beaucoup ! Tu me sauves la vie..!
          J'ai un deuxième problème, lorsque je fais mes collisions, mon model sydney (par exemple) est obligé de voler à dix metres au dessus du sol sinon il entre en collision avec le sol justement...mais j'aimerais pour plus de réalisme que sydney semble marcher sur le sol ! mais j'ai pas réussi...pouvez vous essayer ?
          • Partager sur Facebook
          • Partager sur Twitter
            10 juillet 2007 à 23:17:34

            Je vois ce que tu veut dire.
            Tu as dus ajouter un ISceneNodeAnimator initialisé avec la méthode createCollisionResponeAnimator de ton scenergaphe je suppose.
            Dans ce cas il suffit de modifier le troisième argument de cette méthode pour dire que ton mesh dois s'arrêter quand il est à tel distance de ton mur(je crois).

            Perso j'ai déjà fais pas mal de teste avec sydney et pour qu'elle touche le sol sans s'enfoncer ni s'envoler j'avais fait ceci :

            scene::ITriangleSelector* selector = 0;
               
            if(Nroom)
            {
                selector = scenegraph->createOctTreeTriangleSelector(
                                       room->getMesh(0), Nroom, 128);
                Nroom->setTriangleSelector(selector);
                selector->drop();
            }

            scene::ISceneNodeAnimator* anim = scenegraph->createCollisionResponseAnimator(selector, Nperso,
                        core::vector3df(Nperso->getBoundingBox().MaxEdge *
                        Nperso->getScale() / 1.25),
                        core::vector3df(0,-2,0),
                        core::vector3df(0,0,0));
            Nperso->addAnimator(anim);
            anim->drop();


            Après mon perso avais cette taille là :

            Nperso->setScale(core::vector3df(1.7,1.7,1.7));


            Donc a toi d'ajuster pour la taille de ton perso ;)
            • Partager sur Facebook
            • Partager sur Twitter
              11 juillet 2007 à 17:53:49

              Ok merci beaucoup...tout est resolu...
              • Partager sur Facebook
              • Partager sur Twitter

              Irrlicht=>Collision

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown