#1 Le 27/05/2015, à 09: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
Hors ligne
#2 Le 27/05/2015, à 20: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, à 12:53
- Tony35
Re : [Python] Collision de 2 traits en rotation
Nickel Je vais pouvoir me servir du click droit pour assembler les différentes parties.
Dernière modification par Tony35 (Le 28/05/2015, à 13:00)
Hors ligne