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

Tkinter Python Discussion :

Détecter Collisions / Superposition d'objets (Triangles)


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2016
    Messages : 18
    Par défaut Détecter Collisions / Superposition d'objets (Triangles)
    Bonjour à tous !


    Je suis en train de créer un jeu d'infiltration, certes rudimentaire, mais qui, dans l'idée, disposerait tout de même de la base de ce genre de jeux: un cône de détection pour des gardes.

    Voilà pour le moment mon programme:

    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
     
     
    from tkinter import*
    from math import*
     
    # Cette partie sert à déterminer dans quelle position est le garde.
     
    gauche = False
    droite = False
    haut = False
    bas = False
     
    #Cette partie sert à déterminer les coordonnées d'origine du garde.
     
    y1=250
    x1=250
     
    #Cette partie sert à déterminer les coordonnées d'origine du joueur.
     
    x2=100
    y2=100
     
    #Cette fonction sert à déplacer le garde, en créant et en modifiant également le champ de vision, et à détecter.
     
    def deplacement (evt):
    #Cette partie permet de modifier les valeurs des variables suivantes:
        global detecte 
        global x1 
        global y1 
        global x2 
        global y2 
        global gauche 
        global droite 
        global haut 
        global bas
        global angle
        drawzone.delete(ALL) #On commence par nettoyer le canevas, pour éviter les superpositions des objets.
        player=drawzone.create_oval(x2,x2,x2+10,y2+10, fill="blue") #On recrée le joueur à sa place initiale. On ne le met pas à la fin, car ses coordonnées interviennent dans la détection.
        if evt.keycode==38: #Si jamais on presse la flèche directionnelle "Haut"
            detecte=0 #Ce petit ajout permet d'éviter le flood de "détectés" dans le moniteur.
            haut=True # Le garde passe en position haute
            gauche = False
            droite = False
            bas = False
     #On modifie les coordonnées du garde
            y1=y1-5 #Coordonnées en y du garde
            xf1=x1-a*y1 #Coordonnées en x du premier point du champ de vision
            yf1=0 #Cordonnées en y du premier point du champ de vision
            xf2=x1+a*y1 #Coordonnées en x du second point du champ de vision
            yf2=0 #Coordonnées en y du second point du champ de vision
    #On recrée le champ de vision
            field2=drawzone.create_polygon(xf1, 0,xf2, 0, x1, y1, fill="yellow")
    #On recrée le garde (après la champ de vision pour ne pas que celui-ci ne l'efface partiellement)
            point=drawzone.create_oval(x1-5,y1-5,x1+5,y1+5, fill="black")
    #Cette partie sert à détecter le joueur 
    #>>>>>>> LE PROBLEME EST ICI <<<<<<<< !!!!
            if x2>=xf1 and x2<=xf2 and y2>=yf2 and y2>=yf2 and y1>=y2: 
    #Cela nous donne un champ de vision effectif RECTANGULAIRE, ce qui fait que si jamais le joueur est placé juste à côté du garde (en fait, entre le champ de vision et la courbe y=yf1 ou y=yf2), il sera quand même détecté, donc pour se faufiler c'est... Mort. Et ça m'ennuie.
                print("detecte")
                detecte = 1
        elif evt.keycode==40:
            detecte=0
            bas=True
            gauche = False
            droite = False
            haut = False
            y1=y1+5
            xf1=a*500+x1-a*y1 #faisceau côté droit
            yf1=500           # faisceau côté droit
            xf2=-a*500+x1+a*y1 #faiseau côté gauche
            yf2=500            # faisceau côté gauche
            field1=drawzone.create_polygon(xf1, yf1, xf2, yf2, x1, y1, fill="yellow")
            point=drawzone.create_oval(x1-5,y1-5,x1+5,y1+5, fill="black")
            if x2<=xf1 and x2>=xf2 and y2<=yf2 and y2<=yf2 and y1<=y2 and detecte==0:
                print("detecte")
                detecte = 1 #Ceci évite de se faire flooder par les "detecte" ;D
    #Et on y retourne ! C'est plus ou prou la même chose pour les trois "elif qui suivent"
        elif evt.keycode==39: #Garde se dirige vers la droite
            detecte=0
            droite=True
            gauche = False
            haut = False
            bas = False
            x1=x1+5
            xf1= 500 # faisceau bas
            yf1= a*500+y1-a*x1 # faisceau bas
            xf2= 500 # faisceau haut
            yf2= -a*500+y1+a*x1 #faisceau haut
            field3=drawzone.create_polygon(xf1, yf1, x1, y1, xf2, yf2, fill="yellow")
            point=drawzone.create_oval(x1-5,y1-5,x1+5,y1+5, fill="black")
            if x2>=xf1 and x2>=xf2 and y2<=yf1 and y2>=yf2 and detecte==0:
                detecte = 1
                print("detecte")
        elif evt.keycode==37: #Garde se dirige vers la gauche
            detecte=0
            gauche=True
            droite = False
            haut = False
            bas = False
            x1=x1-5
            xf1= 0       #faisceau haut
            yf1= y1-a*x1 #faisceau haut
            xf2= 0       #faisceau bas
            yf2= y1+a*x1 #faisceau bas
            field4=drawzone.create_polygon(xf1, yf1, x1, y1, xf2, yf2, fill="yellow")
            point=drawzone.create_oval(x1-5,y1-5,x1+5,y1+5, fill="black")
            if x2<=xf1 and x2<=xf2 and y2>=yf1 and y2<=yf2 & detecte==0:
                detecte = 1
                print("detecte")
        drawzone.tag_raise(player) #On remet le joueur en premier plan pour des raisons évidentes de visibilité.
     
     
     
    a= sqrt(3)/3 #Ceci est le coefficient de chaque droite qui compose le champ de vision, avec un angle de 60°
     
     
     
    fen=Tk() # On installe la fenêtre
    fen.geometry("500x500") #On donne ses dimensions
    fen.bind("<Key>", deplacement) #On la lie à l'évènement clavier
     
    drawzone=Canvas(height=500, width=500, bg="White") #On initie le canevas
    drawzone.place(x=0,y=0)
     
    point=drawzone.create_oval(245,245,255,255, fill="black") #On place le joueur
    player=drawzone.create_oval(x2,y2,y2+10,y2+10, fill="blue") #On place le garde
    fen.mainloop()





    Le problème étant, qu'actuellement, la détection souffre de quelques bugs, et, pour les triangles, la comparaison des coordonnées ne semble pas fonctionner. Serait-il possible de trouver une méthode plus fiable ?
    Ps: Je tiens à rappeler que ce sont là des cônes de vision, et non pas des rectangles, car j'ai vu plusieurs astuces quant à l'utilisation de la méthode find_overlapping, mais celle-ci ne s'adresse qu'aux rectangles, et non pas aux trianlges...

    Merci d'avance !

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Citation Envoyé par e.Saad Voir le message
    Ps: Je tiens à rappeler que ce sont là des cônes de vision, et non pas des rectangles, car j'ai vu plusieurs astuces quant à l'utilisation de la méthode find_overlapping, mais celle-ci ne s'adresse qu'aux rectangles, et non pas aux trianlges...
    .find_overlapping permet de savoir si les rectangles qui recouvrent vos triangles se chevauchent. Si c'est le cas, il faut alors calculer plus précisément s'ils se chevauchent vraiment (ou pas) et c'est une question d'algo. (ou de géométrie). Il y a des tas de bonnes idées à glaner avec votre moteur de recherche favori (mots clés: triangle intersection 2D).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2016
    Messages : 18
    Par défaut Merci Google... Mais y'a un hic.
    Citation Envoyé par wiztricks Voir le message
    Salut,



    .find_overlapping permet de savoir si les rectangles qui recouvrent vos triangles se chevauchent. Si c'est le cas, il faut alors calculer plus précisément s'ils se chevauchent vraiment (ou pas) et c'est une question d'algo. (ou de géométrie). Il y a des tas de bonnes idées à glaner avec votre moteur de recherche favori (mots clés: triangle intersection 2D).

    - W
    Je vous remercie pour votre rapide réponse !

    Cela dit, je m'excuse: Je me suis mal exprimé.

    L'idée n'est pas de trouver quand deux triangles se superposent, mais quand un triangle (le cône de vision d'un garde) et le joueur (un cercle) se chevauchent... Je ne sais pas si les formules que j'ai trouvé sont adaptables !

    Enfin, je suppose qu'entre trouver l'intersection d'une ligne avec un cercle ne devrait pas être trop compliquée si on considère la manière qu'a Tkinter de définir les cercles.
    Je vous remercie encore pour votre réponse, et vais tester cela dès que j'aurai un peu de temps libre !

    Merci encore !

    EDIT: Non, il reste un problème... Même si je trouve comment définir si ma ligne et mon cercle ont une intersection, comment pourrais je déterminer si le cercle se trouve dans l'espace délimité par les trois lignes qui forment mon triangle ?
    C'est justement là qu'est le problème, car j'avais trouvé une manière plutôt efficace de détecter le joueur s'il est dans le champ de vision du garde, le hic était que, s'il se trouvait juste à côté, même hors de son champ de vision, le garde pouvait quand même le "voir". J'ai peur que le problème ne se répète.
    Si vous avez deux minutes, je vous invite à tester le programme, que vous puissiez voir quel est le soucis... Je vais éditer le code pour qu'il soit un peu moins fastidieux à tester, et je vais améliorer les commentaires.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Citation Envoyé par e.Saad Voir le message
    L'idée n'est pas de trouver quand deux triangles se superposent, mais quand un triangle (le cône de vision d'un garde) et le joueur (un cercle) se chevauchent... Je ne sais pas si les formules que j'ai trouvé sont adaptables !
    Ah ben, vous avez des objets "métier" (cône de vision d'un garde, joueur,...) mais côté code, on ne voit que la représentation que vous en avez fait: "cercle", "triangle".


    Citation Envoyé par e.Saad Voir le message
    Enfin, je suppose qu'entre trouver l'intersection d'une ligne avec un cercle ne devrait pas être trop compliquée si on considère la manière qu'a Tkinter de définir les cercles.
    Le triangle étant convexe, il suffit qu'un de ses sommets soit à une distance (euclidienne) du centre du cercle inférieure à son rayon.

    C'est de la géométrie: tkinter ne fait que "représenter" plus ou moins bien cela avec des tas de pixels et vous donne accès à des optimisations comme .find_overlapping pour éviter de calculer vos distances euclidiennes à tous les coups.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2016
    Messages : 18
    Par défaut
    Citation Envoyé par wiztricks Voir le message


    Le triangle étant convexe, il suffit qu'un de ses sommets soit à une distance (euclidienne) du centre du cercle inférieure à son rayon.

    - W
    Oh... Oh attendez, je crois que je comprends. (j'ai pas mal gambergé là dessus, vous m'avez posé une colle au début ! J'ai besoin d'un café ^^" )

    Si jamais le joueur entre dans le champ de vision, c'est qu'il est à une certaine distance soit du point supérieur gauche, soit du point supérieur droit, soit du point d'origine du champ (le garde).

    Mais du coup, compte tenu de la taille du triangle, est-ce que ça sera applicable à l'intérieur du cercle ?
    Parce que bon, éviter de le détecter hors du champ, c'est bien sympa, mais le détecter à l'intérieur c'est quand même primordial !

    Je vois encore un hic: Si jamais je colle à cela une distance minimale pour la détection, cela aggrave encore le problème, à savoir que si jamais le joueur se déplace hors du champ, mais à une distance inférieure à la distance minimale, il sera quand même détecté.
    Adieu du coup les pas de loups pour rester hors de vision du garde, quand il peut vous détecter dans le dos, et même légèrement hors de son champ de vision...


    Je vois un professeur de mathématiques, ce soir, je lui demanderai à cette occasion, mais en attendant, je vais gamberger là dessus.

    Merci pour votre réponse, encore une fois !
    Vous êtes rapide ! Et clair, avec ça !

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Citation Envoyé par e.Saad Voir le message
    Je vois un professeur de mathématiques, ce soir, je lui demanderai à cette occasion, mais en attendant, je vais gamberger là dessus.
    Prenez aussi rendez vous avec un "psy" au cas où car vous êtes plutôt embrouillé/compliqué

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

Discussions similaires

  1. superposition d'objet et impression
    Par chris45 dans le forum Access
    Réponses: 4
    Dernier message: 05/03/2007, 20h13
  2. [VB6] Comment créer un objet TRIANGLE
    Par Lucas42 dans le forum VB 6 et antérieur
    Réponses: 14
    Dernier message: 17/05/2006, 16h15
  3. [Javascript] Détecter collision de deux objets <img>
    Par Invité4 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 04/04/2006, 08h54
  4. GLScene et les collisions entre les objets
    Par HopeLeaves dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 13/06/2005, 19h45
  5. Réponses: 4
    Dernier message: 25/09/2004, 09h58

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