Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 27/05/2015, à 10:21

Tony35

[Python] Collision de 2 traits en rotation

Bonjour, ça fait quelques jours que je suis bloqué sur quelque chose pourtant assez simple je pense, mais disons que je ne suis pas très doué ...

Enfait ici je veux juste détecter la collision du trait1 et du trait2 lorsqu'ils se touchent (à peu près), sachant qu'ils tournent en rotation avec la souris de l'utilisateur.

Tout d'abord voici mon code sans la collision :

from tkinter import *

from math import*

#Fenêtre :
fen1 = Tk()
fen1.title("Jeu")

def mouvement(event):
    #Calcul de l'angle de rotation :
    global angle
    dx = can1.canvasx(event.x) - centre[0] #Distance entre x et le centre
    dy = can1.canvasy(event.y) - centre[1]
    angle = complex(dx, dy)/ abs(complex(dx, dy)) #on a e^i0

    for (obj,coord) in disque1:
        tournerdisquesens1(obj, coord);
    for (obj,coord) in disque2:
        tournerdisquesens2(obj, coord)


def tournerdisquesens1 (objet, coord):
    #Tourne dans le sens de la souris
    global angle
    newxy = []
    for x, y in coord: #Dans les coordonnées du polygone
        z = complex(x,y)
        v = angle*(z-zc) + zc #z=e^i0*(z - zc) + zc
        newxy.append(v.real)#.append : Ajoute une valeur à la fin de la liste newxy
        newxy.append(v.imag) 
    can1.coords(objet, *newxy) #Change les coordonnées, *: unpack

def tournerdisquesens2 (objet, coord):
    #Tourne dans le sens inverse de la souris
    global angle
    newxy = []
    for x, y in coord:
        z = complex(x,y)
        v = 1/angle * (z - zc) + zc   #1/angle = 1/e^i0 = e^-i0
        newxy.append(v.real) 
        newxy.append(v.imag)
    can1.coords(objet, *newxy)

                          
#Centre : 
centre = 200, 200 #Donc center[0]=200
zc = complex(centre[0], centre[1]) #Coordonnées du centre


#Canevas :
can1 = Canvas(fen1, bg='dark grey', width=400, height=400)
can1.pack(side=BOTTOM)



#Elements : #Du plus petit au plus grand
cercle1 = can1.create_oval(150,150,250,250,width=2,outline='yellow',activeoutline='white', activewidth=3)
cercle2 = can1.create_oval(100,100,300,300,width=2,outline='red',activeoutline='white', activewidth=3)
cercle3 = can1.create_oval(50,50,350,350,width=2,outline='blue',activeoutline='white', activewidth=3)




ctrait1 = [(165,165), (200,200)]
trait1 = can1.create_line(ctrait1,width=2,fill='red') # Coordonnées : (x1,y1,x2,y2)

ctrait2 = [(125,125), (175,175)]
trait2 = can1.create_line(ctrait2,width=2,fill='blue')

disque1=[(trait1,ctrait1)]
disque2=[(trait2,ctrait2)]



can1.bind("<B1-Motion>", mouvement) #Mouvement de la souris avec click gauche

Button(fen1,text='Quitter',command=fen1.destroy, relief=RAISED, cursor ="pirate").pack(side=BOTTOM)

# démarrage du réceptionnaire d'évènements (boucle principale) :
fen1.mainloop()

Et mes recherches sur la détection de collision :

collision2=can1.find_overlapping(*can1.bbox(trait1))
if len(collision2) > 1 :#and cercle1 not in collision2:
        # aïe ! dommage !
        print("collision2")

'''if can1.find_overlapping(trait1X-20, trait1Y-20, X+20, trait1Y+20):
    print("cccooollission")
'''

if ctrait1 == ctrait2:
    print("collision")


def Collisions():

        trait1 = can1.find_withtag("trait1")
        trait2 = can1.find_withtag("trait2")
        
        x1, y1, x2, y2 = can1.bbox(trait2)
        overlap = can1.find_overlapping(x1, y1, x2, y2)
            
        for ovr in overlap:
          
            if trait1[0] == ovr:
                print("collision")
                create_text(text="Game Over")  

Collisions()

Voilà ! Si quelqu'un pourrait m'éclairer smile

Hors ligne

#2 Le 27/05/2015, à 21:09

pingouinux

Re : [Python] Collision de 2 traits en rotation

Bonsoir,

J'ai testé avec ceci

def Collisions(event):

        overlap = can1.find_overlapping(*can1.bbox(trait2))
          
        if trait1 in overlap: print("Collision")
        else:                 print("Pas de collision")

qui est appelé en cliquant sur le bouton droit de la souris

can1.bind("<ButtonPress-3>", Collisions)

Ça a l'air de marcher. À toi de l'adapter…

Hors ligne

#3 Le 28/05/2015, à 13:53

Tony35

Re : [Python] Collision de 2 traits en rotation

Nickel smile Je vais pouvoir me servir du click droit pour assembler les différentes parties.

Dernière modification par Tony35 (Le 28/05/2015, à 14:00)

Hors ligne