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 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
# -*- coding:utf-8 -*-
from tkinter import *
from random import randrange
def creeJoueur():
""" Créé un joueur et le centre dans l'écran """
posX1, posY1 = larg // 2, haut - 30
can.create_rectangle(posX1, posY1, posX1+20,
posY1+20, fill="yellow", tag="joueur")
def deplaceJoueur(event):
""" Déplacement du joueur """
posXSouri = event.x
posX1, _, posX2, _ = can.bbox("joueur") # Crée une Boite autour de l'objet en tag
# sous la forme d'une liste [x, y, x1, y1]
posXCentrer = (posX1 + posX2) // 2
posXJoueur = posXSouri - posXCentrer
can.move("joueur", posXJoueur, 0)
def creeLazer(event):
""" Crée un projectile """
posX1, posY1, posX2, _ = can.bbox("joueur") # Crée une Boite autour de l'objet en tag
# sous la forme d'une liste [x, y, x1, y1]
posXCentrer = (posX1 + posX2) // 2
can.create_oval(posXCentrer-5, posY1-30, posXCentrer+5,
posY1-40, fill="red", tag="lazer")
def deplaceLazer(nbIdent):
""" Deplace l'objet Lazer selon son numéro d'identification """
_, posY1, _, _ = can.bbox(nbIdent)
if posY1 > 0:
can.move(nbIdent, 0, vitesse_Lazer)
else:
can.delete(nbIdent)
def activeLazer():
""" Returne le numéro d'identification de chaque Lazer """
return can.find_withtag("lazer")
def creeMeteor():
""" Crée un météor selon un emplacement en X aléatoire """
posX = randrange(10, larg - 10)
can.create_oval(posX - 10, -5, posX + 10,
15, fill="dark orange", tag='meteor')
can.after(vitesse_Gen_Meteor, creeMeteor)
def deplaceMeteor(nbIdent):
""" Déplace le météor selon son numéro d'identification """
_, _, _, posY2 = can.bbox(nbIdent)
if posY2 < haut:
can.move(nbIdent, 0, vitesse_Meteor)
else:
can.delete(nbIdent)
def activeMeteor():
""" Returne le numéro d'identification de chaque Lazer """
return can.find_withtag("meteor")
def deplacement():
""" Appel le déplacement pour chaque numéro d'identification """
for nbIdent in activeLazer():
deplaceLazer(nbIdent)
can.update()
for nbIdent in activeMeteor():
deplaceMeteor(nbIdent)
can.update()
def collision():
""" Vérifie s'il y a une collision entre Lazer et Météor """
lazerActif = activeLazer()
meteor = list(activeMeteor())
for s in lazerActif:
x0, s_y0, x1, _ = can.bbox(s)
s_cx = (x0 + x1) // 2
for m in meteor:
m_x0, _, m_x1, m_y1 = can.bbox(m)
if m_x0 <= s_cx <= m_x1 and m_y1 >= s_y0:
can.delete(s)
can.delete(m)
meteor.remove(m)
def animation():
""" Horloge du jeu """
deplacement()
collision()
# Détection des événements
can.bind('<Motion>', deplaceJoueur)
can.bind('<1>', creeLazer)
root.after(vitesse_Anim, animation) # Cadence la vitesse du jeu
def demarrer():
""" Démarrage du jeu """
global start
if start == 0:
creeJoueur()
animation()
root.after(2000, creeMeteor) # Les météors commence à tombe apres le délais
start = 1
if __name__ == "__main__":
# Option d'ajustement du jeu
larg, haut = 800, 600 #Dimension de la fenêtre
vitesse_Anim = 50 #Horloge du jeu
vitesse_Meteor = 5 #Vitesse de descente des météors
vitesse_Lazer = -10 #Vitesse de monter des projectiles
vitesse_Gen_Meteor = 1000 #Nombre de météors générer par millisecondes
start = 0 #Variable global lier au bouton demarrer et à demarrer() sert
#à avoir une utilisation unique du bouton
# Fenêtre principal
root = Tk()
# Canvas principal de l'animation
can = Canvas(root, width=larg, height=haut, bg = "black")
can.pack()
can.create_rectangle(0, haut-10, larg, haut, # Crée un rectangle qui représente
fill = "dark green") # le sol
# Commande du jeu
Button(root, text="Quit", bg="dark grey", command=root.quit
).pack(fill = "x", side = BOTTOM) # fill "x" ajuste le bouton à la taille
# de la fenêtre en X
Button(root, text="Demarrer", bg="dark grey", command=demarrer
).pack(fill = "x", side = BOTTOM)
root.mainloop()
root.destroy() |