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 128 129 130 131 132 133 134 135 136 137
| #!/usr/bin/env python
# -*- coding: utf-8 -*-
from Tkinter import *
from random import randrange
from partie1_coord_droite_finie import est_dans_polygone
# procédure générale de déplacement :
def move():
# global n'est utile que si on MODIFIE une globale
#~ global dep, sx, sy
# on extrait XY, r avant d'effectuer le test
x0, y0, x1, y1 = can1.bbox(cerc1)
# calcul du rayon
r = (x1 - x0) / 2
# détermination de XY
x = x0 + r
y = y0 + r
XY = (x, y)
# debug: on vérifie dans la console
print "XY:", XY, "rayon r:", r, "polygone1:", polygone1
# on teste si la balle est dans le polygone
if est_dans_polygone(XY, r, polygone1[0], polygone1[1]):
# tout est OK on se déplace
can1.move(cerc1, sx*dep, sy*dep)
can1.after(100, move)
# la balle est sortie
else:
# debug: on affiche dans la console
print "la balle est sortie !"
# la partie est terminée
game_over()
def game_over():
# la partie est finie !
left = can1.winfo_reqwidth() // 2
top = can1.winfo_reqheight() // 2
can1.create_text(
left, top - 40,
text="GAME OVER!",
font="sans 24 bold",
fill="gold",
)
# gestionnaires d'évènements:
def dep1_gauche(event=None):
global sx, sy
sx = -1
sy = 0
def dep1_droite(event=None):
global sx, sy
sx = 1
sy = 0
def dep1_haut(event=None):
global sy, sx
sy = -1
sx = 0
def dep1_bas(event=None):
global sy, sx
sy = 1
sx = 0
def start_it():
"démarrage de l'animation"
global flag
flag = not flag
move()
def pause() :
"arret de l'animation"
# nous servira quand on touchera le mur
global flag
flag = 0
# Programme principal
# les variables suivantes seront utilisées de manière globale:
X, Y = 110, 70 # coordonnées initiales
d = 10 # diamètre de la balle
sx, sy = 1, 0 # sens de déplacement
dep = 5 # quantité de déplacement (pixels)
flag = 0 # commutateur
# Création du widget principal ("maître"):
# fenêtre principale
fen1 = Tk()
fen1.title("Super Ball")
# création des widgets "esclaves":
# composants
can1 = Canvas(fen1, bg='white', height=500, width=500)
cerc1 = can1.create_oval(X, Y, X + d, Y + d, fill='grey')
can1.pack(side=LEFT)
# tracés
can1.create_rectangle(50,50,100,100) # dessine un rectangle
can1.create_rectangle(120,280,170,335)
polygone1 = [100,65,420,65], [100,85,400,85]
polygone2 = [400,84,400,300], [420,65,420,320]
polygone3 = [170,320,420,320], [170,300,400,300]
Droite1 = [100, 65, 420, 65]
Droite2 = [200, 75, 410, 75]
can1.create_line(tuple(polygone1[0]), fill='red', width=4) # ligne 1
can1.create_line(tuple(polygone1[1]), fill='red', width=4) # ligne 2
can1.create_line(tuple(polygone2[0]), fill='red', width=4) # ligne 3
can1.create_line(tuple(polygone2[1]), fill='red', width=4) # ligne 4
can1.create_line(tuple(polygone3[0]), fill='red', width=4) # ligne 5
can1.create_line(tuple(polygone3[1]), fill='red', width=4) # ligne 5
# composants (suite)
Button(fen1, text='Gauche', command=dep1_gauche).pack()
Button(fen1, text='Droite', command=dep1_droite).pack()
Button(fen1, text='Haut', command=dep1_haut).pack()
Button(fen1, text='Bas', command=dep1_bas).pack()
Button(fen1, text='Quitter', command=fen1.quit).pack(side=BOTTOM)
Button(fen1, text='Démarrer', command=start_it).pack(side=BOTTOM)
#~ Button(fen1, text='Accélère!', command=start_it).pack(side=BOTTOM)
# événements
can1.bind("<z>", dep1_haut)
can1.bind("<s>", dep1_bas)
can1.bind("<d>", dep1_droite)
can1.bind("<q>", dep1_gauche)
# démarrage du réceptionnaire d'évènements (boucle principale):
fen1.mainloop() |
Partager