IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Calculer la trajectoire d'une balle.


Sujet :

Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 34
    Points : 28
    Points
    28
    Par défaut Calculer la trajectoire d'une balle.
    Bonjour à tous,

    Je programme actuellement un genre de jeu de plateforme avec tirs intégrés, et je me retrouve confronté à un problème: j'ai une méthode qui utilise un angle pour orienter une balle. Or je veux que cet angle soit dirigé vers le pointeur de la souris de coordonnées M(X;Y). (compte tenu que le point de départ de la balle sont les coordonées (X;Y) du personnage)
    J'ai procédé à maintes recherches sur Internet, tout ce que j'ai trouvé était très abstraits ou mal expliqué. Ce que j'ai pu en retenir c'est que la trigonométrie pouvait jouer un rôle ou l'on pouvait aussi utiliser un vecteur : le vecteur personnage;pointeur de souris.

    Quelqu'un pourrait m'expliquer plus concrètement comment je puis réaliser cela?

    Merci beaucoup par avance.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Ceci n'a rien à voir avec Java (même si par la suite, l'implémentation peut faire appel à des méthodes particulières du JDK, ou autre API Java). C'est des mathématiques et en effet, ça a un rapport avec la trigonométrie (qui traite des relations entre distances et angles dans les triangles, avec entre autres utilisations des fonctions sinus, cosinus, tangente, etc.). On peut effectivement traiter ça aussi avec des vecteurs, ou plus précisemment des couples de points orientés, parce qu'au final, un écran étant une matrice 2D de points, on se déplace selon deux axes de pixel en pixel.

    Autre notion qui peut entrer en jeu dans ce genre de chose : le Théorème de Thalès (et oui, encore des maths). En résumé, il s'agit de pouvoir utiliser le fait que comme la matrice de l'écran est orthogonale, des lignes de x ou de y différents, sont forcément parallèles, donc qu'on peut utiliser un rapport de distance pour déterminer un pas, lorsqu'on déplace un élément entre deux points.

    En ce qui concerne le traitement du problème sans trigonométrie, il ne s'agit que de faire donc des différences entre coordonnées, de calculer des rapports, et de faire des boucles. La différence de 2 nombres étant orienté par la position des nombres (a-b n'est pas égale à b-a, mais à -(b-a) : le signe donc donne l'orientation).

    Par exemple, si tu as un point X(x=10,y=10) et un point Y(20,30), si tu calcules dx = 20-10 = 10, et dy = 30-10=20, on peut bien déplacer le point X en Y, en faisant x+dx et y+dy.
    Pour Z(0,0), dx = 0-10 = -10, dy = 0-10=-10, tu vois que ça fonctionne aussi x+dx = 10-10 = 0 et y+dy = 10-10 = 0.

    Maintenant, s'il faut déplacer le point X vers Y en 10 pas successifs, il faut pouvoir faire une boucle (genre for(int i=0; i<10; i++)) et avancer un petit peu à chaque fois, de manière à ce qu'à la fin de la boucle, X soit en Y. Si on divise par 10 la distance XY, il est évident (enfin ça se démontre facilement) qu'on peut se déplacer de cette subdivision de la distance 10 fois.
    Sauf que bien sûr, on doit pouvoir le faire selon les x et les y, et pas par rapport à une distance (qui n'est pas suffisante, puisqu'il y l'angle qui entre en jeu) : c'est là que Thalès intervient.
    Si on détermine le rapport entre la différence entre les absisses des 2 points et la distance entre les deux points, on peut diviser cette différence par 10 en conservant le rapport. Idem sur les ordonnées.

    En résumé, si on a X(a,b) et Y(c,d), on fait d = distance(X,Y), puis dx=c-a et dy = d-b. Si px = dx/10 et py = dy/10, on peut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(int i=0; i<10; i++) {
        a+=px;
        b+=py;
    }
    a vaudra c et b vaudra d en fin de boucle.

    A noter, que tout ça est théorique. En pratique, il faut tenir compte :

    • un int divisé par un int donne un int en java (il faudra donc faire la division en float ou double et reconvertir en int pour l'affichage)
    • additionner des floats ou des doubles ne donnent pas un résultat exact mathématiquement, et donc il faudra prévoir qu'à la fin il faut forcer la position finale pour éviter une position possiblement légèrement décalée. Et éventuellement, ne pas fonctionner par additions successives, mais par recalcul par rapport à la position de départ.
    • qu'il faudra faire intervenir le temps pour déterminer le diviseur pour avoir un mouvement fluide et dont le temps ne dépend des temps d'exécution du code.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 34
    Points : 28
    Points
    28
    Par défaut
    C'est nettement plus claire dans mon esprit, un énorme merci à vous d'avoir pris votre temps pour m'éclairer la lanterne! J'ai bien fait de venir sur ce Forum (comme d'habitude lorsque je suis très très très embêté).
    Le point de vue théorique est très claire par rapport à ce que j'ai vu! Encore merci

    Bonne journée à vous!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 21/01/2016, 18h31
  2. Réponses: 0
    Dernier message: 21/01/2016, 10h27
  3. Dessiner la trajectoire d'une balle (PyGTK/Cairo)
    Par austin57 dans le forum GTK+ avec Python
    Réponses: 4
    Dernier message: 24/01/2012, 21h42
  4. casse-briques : trajectoire d'une balle
    Par josmiley dans le forum Programmation multimédia/Jeux
    Réponses: 5
    Dernier message: 16/02/2011, 19h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo