Bonjour, ceci est a rendre pour aujourdh'ui, c'est un simulateur de feux d'artifice,
lorsque je lance le programme, rien ne s'affiche.
import tkinter as tk
from random import randint, uniform, choice
from math import radians, cos, sin, exp
from time import sleep
GRAVITY = 2
couleurs = ['red', 'blue', 'yellow', 'white', 'green', 'orange', 'purple', 'gold', 'indigo']
class Fusee:
def __init__(self, cv, idx, total, vitesse_dexplosion, couleur, taille, longevitee, x=0, y=0, vx=0, vy=0):
self.id = idx
self.x = x
self.y = y
self.vitesse_initial = vitesse_dexplosion
self.vx = vx
self.vy = vy
self.total = randint(8,14) #nbr particules
self.age = 0
self.couleur = couleur
self.taille = taille
self.cv = cv
self.longevitee = longevitee
self.cid = None
def create(self):
self.cid = self.cv.create_oval(
self.x, self.y,
self.x + self.taille, self.y + self.taille,
outline=self.couleur, fill=self.couleur)
def vivant(self):
return self.age <= self.longevitee
def explosion(self):
total_particles = self.total
explosion_speed = self.vitesse_initial
particles = []
particule_couleur= choice(couleurs)
for i in range(total_particles):
angle = radians(i * (360 / total_particles))
distance = 360 / total_particles # Ajustement pour la distance entre les particules
position_x = cos(angle) * distance
position_y = sin(angle) * distance
# Création d'une particule (fusee) avec les mêmes propriétés
particle = Fusee(cv=self.cv, idx=0, total=total_particles, longevitee=30,
x=self.x, y=self.y,
vitesse_dexplosion=explosion_speed, taille=self.taille,
couleur=particule_couleur)
particle.create()
particles.append((particle, position_x, position_y))
# Trajectoire ascendante
while any(particle.y > 0 for particle, _, _ in particles):
for particle, move_x, move_y in particles:
particle.x += particle.vx
particle.y -= particle.vy
particle.cv.move(particle.cid, move_x / 20, -move_y / 20)
particle.vy += GRAVITY / 5
particle.cv.update()
sleep(0.001)
# Trajectoire descendante
while any(particle.y < haut_fen for particle, _, _ in particles):
for particle, _, _ in particles:
particle.x += particle.vx
particle.y += particle.vy
particle.vy += GRAVITY / 5 # Ajouter la gravité à la vitesse verticale
particle.cv.move(particle.cid, 0, particle.vy)
particle.cv.update()
sleep(0.1)
# Supprimer les particules après l'explosion
for particle, _, _ in particles:
particle.cv.delete(particle.cid)
def etendre(self):
return self.age <= 2
def maj(self, dt):
self.age += dt
if self.etendre():
self.explosion()
def apparition(self, t=0):
self.x += 7
self.y -= exp(0.06*t)
if self.y > 0:
self.cv.move(self.cid, 7, -exp(0.06*t))
self.cv.update()
self.cv.after(100, self.apparition, t + 1)
if self.y <= hauteur_max:
self.cv.delete(self.cid)
self.maj(2)
return self.x, self.y
def lancer(self):
"""lance un feux d'artifice"""
self.create()
self.apparition()
def simulation(t=0, count=5):
"""plusieur feux artifices a la suite"""
if count > 0:
fusee0 = Fusee(cv, idx=0, total=10, vitesse_dexplosion=10, couleur="white", taille=10, longevitee=10, x=randint(10, large_fen - 650), y=0.9 * haut_fen)
fusee0.lancer()
root.after(100, lambda f=fusee0: f.explosion([])) #explose fusee simultanement
root.after(100, lambda c=count-1: simulation(t, c))#lance fusee simultanement
def pl_sim():
"""effectue plusieurs simulation"""
for l in range(randint(1,5)):
simulation()
root = tk.Tk()
large_fen = root.winfo_screenwidth()
haut_fen = root.winfo_screenheight()
hauteur_max = haut_fen - 0.8 * haut_fen
cv = tk.Canvas(root, bg='black', height=haut_fen, width=large_fen)
cv.pack()
PI_x = randint(10, (large_fen - 650)) #467, distance x parcourue + marge explosion
fusee0 = Fusee(cv, idx=0, total=10, vitesse_dexplosion=10, couleur="white", taille=10, longevitee=10, x=PI_x, y=0.9 * haut_fen)
simulation()
root.mainloop()