Probleme collision avec tkinter

Fermé
baloo - Modifié le 17 oct. 2019 à 11:52
 baloo - 18 oct. 2019 à 19:01
Bonjour,
J'ai un probleme de collision entre une balle "black" et les decors cage la balle rebondie bien sur la boule mais pas sur le decors ca ne dois pas etre grand chose car ça marcher hier et ça ne marche plus aujourd'hui ,merci

 :def deplacement ():
    global dx,dy,vx,ms,x,y,x2,y2
    
    if can1.coords(black)[3]>500:
        dy=-1*dy
    if can1.coords(black)[2]>500:
        dx=-1*dx
    if can1.coords(black)[1]<0:
        dy=-1*dy
    if can1.coords(black)[0]<0:
        for i in range(50):
   
            x,y,=randrange(480),randrange(480)
            can1.coords(black,x,y,x+30,y+30)        
    if len(can1.find_overlapping(can1.coords(boule)[0],can1.coords(boule)[1],\
                                 can1.coords(boule)[2],can1.coords(boule)[3]))>1:
        dy=-1*dy
        dx=-1*dx
            
    if len(can1.find_overlapping(can1.coords(cage)[0],can1.coords(cage) [1],can1.coords(cage)[2],can1.coords(cage)[3]))>1:
        dy=-1*dy
        dx=-1*dx
    
    if len(can1.find_overlapping(can1.coords(cage2)[0],can1.coords(cage2) [1],can1.coords(cage2)[2],can1.coords(cage2)[3]))>1:
        
        dy=-1*dy
        dx=-1*dx
        
    can1.move(2,dx,dy)
    if flag>0:
        fen.after(ms,deplacement)
    



Configuration: Windows / Firefox 69.0

2 réponses

Bonsoir.

Il faudrait voir l'intégralité de ton programme, car difficile de tester sans voir à quoi tu veux aboutir.

Une chose m'étonne :

for i in range(50):
    x,y,=randrange(480),randrange(480)
    can1.coords(black,x,y,x+30,y+30)


Tu déplaces 50 fois l'élément black sans faire des test de collisions, donc à mon avis, ça ne peut pas fonctionner. D'ailleurs pourquoi le déplacer sur des positions aléatoires si le x est inférieur à 0 ? Quelle logique as-tu établi ici ?

if len(can1.find_overlapping(can1.coords(boule)[0],can1.coords(boule)[1],\
                                 can1.coords(boule)[2],can1.coords(boule)[3]))>1>1


Ces portions peuvent devenir plus limpide en utilisant le * pour faire de l'unpacking.
Tu n'as pas besoin non plus d'utiliser len, puisqu'une liste vide sera évaluée à False.

if can1.find_overlapping(*can1.coords(boule)):
    # code


Tu peux aussi abréger
dy=-1*dy
par
dy *= -1


Il y a aussi un abus de déclaration de var global, d'après ce que j'en vois, seules dx et dy ont besoin d'être globales.

Je pense quand même que ton problème émane de ta boucle for.
0
Bonjour khrug oui je peut abréger la 2ème solution mais je ne connais pas le unpaking? Et la vais me coucher mais je serais très intéressé de voir ça demain. Merci.
0
voici le code entier ,les variable en plus c'est p;lus tard :from tkinter import*
from random import*
from math import *
fen=Tk()
can1=Canvas(fen,height=500,width=500,bg="red")
can1.pack(side=RIGHT)
posx=200
posy=10
dx=5
dy=5
flag=0
vx=cos(1)
ms=25


x2=100
y2=100
x=1
y=1
fen.title("jeu")
boule=can1.create_rectangle(200,200,210,250,fill="yellow")
black=can1.create_oval(posx,posy,posx+30,posy+30,fill="black")
cage=can1.create_rectangle(400,250,500,260,fill="brown")
cage2=can1.create_rectangle(400,200,500,210,fill="brown")

trai_gagnant=can1.create_line(400,210,400,250,fill="red")
if black >trai_gagnant:
score =+1


def start ():
global flag,ms
if flag ==0:
flag=1

deplacement()


def stop ():
global flag,score
flag=0
score=0
print("score :",score)

def droite(event):
can1.move(boule,10,0)

def gauche(event):
can1.move(boule,-10,0)
def haut (event):
can1.move(boule,0,-10)

def bas(event):
can1.move(boule,0,10)

def deplacement ():
global dx,dy,ms,x,y

if can1.coords(black)[3]>500 or can1.coords(black)[1]<0:
dy=-dy
if can1.coords(black)[2]>500:
dx=-dx


if can1.coords(black)[0]<0:


x,y=randrange(480),randrange(480)
can1.coords(black,x,y,x+30,y+30)
if len( can1.find_overlapping(can1.coords(boule)[0],can1.coords(boule) [1],can1.coords(boule)[2],can1.coords(boule)[3]))>1:


dy=-dy
dx=-dx


if len(can1.find_overlapping(can1.coords(cage)[0],can1.coords(cage) [1],can1.coords(cage)[2],can1.coords(cage)[3]))>1:
dy=-dy
dx=-dx

if len(can1.find_overlapping(can1.coords(cage2)[0],can1.coords(cage2) [1],can1.coords(cage2)[2],can1.coords(cage2)[3]))>1:
dy=-dy
dx=-dx


can1.move(2,dx,dy)
if flag>0:
fen.after(ms,deplacement)








b_start=Button(fen,text="start",command=start)
b_start.pack()
b_stop=Button(fen,text="stop",command=stop)
b_stop.pack(side=LEFT)
bu_quit=Button(fen,text="quit",bg="green",command=fen.destroy)
bu_quit.pack(side=BOTTOM)

fen.bind("<Right>",droite)
fen.bind("<Left>",gauche)
fen.bind("<Up>",haut)
fen.bind("<Down>",bas)


fen.mainloop()
0
Bonjour.

Canvas.find_overlapping retourne une liste d'identifiants du canevas chevauchant le quadrlatère des coordonnées spécifiées.

Donc, ce que tu dois vérifier est que parmi ces identifiants ne se trouve pas ceux de tes obstacles (cage, cage2, boule).
Tu n'as besoin d'utiliser find_overlapping UNIQUEMENT que sur l'élément se déplaçant, donc avec les coordonnées de l'élément black.

Par contre, il faudrait voir à nommer tes variables par ce qu'elles représentent, dans ton code black est un cercle, et boule un rectangle, ce n'est pas logique, black devrait se nommer boule (ou encore bille, balle, etc.), enfin un nom informant de la nature de l'objet, boule devrait par ex. se nommer raquette.

Et je n'ai toujours pas saisi le pourquoi du random.randrange...
0
Bonjour, c'est un code que j'ai modifié bien des fois à la base boule était une boule jaune que je fessait bouger avec les touches clavier après j'ai rajouté des balles "black" que j'ai faire apparaître au hasard et en dernier j'ai rajouté des cages mais le code je l'ai vue marcher et black rebondissait sur cage mais au lieu de l'enregistrement j'ai faire autre choses voilà mais merci de ta réponse !.
0
baloo > Baloo
18 oct. 2019 à 19:01
Bon ça marche merci beaucoup a tout le monde et surtout à krug pour l'attention qu'il m'a porter!!!
from tkinter import*
from random import*
from math import *
fen=Tk()
can1=Canvas(fen,height=500,width=500,bg="red")
can1.pack(side=RIGHT)
posx=200
posy=10
dx=2
dy=5
flag=0
vx=cos(1)
ms=25
score=0

x2=100
y2=100
x=1
y=1
fen.title("jeu")
rec=can1.create_rectangle(200,200,210,250,fill="yellow")
black=can1.create_oval(posx,posy,posx+30,posy+30,fill="black")
cage=can1.create_rectangle(400,200,500,210,fill="brown")
cage2=can1.create_rectangle(400,250,500,260,fill="brown")


trai_gagnant=can1.create_line(400,210,400,250,fill="green")

if trai_gagnant>black:
score+=1


def start ():
global flag,ms
if flag ==0:
flag=1

deplacement()


def stop ():
global flag,score
flag=0
score=0
print("score :",score)

def droite(event):
can1.move(rec,10,0)

def gauche(event):
can1.move(rec,-10,0)

def haut (event):
can1.move(rec,0,-10)

def bas(event):
can1.move(rec,0,10)

def deplacement ():
global dx,dy,vx,ms,x,y,x2,y2

if can1.coords(black)[3]>500 or can1.coords(black)[1]<0:
dy=-dy
if can1.coords(black)[2]>500:
dx=-dx

if can1.coords(black)[0]<0:

x,y=randrange(480),randrange(480)
can1.coords(black,x,y,x+30,y+30)
if len(can1.find_overlapping(can1.coords(black)[0],can1.coords(black)[1],can1.coords(black)[2],can1.coords(black)[3]))>1:
dx=-dx
dy=-dy


if len(can1.find_overlapping(can1.coords(cage)[0],can1.coords(cage) [1],can1.coords(cage)[2],can1.coords(cage)[3]))>1:
dx=-dx
dy=-dy



if len(can1.find_overlapping(can1.coords(cage2)[0],can1.coords(cage2) [1],can1.coords(cage2)[2],can1.coords(cage2)[3]))>1:
dy=-dy
dx=-dx



can1.move(2,dx,dy)
if flag>0:
fen.after(ms,deplacement)



b_start=Button(fen,text="start",command=start)
b_start.pack()
b_stop=Button(fen,text="stop",command=stop)
b_stop.pack(side=LEFT)
bu_quit=Button(fen,text="quit",bg="green",command=fen.destroy)
bu_quit.pack(side=BOTTOM)

fen.bind("<Right>",droite)
fen.bind("<Left>",gauche)
fen.bind("<Up>",haut)
fen.bind("<Down>",bas)

fen.mainloop()
0