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

JavaFX Discussion :

Collison javafx probleme


Sujet :

JavaFX

Vue hybride

nanny33 Collison javafx probleme 08/06/2019, 16h59
bouye Rappel : une boite englobante... 08/06/2019, 23h48
nanny33 Bonjour, merci de m'avoir... 09/06/2019, 12h26
nanny33 J'aimerais utiliser le shape... 09/06/2019, 12h32
nanny33 Je n'arrive pas à utiliser... 09/06/2019, 12h34
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Lycéen(seconde)
    Inscrit en
    Octobre 2018
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Lycéen(seconde)

    Informations forums :
    Inscription : Octobre 2018
    Messages : 32
    Par défaut Collison javafx probleme
    Bonjour,

    je suis entrant de créer mon tout premier jeux java en utilisant la librairie connu graphique javafx, j'ai presque fini mon jeux, il me reste plus qu'a mettre des collisions car dans mon jeux, le personnage incarne un cercle et il y a des Line, si le cercle touche les Line : ... Pareil pour les ennemies, ces derniers dont des cercles qui bougent de manière aléatoire et je voudrais savoir comment faire si notre personnage cercle touche un des ces ennemies, cela veut dire que la partie s’arrête, que le mouvement des ennemies s’arrêtent ... Pouvez vous m'aider svp. merci

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 900
    Billets dans le blog
    54
    Par défaut
    Rappel : une boite englobante c'est le carré ou le rectangle dans lequel s'inscrit une forme quelconque (cercle ou ligne - les lignes ont une épaisseur ici donc même un ligne horizontale ou verticale s’inscrit dans un rectangle).

    Rappel 2 : dans le doute, il ne faut pas hésiter à prendre un crayon et une feuille et dessiner tout ca sur papier ; ça rend souvent les choses bien plus faciles à saisir.

    Rappel 3 : c'est de la géométrie de base donc il va falloir peut-être ressortir les cours du lycée.

    En général pour simplifier les choses les jeux font les calculs de collision en 2 étapes :
    1. On vérifier les collisions des boites en englobantes car c'est beaucoup plus facile et rapide de calculer si des carrés ou des rectangles s'intersectent.
    2. Lorsqu'il y a une collision entre boites englobantes on peut alors faire un calcul plus complexe pour une forme quelconque.


    L'algorithme devient alors quelque chose dans le genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Pour chaque forme d'un ennemi ou du décor
       Si boite englobante personnage intersecte boite englobante ennemi ou décor
           faire test approfondi sur ennemi ou décor
              si test approfondi sur ennemi ou décor réussi -> collision entre le personnage et l'ennemi ou le décor

    Le reste va dépendre de comment tu as programmé ton code :
    • Si tu utilises des classes de JavaFX telles que Circle ou encore Line, ces classes sont des nœuds graphiques qui héritent de la classe Shape et disposent donc de la méthode getBoundsInParent() qui retourne la boite englobante de l'objet dans l'espace de coordonnées du nœud parent dans un objet de type Bounds cette classe permet de faire des tests d'intersection via la méthode intersects().
    • Si tu n'utilises pas les classes de JavaFX, il va te falloir calculer les boites englobante de chacune de tes formes et les stocker. La classe JavaFX javafx.geometry.Rectangle2D est un bon choix pour faire cela et dispose la méthode intersects() qui permet de tester une intersection avec un autre rectangle. Si tu n'utilises pas cette classe, cette méthode n'est pas bien dure à reprogrammer par toi-même.


    Rien qu'avec ce premier test tu vas avoir un début de test de collision même s'il est hautement imprécis : ton algo détectera une collection entre un cercle et une droite en diagonale même si graphiquement ils ne se touchent pas car leurs boites en englobantes elles se touchent (un dessin sur papier rendra la chose plus explicite).

    Pour le test de collision avancé, tu as plusieurs choix :
    • Si tu utilises les classes JavaFX qui héritent de Shape le plus simple (mais pas le plus efficace) est d'invoquer la méthode intersect() (sans 's' à la fin) qui crée une forme à partir de l'intersection de 2 autres. Si cette forme résultat est vide (la boite englobante retournée par getBoundsInLocal() a une largeur ou une hauteur négative) alors les deux formes ne se touchent pas. La méthode est peu efficace car on crée une nouvelle forme à chaque appel.
    • Si tu n'utilises pas les classes de JavaFX ou si tu veux quelques chose de plus optimisé il va te falloir ressortir les livres de géométrie pour faire des calculs d'intersection notamment découvrir s'il existe des points qui sont à la fois sur le cercle (ou dans le disque) et la droite que tu es en train de tester.


    Rappel 4 :
    • InParent - le résultat est dans l'espace de coordonnées du nœud parent / conteneur (l'origine 0,0 est dans le coin supérieur gauche du nœud parent). Les transformations potentielles sont appliquées pour le calcul du résultat.
    • InLocal - le résultat est dans l'espace de coordonnées du nœud actuel (l'origine 0,0 est dans le coin supérieur gauche du nœud actuel). Les transformations ne sont pas appliquée. Chaque nœud a un espace de coordonnées qui lui est propre.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre averti
    Homme Profil pro
    Lycéen(seconde)
    Inscrit en
    Octobre 2018
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Lycéen(seconde)

    Informations forums :
    Inscription : Octobre 2018
    Messages : 32
    Par défaut
    Bonjour,

    merci de m'avoir répondu, je suis entrant de lire votre réponse. (petit rappel : je suis en seconde au lycée)

  4. #4
    Membre averti
    Homme Profil pro
    Lycéen(seconde)
    Inscrit en
    Octobre 2018
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Lycéen(seconde)

    Informations forums :
    Inscription : Octobre 2018
    Messages : 32
    Par défaut
    J'aimerais utiliser le shape avec les intersect(), du coup j'ai fais ce code la qui ne marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     //Création animation clavier pour pouvoir déplacer le cercle c :
    HashSet<KeyCode> tab = new HashSet<KeyCode>();
    AnimationTimer aT = new AnimationTimer() {
        public void handle(long l) {
            for(KeyCode t: tab) {
                switch(t){
                    case ESCAPE:
                        r.setVisible(true);
                        exit.setVisible(true);
                        re.setVisible(true);
                    break;
                    case Z :
                        c.setLayoutY(c.getLayoutY()-7);
                    break;
                    case D :
                        c.setLayoutX(c.getLayoutX()+7);
                    break;
                    case Q :
                        c.setLayoutX(c.getLayoutX()-7);
                    break;
                    case S :
                        c.setLayoutY(c.getLayoutY()+7);
                    break;
                }
                //Collision mur de la fenetre :
                if (c.getLayoutX() > 491){
                    c.setLayoutX(491);
                }
                if (c.getLayoutY() > 290){
                    c.setLayoutY(290);
                }
                if (c.getLayoutY() < -287){
                    c.setLayoutY(-287);
                }
                if (c.getLayoutX() < -488){
                    c.setLayoutX(- 488);
                }
            };
        };
    };
     
     
    scene.setOnKeyPressed(e ->{
        boolean wasEmpty = tab.isEmpty();
        if(tab.add(e.getCode()) && wasEmpty)
            aT.start();
    });
    scene.setOnKeyReleased(e ->{
        if(tab.remove(e.getCode()) && tab.isEmpty())
            aT.stop();
    });
    Shape s = Shape.intersect(r,r3);
    boolean collision = s.getBoundsInLocal().isEmpty();
    if(collision == true) {
        aT.stop();
    }

  5. #5
    Membre averti
    Homme Profil pro
    Lycéen(seconde)
    Inscrit en
    Octobre 2018
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Lycéen(seconde)

    Informations forums :
    Inscription : Octobre 2018
    Messages : 32
    Par défaut
    Je n'arrive pas à utiliser les balises pour mettre du code.

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 900
    Billets dans le blog
    54
    Par défaut
    C'est normal tu avais posé un couple de balises avant et un autre après ton code alors que tu dois écrire ton code entre les balises de fermeture et d'ouverture.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

Discussions similaires

  1. Probleme sur JavaFx
    Par ghostMLS dans le forum JavaFX
    Réponses: 2
    Dernier message: 03/09/2015, 02h25
  2. Help Pleaase ! probleme dans JavaFx
    Par ghazali0005 dans le forum Général Java
    Réponses: 0
    Dernier message: 06/05/2010, 13h19
  3. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01
  4. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50
  5. [Kylix] Probleme de nombre flottant!!
    Par yopziggy dans le forum EDI
    Réponses: 5
    Dernier message: 02/05/2002, 10h13

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