et dans le code, ça donnerait quoi ?
Version imprimable
plusieurs solutions :
* soit on mémorise la position (x, y) d'un rond au moment où on le crée puis on le compare à la position (X, Y) de notre carré
* soit on fait une détection "en aveugle" avec canvas.find_overlapping(), mais avec le problème de l'accélération dep, on risque de ne pas détecter le rond (sauf bidouille)
pour faire disparaître un rond : à sa création, on mémorise son identifiant id_rond de canvasItem :
puis, le moment venu, on le fait disparaître :Code:
1
2
3
4 # création de l'objet à attraper pX = randrange(5, 495) pY = randrange(5, 495) id_rond = canevas.create_oval(pX, pY, pX+5, pY+5, outline='white', fill='green')
à vous de jouer.Code:canevas.delete(id_rond)
ce qu'il y a c'est que je ne connais aucune des deux techniques j'aurai besoin d'un peu plus de précisions ...
Citation:
pour faire disparaître un rond : à sa création, on mémorise son identifiant id_rond de canvasItem :
puis, le moment venu, on le fait disparaître :Code:
1
2
3
4 # création de l'objet à attraper pX = randrange(5, 495) pY = randrange(5, 495) id_rond = canevas.create_oval(pX, pY, pX+5, pY+5, outline='white', fill='green')
ca par contre ca devrait aller !Code:canevas.delete(id_rond)
à vous de jouer
Quand vous créez votre rond, vous écrivez ceci dans la fonction newgame() :
sauf que pour le moment, ni pX ni pY ne sont globales : une fois la fonction newgame() terminée, l'ordinateur supprimera ces variables car elles sont dites "locales" à la fonction, c'est-à-dire qu'elles n'existent que pour la fonction qui les a créées.Code:
1
2
3
4 # création de l'objet à attraper pX = randrange(5, 495) pY = randrange(5, 495) id_rond = canevas.create_oval(pX, pY, pX+5, pY+5, outline='white', fill='green')
de plus, pX et pY, ce n'est pas très parlant. il vaudrait mieux les appeler rondX et rondY.
une fois qu'on a fait ça, on peut comparer (rondX, rondY) à (carreX, carreY) dans la fonction move().
c'est plus clair ?
bonjour, j'ai commencé ca mais ca ne marche pas ...
Code:
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 #!/usr/bin/env python # -*- coding: utf-8 -*- from random import randrange from Tkinter import * # zone de définition des fonctions def newgame():#definition des aprametres du jeu global X, Y, dep, direction # initialisation de dep dep = 3 # on démarre à 3 pixels # création de l'objet à attraper rondX = randrange(5, 495) rondY = randrange(5, 495) id_rond=canevas.create_oval(rondX, rondY, rondX+5, rondY+5, outline='white', fill='green') # création de l'obstacle rectX = randrange(5, 495) rectY = randrange(5, 495) id_rect=canevas.create_rectangle(rectX, rectY, rectX+20, rectY+10, outline='black', fill='black') # mise en mouvement possible du carré direction = '' id_carre=canevas.coords(carre, carreX, carreY, carreX+10, carreY+10) move () # utilisation des flèches du clavier fenetre.bind("<Right>", right) fenetre.bind('<Left>', left) fenetre.bind('<Up>', up) fenetre.bind('<Down>', down) # end def def move():#definitions des mouvements du carré global X, Y, dep, direction # mise en mouvement if direction == 'gauche': carreX -= dep elif direction == 'droite': carreX += dep elif direction == 'haut': carreY -= dep elif direction == 'bas': carreY += dep # end if #acceleration du carré possible if dep <= 20: dep +=0.1 # déplacement du carré canevas.coords(carre, carreX, carreY, carreX+10, carreY+10) # on reprend le prochain pas dans 700 ms fenetre.after(100, move) # Si sortie d'un côté, entrée de l'autre côté if carreY > 500: carreY = 0 elif carreY < 0: carreY = 500 # end if if carreX > 500: carreX = 0 elif carreX < 0: carreX = 500 # end if # === FIXME === # # si collision (carré, rond): # supprimer rond touché # générer nouveau rond aléatoire # générer 2 blocs noirs aléatoires # fin si # end def # directions def left (event):#mouvement vers la gauche global direction direction = 'gauche' # end def def right (event):#mouvement vers la droite global direction direction = 'droite' # end def def up (event):#mouvement vers le haut global direction direction = 'haut' # end def def down (event):#mouvement vers le bas global direction direction = 'bas' # end def # création de l'interface graphique fenetre = Tk() fenetre.title('Jeu Final') # canevas graphique canevas = Canvas(fenetre, width=500, height=500, bg='#046380') canevas.pack(side=TOP, padx=5, pady=5) # init coordonnées du carré carreX, carreY = (235, 250) # dessin du carré carre = canevas.create_rectangle(carreX, carreY, carreX+10, carreY+10, outline='white', fill='#C03000') # init boutons Button(fenetre, text='New Game', command=newgame).pack(side=LEFT, padx=5, pady=5) Button(fenetre, text='Quitter', command=fenetre.destroy).pack(side=RIGHT, padx=5, pady=5) #infos Label(fenetre, text="Cliquez sur 'New Game' pour commencer").pack(padx=0, pady=11) # on lance la boucle principale fenetre.mainloop()
Bonjour,
Voyons :
Je me mets à la place de l'ordinateur et qu'est-ce que je vois ? On utilise des variables rondX et rondY dans canvas.create_oval() sans les avoir initialisées avant ?Code:
1
2
3
4
5
6
7
8
9 def newgame():#definition des aprametres du jeu global x, y, dep, direction # initialisation de dep dep = 3 # on démarre à 3 pixels # création de l'objet à attraper pX = randrange(5, 495) pY = randrange(5, 495) id_rond=canevas.create_oval(rondX, rondY, rondX+5, rondY+5, outline='white', fill='green')
C'est comme si je vous demandais de mettre un lanfounet dans votre cabas. :)
oui mais a combien dois-je initialiser ?
j'ai encore modifiéCode:
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 #!/usr/bin/env python # -*- coding: utf-8 -*- from random import randrange from Tkinter import * # zone de définition des fonctions def newgame():#definition des aprametres du jeu global X, Y, dep, direction # initialisation de dep dep = 3 # on démarre à 3 pixels # création de l'objet à attraper rondX = randrange(5, 495) rondY = randrange(5, 495) id_rond=canevas.create_oval(rondX, rondY, rondX+5, rondY+5, outline='white', fill='green') # création de l'obstacle rectX = randrange(5, 495) rectY = randrange(5, 495) id_rect=canevas.create_rectangle(rectX, rectY, rectX+20, rectY+10, outline='black', fill='black') # mise en mouvement possible du carré direction = '' id_carre=canevas.coords(carre, carreX, carreY, carreX+10, carreY+10) move () # utilisation des flèches du clavier fenetre.bind("<Right>", right) fenetre.bind('<Left>', left) fenetre.bind('<Up>', up) fenetre.bind('<Down>', down) # end def def move():#definitions des mouvements du carré global X, Y, dep, direction # mise en mouvement if direction == 'gauche': carreX -= dep elif direction == 'droite': carreX += dep elif direction == 'haut': carreY -= dep elif direction == 'bas': carreY += dep # end if #acceleration du carré possible if dep <= 20: dep +=0.1 # déplacement du carré canevas.coords(carre, carreX, carreY, carreX+10, carreY+10) # on reprend le prochain pas dans 700 ms fenetre.after(100, move) # Si sortie d'un côté, entrée de l'autre côté if carreY > 500: carreY = 0 elif carreY < 0: carreY = 500 # end if if carreX > 500: carreX = 0 elif carreX < 0: carreX = 500 # end if # === FIXME === # # si collision (carré, rond): # supprimer rond touché # générer nouveau rond aléatoire # générer 2 blocs noirs aléatoires # fin si # end def # directions def left (event):#mouvement vers la gauche global direction direction = 'gauche' # end def def right (event):#mouvement vers la droite global direction direction = 'droite' # end def def up (event):#mouvement vers le haut global direction direction = 'haut' # end def def down (event):#mouvement vers le bas global direction direction = 'bas' # end def # création de l'interface graphique fenetre = Tk() fenetre.title('Jeu Final') # canevas graphique canevas = Canvas(fenetre, width=500, height=500, bg='#046380') canevas.pack(side=TOP, padx=5, pady=5) # init coordonnées du carré carreX, carreY = (235, 250) # dessin du carré carre = canevas.create_rectangle(carreX, carreY, carreX+10, carreY+10, outline='white', fill='#C03000') # init boutons Button(fenetre, text='New Game', command=newgame).pack(side=LEFT, padx=5, pady=5) Button(fenetre, text='Quitter', command=fenetre.destroy).pack(side=RIGHT, padx=5, pady=5) #infos Label(fenetre, text="Cliquez sur 'New Game' pour commencer").pack(padx=0, pady=11) # on lance la boucle principale fenetre.mainloop()
Et quand vous lancez le script, est-ce que Python vous couine des insanités genre NameError à l'oreille ?
En revanche, vous avez une faute ici :
Rappel (extrait de la doc Tkinter) :Code:id_carre=canevas.coords(carre, carreX, carreY, carreX+10, carreY+10)
Faites aussi attention à vos globales partout dans votre script => l'ordinateur ne peut pas savoir qu'une variable est globale dans une fonction si vous ne le lui dites pas.Citation:
.coords(tagOrId, x0, y0, x1, y1, ..., xn, yn)
If you pass only the tagOrId argument, returns a tuple of the coordinates of the lowest or only object specified by that argument. The number of coordinates depends on the type of object. In most cases it will be a 4-tuple (x1, y1, x2, y2) describing the bounding box of the object.
You can move an object by passing in new coordinates.
non ... j'ai caCode:
1
2
3
4
5
6
7
8
9 Exception in Tkinter callback Traceback (most recent call last): File "C:\Python27\lib\lib-tk\Tkinter.py", line 1470, in __call__ return self.func(*args) File "C:\Users\Manon\Documents\Programme Python\snake.py", line 28, in newgame move () File "C:\Users\Manon\Documents\Programme Python\snake.py", line 55, in move canevas.coords(carre, carreX, carreY, carreX+10, carreY+10) UnboundLocalError: local variable 'carreX' referenced before assignment
comment reconnaître x de carrex rondx et rectx si je mets juste x ?Citation:
En revanche, vous avez une faute ici :
Code:id_carre=canevas.coords(carre, carreX, carreY, carreX+10, carreY+10)
mais j'ai mis les globales ?Citation:
Faites aussi attention à vos globales partout dans votre script => l'ordinateur ne peut pas savoir qu'une variable est globale dans une fonction si vous ne le lui dites pas.
Mêmes causes, mêmes effets : les globales.
Où sont passées les déclarations de carreX, carreY en globales, ici ?Code:
1
2 def move():#definitions des mouvements du carré global X, Y, dep, direction
Et X et Y : toujours d'actualité ?
Non, canvas.coords() ne retourne pas un id_carre.Citation:
comment reconnaître x de carrex rondx et rectx si je mets juste x ?
Vous vouliez sans doute dire (en bas du script) :
et par conséquent (dans newgame()) :Code:
1
2
3
4
5
6 # init coordonnées du carré carreX, carreY = (235, 250) # dessin du carré #carre = canevas.create_rectangle(carreX, carreY, carreX+10, carreY+10, outline='white', fill='#C03000') id_carre = canevas.create_rectangle(carreX, carreY, carreX+10, carreY+10, outline='white', fill='#C03000')
D'ailleurs, en étant tâtillon, cette ligne ne sert à rien, puisqu'on va retrouver canevas.coords() dans move() à la ligne suivante.Code:
1
2
3
4
5 # mise en mouvement possible du carré direction = '' #id_carre=canevas.coords(carre, carreX, carreY, carreX+10, carreY+10) canevas.coords(id_carre, carreX, carreY, carreX+10, carreY+10) move ()
A la limite : drop it!
et non, justement :Citation:
mais j'ai mis les globales ?
Où sont déclarés rondX, rondY, id_rond, rectX, rectY et id_rect dans global ?Code:
1
2
3
4 def newgame():#definition des aprametres du jeu global X, Y, dep, direction # initialisation de dep dep = 3 # on démarre à 3 pixels
Pour moi (et pour l'ordi), ces variables sont pour l'instant locales à la fonction.
X et Y toujours d'actualité ?
voila j'ai modifié :
Code:
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 #!/usr/bin/env python # -*- coding: utf-8 -*- from random import randrange from Tkinter import * # zone de définition des fonctions def newgame():#definition des aprametres du jeu global rondX, rondY, rectX, rectY, carreX, carreY, dep, direction, id_rond, id_rect, id_carre # initialisation de dep dep = 3 # on démarre à 3 pixels # création de l'objet à attraper rondX = randrange(5, 495) rondY = randrange(5, 495) id_rond=canevas.create_oval(rondX, rondY, rondX+5, rondY+5, outline='white', fill='green') # création de l'obstacle rectX = randrange(5, 495) rectY = randrange(5, 495) id_rect=canevas.create_rectangle(rectX, rectY, rectX+20, rectY+10, outline='black', fill='black') # mise en mouvement possible du carré direction = '' move () # utilisation des flèches du clavier fenetre.bind("<Right>", right) fenetre.bind('<Left>', left) fenetre.bind('<Up>', up) fenetre.bind('<Down>', down) # end def def move():#definitions des mouvements du carré global carreX, carreY, dep, direction, id_carre # mise en mouvement if direction == 'gauche': carreX -= dep elif direction == 'droite': carreX += dep elif direction == 'haut': carreY -= dep elif direction == 'bas': carreY += dep # end if #acceleration du carré possible if dep <= 20: dep +=0.1 # déplacement du carré canevas.coords(id_carre, carreX, carreY, carreX+10, carreY+10) # on reprend le prochain pas dans 700 ms fenetre.after(100, move) # Si sortie d'un côté, entrée de l'autre côté if carreY > 500: carreY = 0 elif carreY < 0: carreY = 500 # end if if carreX > 500: carreX = 0 elif carreX < 0: carreX = 500 # end if # === FIXME === # # si collision (carré, rond): # supprimer rond touché # générer nouveau rond aléatoire # générer 2 blocs noirs aléatoires # fin si # end def # directions def left (event):#mouvement vers la gauche global direction direction = 'gauche' # end def def right (event):#mouvement vers la droite global direction direction = 'droite' # end def def up (event):#mouvement vers le haut global direction direction = 'haut' # end def def down (event):#mouvement vers le bas global direction direction = 'bas' # end def # création de l'interface graphique fenetre = Tk() fenetre.title('Jeu Final') # canevas graphique canevas = Canvas(fenetre, width=500, height=500, bg='#046380') canevas.pack(side=TOP, padx=5, pady=5) # init coordonnées du carré carreX, carreY = (235, 250) # dessin du carré carre = canevas.create_rectangle(carreX, carreY, carreX+10, carreY+10, outline='white', fill='#C03000') # init boutons Button(fenetre, text='New Game', command=newgame).pack(side=LEFT, padx=5, pady=5) Button(fenetre, text='Quitter', command=fenetre.destroy).pack(side=RIGHT, padx=5, pady=5) #infos Label(fenetre, text="Cliquez sur 'New Game' pour commencer").pack(padx=0, pady=11) # on lance la boucle principale fenetre.mainloop()
Ah ? Presque :
Qui donne :Code:
1
2 # dessin du carré carre = canevas.create_rectangle(carreX, carreY, carreX+10, carreY+10, outline='white', fill='#C03000')
Beute ouaille ? :mrgreen:Code:
1
2
3
4
5
6
7
8
9 Exception in Tkinter callback Traceback (most recent call last): File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1489, in __call__ return self.func(*args) File "./manon+snake.py", line 28, in newgame move () File "./manon+snake.py", line 55, in move canevas.coords(id_carre, carreX, carreY, carreX+10, carreY+10) NameError: global name 'id_carre' is not defined
Hint du souffleur : "but why ?"
Ou encore : "ok, mais pourquoi, justement ?"
Je rigole, mais on est tous passé par là, et on y repasse parfois...
Je crois que tu stresses un peu, et tu ne prends pas assez de recul. Ne cherches pas à aller trop vite, respire, et suis au pieds de la lettre les indications de tarball69. Remarque valable pour tous ceux concernés par ce genre de travail, ceci dit. En tous cas, chapeau tarball69 !
et donc en attendant de resoudre lautre probleme j'ai commencé ca est ce que c'est bien ?
Code:
1
2
3
4
5
6 def action: global carreX, carreY, rondX, rondY, rectX, rectY if carreX=rondX and carreY=rondY: id_rond.delete() id_rect.create() #end def
bon, on va essayer d'accélérer un peu la cadence. ;)
donc : def action sans parenthèses, ça ne le fait pas : on définit une fonction avec def, alors même s'il n'y a pas d'arguments à la fonction, il faut toujours mettre des parenthèses avec def nom_de_fonction ().
Exemple :
Ensuite, Python comprend parfaitement la comparaison de coordonnées de points (tuples) :Code:
1
2
3
4
5
6 def action (): global carreX, carreY, rondX, rondY, rectX, rectY if carreX=rondX and carreY=rondY: id_rond.delete() id_rect.create() #end def
Pour finir, id_rond.delete() et id_rect.create(), je ne sais pas d'où ça sort, ce truc ? :roll:Code:
1
2
3
4
5
6 def action (): global carreX, carreY, rondX, rondY, rectX, rectY if (carreX, carreY) == (rondX, rondY): id_rond.delete() id_rect.create() #end def
Je suppose que vous vouliez dire :
Ceci dit, l'ensemble de ce code mis dans une fonction action() => je ne vois pas trop l'intérêt : vous avez la fonction move() dans laquelle vous pouvez effectuer ce test.Code:
1
2
3
4
5
6 def action (): global carreX, carreY, rondX, rondY, rectX, rectY if (carreX, carreY) == (rondX, rondY): canevas.delete(id_rond) nouvel_obstacle() # on le définira ensuite #end def
Pourquoi créer une nouvelle action pour ça ?
donc voila mon dernier code modifié
et j'ai toujours ce probleme que je ne sais pas comment reglerCode:
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 #!/usr/bin/env python # -*- coding: utf-8 -*- from random import randrange from Tkinter import * # zone de définition des fonctions def newgame():#definition des aprametres du jeu global rondX, rondY, rectX, rectY, carreX, carreY, dep, direction, id_rond, id_rect, id_carre # initialisation de dep dep = 3 # on démarre à 3 pixels # création de l'objet à attraper rondX = randrange(5, 495) rondY = randrange(5, 495) id_rond=canevas.create_oval(rondX, rondY, rondX+5, rondY+5, outline='white', fill='green') # création de l'obstacle rectX = randrange(5, 495) rectY = randrange(5, 495) id_rect=canevas.create_rectangle(rectX, rectY, rectX+20, rectY+10, outline='black', fill='black') # mise en mouvement possible du carré direction = '' move () # utilisation des flèches du clavier fenetre.bind("<Right>", right) fenetre.bind('<Left>', left) fenetre.bind('<Up>', up) fenetre.bind('<Down>', down) # end def def move():#definitions des mouvements du carré global carreX, carreY, dep, direction, id_carre # mise en mouvement if direction == 'gauche': carreX -= dep elif direction == 'droite': carreX += dep elif direction == 'haut': carreY -= dep elif direction == 'bas': carreY += dep # end if #acceleration du carré possible if dep <= 20: dep +=0.1 # déplacement du carré canevas.coords(id_carre, carreX, carreY, carreX+10, carreY+10) # on reprend le prochain pas dans 700 ms fenetre.after(100, move) # Si sortie d'un côté, entrée de l'autre côté if carreY > 500: carreY = 0 elif carreY < 0: carreY = 500 # end if if carreX > 500: carreX = 0 elif carreX < 0: carreX = 500 # end if if (carreX, carreY) == (rondX, rondY): canevas.delete(id_carre) # end def # directions def left (event):#mouvement vers la gauche global direction direction = 'gauche' # end def def right (event):#mouvement vers la droite global direction direction = 'droite' # end def def up (event):#mouvement vers le haut global direction direction = 'haut' # end def def down (event):#mouvement vers le bas global direction direction = 'bas' # end def # création de l'interface graphique fenetre = Tk() fenetre.title('Jeu Final') # canevas graphique canevas = Canvas(fenetre, width=500, height=500, bg='#046380') canevas.pack(side=TOP, padx=5, pady=5) # init coordonnées du carré carreX, carreY = (235, 250) # dessin du carré carre = canevas.create_rectangle(carreX, carreY, carreX+10, carreY+10, outline='white', fill='#C03000') # init boutons Button(fenetre, text='New Game', command=newgame).pack(side=LEFT, padx=5, pady=5) Button(fenetre, text='Quitter', command=fenetre.destroy).pack(side=RIGHT, padx=5, pady=5) #infos Label(fenetre, text="Cliquez sur 'New Game' pour commencer").pack(padx=0, pady=11) # on lance la boucle principale fenetre.mainloop()
Code:
1
2
3
4
5
6
7
8
9 Exception in Tkinter callback Traceback (most recent call last): File "C:\Python27\lib\lib-tk\Tkinter.py", line 1470, in __call__ return self.func(*args) File "C:\Users\Manon\Documents\Programme Python\snake.py", line 27, in newgame move () File "C:\Users\Manon\Documents\Programme Python\snake.py", line 54, in move canevas.coords(id_carre, carreX, carreY, carreX+10, carreY+10) NameError: global name 'id_carre' is not defined
Lisez la dernière ligne du message d'erreur et faites le rapprochement avec ça :
il vous dit que id_carre n'est pas défini au moment de s'en servir.Code:
1
2 # dessin du carré carre = canevas.create_rectangle(carreX, carreY, carreX+10, carreY+10, outline='white', fill='#C03000')
pourquoi ? parce que......
au temps pour moi, je suis allé un peu vite, c'est id_rond qu'on supprime :Code:
1
2 if (carreX, carreY) == (rondX, rondY): canevas.delete(id_carre)
Code:
1
2 if (carreX, carreY) == (rondX, rondY): canevas.delete(id_rond)
Parce qu'il n'est pas defini mais comment on le definie je ne l'avais jamais etudié avant donc je ne sais pas du tout coment faire
J'insiste là-dessus parce que c'est un bug qui arrive fréquemment quand on débute : on change le nom d'une variable, mais on oublie de répercuter ce changement partout dans le script.
Regardez bien :
Nous avons tout simplement oublié de répercuter le nouveau nom id_carre au bon endroit (à la place de l'ancien nom carre).Code:
1
2 # dessin du carré carre = canevas.create_rectangle(carreX, carreY, carreX+10, carreY+10, outline='white', fill='#C03000')
Code:
1
2 # dessin du carré id_carre = canevas.create_rectangle(carreX, carreY, carreX+10, carreY+10, outline='white', fill='#C03000')
Ah oui d'accord ! Je change ca merci
ca marche mais le rond disparaît pas quand le carré est dessus...
Oui, exact.
Je viens de faire quelques tests et vu les imprécisions dues au coef dep, on a mieux jeu de passer par les détections de collisions grâce à canvas.find_overlapping().
Bon, là, je ne vais pas m'étendre indéfiniment sur cette méthode canvas.find_overlapping().
Je vous file du code qui fonctionne :
on se servira aussi par la suite de la variable collisions pour gérer les blocs noirs qui tuent le carré joueur.Code:
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 def move(): """definitions des mouvements du carré""" global carreX, carreY, dep, direction # mise en mouvement if direction == 'gauche': carreX -= dep elif direction == 'droite': carreX += dep elif direction == 'haut': carreY -= dep elif direction == 'bas': carreY += dep # end if # détection de collisions d = dep//4 collisions = canevas.find_overlapping(carreX-d, carreY-d, carreX+10+d, carreY+10+d) # collision avec le rond ? if id_rond in collisions: canevas.delete(id_rond) #nouveau_rond() #nouvel_obstacle() # end if #acceleration du carré possible if dep <= 20: dep += 0.1 # Si sortie d'un côté, entrée de l'autre côté if carreY > 500: carreY = 0 elif carreY < 0: carreY = 500 # end if if carreX > 500: carreX = 0 elif carreX < 0: carreX = 500 # end if # déplacement du carré canevas.coords(id_carre, carreX, carreY, carreX+10, carreY+10) # on reprend le prochain pas dans 100 ms fenetre.after(100, move) # end def