Bonjour,
Je cherche à gérer les collisions entre 3 balles dans un canvas. Je ne sais pas comment appeler la méthode collision() de la classe Application dans la méthode deplacement() de la classe Balle. En plus je sens bien que mon programme est bancal car les tests de collisions sur les "murs" du canevas sont dans la classe Balle. Au final je ne sais pas bien si la classe Balle est nécessaire et il est peut être plus simple de tout regrouper dans une seule classe?
Meric
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
from tkinter import *
 
class Balle(object):
    def __init__(self,boss,x,y,r,coul):
        self.boss = boss
        self.x,self.y,self.r = x,y,r
        self.balle = boss.create_oval(x-r,y-r,x+r,y+r, width=2,fill=coul)
        self.xMax =int(boss.cget('width'))
        self.yMax =int(boss.cget('height'))
        self.sensV = 1
        self.sensH = 1
        self.dx,self.dy = 5,5
 
    def deplacement(self):
        "deplacement uniforme de la balle"
        self.boss.move(self.balle,self.dx* self.sensH,self.dy*self.sensV)
        self.x += self.dx
        self.y += self.dy
        # => appel de la methode collision
        self.orienter()
        self.boss.after(20,self.deplacement)
 
    def orienter(self):
        "test si il y a un choc, l'orientation de la balle change"
        #choc contre un mur vertical
        if self.x <= self.r or self.x >= self.xMax- self.r:
            self.dx = -1 * self.sensH * self.dx
        #choc contre un mur horizontal
        if self.y <= self.r or self.y >= self.yMax- self.r:
            self.dy = -1 * self.sensV * self.dy
 
class Application(Frame):
    "fenetre principale de l'application"
    def __init__(self):
        Frame.__init__(self)
        self.master.title('gestion des collisions')
        self.pack()
        self.jeu = Canvas(self,width=300,height=300,bg='ivory')
        self.jeu.pack(padx=10, pady=10)
        self.b1=Balle(self.jeu,20,150,5,coul ='red')
        self.b2=Balle(self.jeu,165,180,5,coul ='blue')
        self.b3=Balle(self.jeu,180,120,5,coul ='yellow')
        #liste parcouru pour les tests de collisions
        self.listBalle = [self.b1,self.b2,self.b3] 
        self.b1.deplacement()
        self.b2.deplacement()
        self.b3.deplacement()
 
    def collision(self):
        "gestion des collisions entre les balles"
        #test de collision
        i,j = 0,1
        while i <(len(self.listBalle)):
            while j <(len(self.listBalle)):
                if (self.b[i].x -self.b[j].x)**2+(self.b[i].y /
                                                  -self.b[j].y)**2==(2*self.b[i].r)**2:
                    print('collision')
                j=j+1
            i=i+1
            j=i+1 
 
 
if __name__ == '__main__':
 
    Application().mainloop()