Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Problème d'angle de tir / Déplacement du projectile en fonction de la souris.  (Lu 3511 fois)

0 Membres et 1 Invité sur ce sujet

Slash94

  • Jr. Member
  • **
  • Messages: 89
    • Voir le profil
Salut à tous,

J'essaie, en vain, de faire en sorte que lorsque je clique sur le bouton gauche de ma souris, un projectile Circleshape se crée dans un vector qui contient l'angle du tireur ( donc le tireur étant mon "personnage" qui est une flèche rouge qui pointe en fonction de la position de ma souris ).

Ensuite, j'essaie de faire en sorte que le projectile s'oriente en direction de là où j'ai cliqué..

Les positions de mes projectiles sont assez incohérentes et j'aimerais avoir un coup de main afin de mettre en oeuvre un système fonctionnel..

Ici mon code, en vous remerciant GRANDEMENT d'avance :

#include <SFML/Graphics.hpp>

#include <iostream>
#include <math.h>
#include <vector>

using namespace std;
using namespace sf;

int main()
{
    RenderWindow win(VideoMode(800,600),"SFML Rotation Test", Style::Titlebar);
    win.setFramerateLimit(60);

    Vector2f triPosition(20,20);
    Vector2f mousePosition;
    Vector2f diff;
    float angle = 0;

    CircleShape triangle(15,3);
    triangle.setPosition(triPosition);
    triangle.setFillColor(Color::Red);
    triangle.setOrigin(10,10);

    vector<CircleShape>bullet;

    Clock clock;

    while (win.isOpen())
    {
        triPosition.x = triangle.getPosition().x;
        triPosition.y = triangle.getPosition().y;

        mousePosition.x = Mouse::getPosition(win).x;
        mousePosition.y = Mouse::getPosition(win).y;

        diff.x = triPosition.x - mousePosition.x;
        diff.y = triPosition.y - mousePosition.y;

        Event event;
        while (win.pollEvent(event))
        {
            switch (event.type)
            {
            case Event::Closed:
                win.close();
                break;
            }
        }

        if (Keyboard::isKeyPressed(Keyboard::Z))
            triPosition.y -= 2;
        if (Keyboard::isKeyPressed(Keyboard::S))
            triPosition.y += 2;
        if (Keyboard::isKeyPressed(Keyboard::Q))
            triPosition.x -= 2;
        if (Keyboard::isKeyPressed(Keyboard::D))
            triPosition.x += 2;

        if (Mouse::isButtonPressed(Mouse::Left) & clock.getElapsedTime().asMilliseconds()>200)
        {
            CircleShape bul(15,3);
            bul.setOrigin(10,10);
            bul.setFillColor(Color::Green);
            bul.setPosition(triPosition.x, triPosition.y);
            float tAngle = atan2(bul.getPosition().y - mousePosition.y,
                                 bul.getPosition().x - mousePosition.x) * 180 / 3.14159265359;
            bul.setRotation(tAngle);
            bullet.push_back(bul);
            clock.restart();
        }

        if (Keyboard::isKeyPressed(Keyboard::Escape))
            win.close();

        angle = atan2(diff.y, diff. x) * 180 / 3.14159265359;
        cout << " angle : " << angle << endl;

        triangle.setRotation(angle+45);
        triangle.setPosition(triPosition.x, triPosition.y);

        win.clear();

        if (bullet.size()>0)
        {
            cout << "Bullet Size : " << bullet.size() << endl;
            for (int i = 0 ; i < bullet.size() ; i++)
            {
                float angBul = bullet[i].getRotation() * 180 / 3.14 ;
                    bullet[i].move(cos(angBul) * 4, -sin(angBul) * 4);
                win.draw(bullet[i]);

                if (bullet[i].getPosition().x < 0 || bullet[i].getPosition().x > 800 ||
                    bullet[i].getPosition().y < 0 || bullet[i].getPosition().y > 600)
                {
                    bullet.erase(bullet.begin()+i);
                }
            }
        }

        win.draw(triangle);

        win.draw(triangle);
        win.display();
    }
}
 

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Ta logique me semble correcte, donc à part éventuellement un signe à inverser ici ou là (ce qui se voit facilement), ça devrait coller. Tu peux décrire plus précisément les résultats que tu obtiens ?
Laurent Gomila - SFML developer

Slash94

  • Jr. Member
  • **
  • Messages: 89
    • Voir le profil
Salut Laurent,

Ben déjà, j'ai constaté qu'entre 0 et -0.1 degré ( valeur de mon angle ), il y a un décalage qui saute de 45 degrés environ donc par exemple je tire sur la droite et je descends à peine ma souris et hop il tire dans une autre position soudainement ( vers le bas gauche ).

Je ne comprends pas pourquoi....

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Citer
                float angBul = bullet[i].getRotation() * 180 / 3.14 ;
                    bullet[i].move(cos(angBul) * 4, -sin(angBul) * 4);
Tu convertis des degrés en degrés. Là il faut faire la conversion dans l'autre sens.
Laurent Gomila - SFML developer

Slash94

  • Jr. Member
  • **
  • Messages: 89
    • Voir le profil
Déjà fait hier soir justement, ça n'a strictement rien changé au problème.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Si ça ne change strictement rien alors tu as un gros problème, parce que ça devrait fondamentalement modifier la trajectoire :P
Laurent Gomila - SFML developer

Slash94

  • Jr. Member
  • **
  • Messages: 89
    • Voir le profil
Personne pour m'aider..?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Dans ce genre de cas normalement tu peux t'en sortir assez facilement en traquant (au débugger ou avec la console) les différentes valeurs impliquées dans les calculs. Part de ce dont tu es sûr (position de la souris et du personnage) et suis le cheminement des calculs, à la fois sur papier et pendant l'exécution, et tu vas forcément tomber sur un calcul qui ne donne pas le résultat attendu...
Laurent Gomila - SFML developer

Slash94

  • Jr. Member
  • **
  • Messages: 89
    • Voir le profil
Merci Laurent, je vais essayer d'étudier ça de manière plus approfondie..

kimci86

  • Full Member
  • ***
  • Messages: 123
    • Voir le profil
Attention à l'orientation des angles. Le repère de l'écran (x vers la droite et y vers le bas) implique que les angles attendus par les fonctions trigonométriques sont orientés dans le sens des aiguilles d'une montre.
Citer
bullet[i].move(cos(angBul) * 4, -sin(angBul) * 4);
Ici le signe moins devant le sinus est en trop.

Autre problème, dans le cacul de l'orientation des projectiles, il faut considérer le vecteur bul->mouse et pas mouse->bul comme cela est fait ici :
Citer
atan2(bul.getPosition().y - mousePosition.y,
      bul.getPosition().x - mousePosition.x)