Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL2] tirer balles vers la direction du curseur

    9 octobre 2018 à 20:12:59

    Bonjour a tous, je suis en train de faire un jeu avec la bibliothèque sdl et je veux que les balles que je tire se dirigent vers la direction du pointeur de ma souris.

    j'ai pris les coordonnées du pointeur avec cette fonction:

    int x, y;
    SDL_GetMouseState( &x, &y );

    et ensuite ? des réponses ?

    pour l'apparition des balles : simple j'utilise un vector

    if (key_S)
    {
        bullets.push_back({perso.x, perso.y, 10, 10});
        key_S = false;
    }
    for (unsigned i = 0; i < bullets.size(); ++i)
    {
        bullets[i].x += //direction pointeur souris?
        bullets[i].y += //direction pointeur souris?
        if (bullets[i].x >= perso.x+largeur_fenetre)
        {
            bullets.erase(bullets.begin() + i);
        }
    }

    le delete des balles est pas fini mais j'ai juste a rajouter tout les coté de l'écran.

    le reste de mon code concerne la collision, editeur de map, sauts, affichage des tiles, ce qui n'a rien a voir avec le tir des balles donc ce sera trop long de trop le mettre ici.

    merci d'avance.

    -
    Edité par ac1 sentinel 9 octobre 2018 à 20:41:12

    • Partager sur Facebook
    • Partager sur Twitter
      9 octobre 2018 à 22:09:32

      C'est un problème de mathématiques ça.

      Tu as 2 points : ta balle et ta souris. Il te faut le vecteur tracé par ces 2 points.

      Donc point d'arrivée - point de départ = vecteur directionnel entre ces 2 points.
      Il te faudra ensuite normalisé ce vecteur.

      Tu aura donc un vecteur qui te donne la direction de ta balle, tu n'auras plus qu'a incrémenter le x et le y de ta balle en fonction de ce vecteur (vecteur que tu peux multiplier par une valeur qui sera la vitesse de ta balle par exemple).

      • Partager sur Facebook
      • Partager sur Twitter
        9 octobre 2018 à 22:30:36

        ironwolf151 a écrit:

        C'est un problème de mathématiques ça.

        Tu as 2 points : ta balle et ta souris. Il te faut le vecteur tracé par ces 2 points.

        Donc point d'arrivée - point de départ = vecteur directionnel entre ces 2 points.
        Il te faudra ensuite normalisé ce vecteur.

        Tu aura donc un vecteur qui te donne la direction de ta balle, tu n'auras plus qu'a incrémenter le x et le y de ta balle en fonction de ce vecteur (vecteur que tu peux multiplier par une valeur qui sera la vitesse de ta balle par exemple).


        merci de ta réponse, effectivement en fouillant sur qq forums j'ai trouvé un code assez similaire

        voici le code, je l'ai plus copier-coller sans vraiment en comprendre l'entièreté

        int x, y;
        SDL_GetMouseState( &x, &y );
        
        timer++;
        if (timer>=30 && key_S)
        {
            timer=0;
            bullets.push_back({perso.x, perso.y, 10, 10});
            key_S = false;
        }
        
        double angle = atan2(y-perso.y, x-perso.x);// * (180/PI);

        double vx = cos(angle) * vitesse;
        double vy = sin(angle) * vitesse;
        
        for (unsigned i = 0; i < bullets.size(); ++i)
        {
            bullets[i].x += vx;
            bullets[i].y += vy;
        }



        la balle suit bien le curseur de ma souris mais avec un décalage de quelques pixels, pourquoi ? peut etre car les struct SDL_Rect utilisent des variables int ? je ne sais pas. en attendant je vais essayer de coder ce que tu m'as dis.

        edit : 

        j'ai codé ce que tu m'as dis, la balle suit bien mon curseur par contre est-ce normal que je sois obligé de multiplier mon vecteur par un vitesse minuscule pour que mes balles défilent a une vitesse correcte ?

        double vx = (x-perso.x) * 0.1;
        double vy = (y-perso.y) * 0.1;
        
        for (unsigned i = 0; i < bullets.size(); ++i)
        {
           bullets[i].x += vx;
           bullets[i].y += vy;
        }

        -
        Edité par ac1 sentinel 9 octobre 2018 à 23:13:13

        • Partager sur Facebook
        • Partager sur Twitter
          9 octobre 2018 à 23:45:58

          OlivierYousfi a écrit:

          voici le code, je l'ai plus copier-coller sans vraiment en comprendre l'entièreté

          C'est de la trigo', il faut s'imaginer un point sur un cercle (la souris) et le point d'origine (le personnage), avec pour distance entre ces 2 points le rayon de ce cercle. La fonction atan2() détermine l'angle de la droite par rapport à la position du point sur le cercle et de l'origine.

          Une fois l'angle obtenu, on l'utilise dans les équations de la cinématique du point, et comme c'est un mouvement uniforme ça simplifie le truc parce qu'on a pas l'accélération à gérer, ce qui donne :

          x(t) = x0 + cos(a)*v*t

          y(t) = y0 + sin(a)*v*t

          D'ailleurs il manque le temps dans tes équations (le deltaTime du jeu). Sans ça tu auras des surprises car la distance parcourue ne sera pas proportionnelle au temps écoulé pour une frame.

          OlivierYousfi a écrit:

          la balle suit bien le curseur de ma souris mais avec un décalage de quelques pixels, pourquoi ?

          En principe pour les formes ou les sprites, c'est le point en haut à gauche qui est utilisé pour déterminer la position, donc il faut la réajuster dans le calcul pour que ce soit centré.

          OlivierYousfi a écrit:

          j'ai codé ce que tu m'as dis, la balle suit bien mon curseur par contre est-ce normal que je sois obligé de multiplier mon vecteur par un vitesse minuscule pour que mes balles défilent a une vitesse correcte ?

          Normalement tu détermines une vitesse constante (par exemple 500) que tu multiplies par le temps d'exécution d'une frame qui lui est très petit. Ce qui donne la distance à parcourir : d(t) = v*t.

          -
          Edité par Guit0Xx 9 octobre 2018 à 23:51:58

          • Partager sur Facebook
          • Partager sur Twitter

          ...

            10 octobre 2018 à 0:14:14

            Guit0Xx a écrit:

            OlivierYousfi a écrit:

            voici le code, je l'ai plus copier-coller sans vraiment en comprendre l'entièreté

            C'est de la trigo', il faut s'imaginer un point sur un cercle (la souris) et le point d'origine (le personnage), avec pour distance entre ces 2 points le rayon de ce cercle. La fonction atan2() détermine l'angle de la droite par rapport à la position du point sur le cercle et de l'origine.

            Une fois l'angle obtenu, on l'utilise dans les équations de la cinématique du point, et comme c'est un mouvement uniforme ça simplifie le truc parce qu'on a pas l'accélération à gérer, ce qui donne :

            x(t) = x0 + cos(a)*v*t

            y(t) = y0 + sin(a)*v*t

            D'ailleurs il manque le temps dans tes équations (le deltaTime du jeu). Sans ça tu auras des surprises car la distance parcourue ne sera pas proportionnelle au temps écoulé pour une frame.

            OlivierYousfi a écrit:

            la balle suit bien le curseur de ma souris mais avec un décalage de quelques pixels, pourquoi ?

            En principe pour les formes ou les sprites, c'est le point en haut à gauche qui est utilisé pour déterminer la position, donc il faut la réajuster dans le calcul pour que ce soit centré.

            OlivierYousfi a écrit:

            j'ai codé ce que tu m'as dis, la balle suit bien mon curseur par contre est-ce normal que je sois obligé de multiplier mon vecteur par un vitesse minuscule pour que mes balles défilent a une vitesse correcte ?

            Normalement tu détermines une vitesse constante (par exemple 500) que tu multiplies par le temps d'exécution d'une frame qui lui est très petit. Ce qui donne la distance à parcourir : d(t) = v*t.

            -
            Edité par Guit0Xx il y a 12 minutes

            effectivement le code que j'ai copier-collé est pareil a ce que tu dis

            double angle = atan2(mousey-perso.y, mousex-perso.x);// * (180/PI);
            double vx = cos(angle) * vitesse;

            double vy = sin(angle) * vitesse;
            for (unsigned i = 0; i < bullets.size(); ++i)
            {
                bullets[i].x += vx;
                bullets[i].y += vy;
            }

            mais j'ai toujours ce décalage de plusieurs pixels quand je tire des balles, je ne comprends pas pourquoi

            c'est bien expliquer ici aussi : http://wikicode.wikidot.com/get-angle-of-line-between-two-points

            ou ici : https://stackoverflow.com/questions/34122380/shooting-bullet-towards-mouse-position-in-java-slick2d



            -
            Edité par ac1 sentinel 10 octobre 2018 à 0:41:07

            • Partager sur Facebook
            • Partager sur Twitter

            [SDL2] tirer balles vers la direction du curseur

            × 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