mirror of
https://github.com/Aroy-Art/Learning-Python.git
synced 2024-12-25 05:24:54 +01:00
Added a explosion in Particles
This commit is contained in:
parent
f95d97a29e
commit
51b721f1d0
1 changed files with 102 additions and 0 deletions
102
Particles/explosion.py
Normal file
102
Particles/explosion.py
Normal file
|
@ -0,0 +1,102 @@
|
|||
import random
|
||||
import math
|
||||
|
||||
# the size of the screen
|
||||
WIDTH = 800
|
||||
HEIGHT = 600
|
||||
|
||||
# how much a particle slows down by each second
|
||||
DRAG = 0.8
|
||||
|
||||
# the colour of each particle in R, G, B values
|
||||
PARTICLE_COLOR = 255, 230, 128
|
||||
|
||||
# the time in seconds for which a particle is displayed
|
||||
MAX_AGE = 3
|
||||
|
||||
# an array to hold the details of the explosion particles on the screen
|
||||
particles = []
|
||||
|
||||
|
||||
# This function creates a new explosion at the specified screen co-ordinates
|
||||
|
||||
def explode(x, y, speed=300):
|
||||
|
||||
# these are new particles, so set their age to zero
|
||||
age = 0
|
||||
|
||||
# generate 100 particles per explosion
|
||||
for _ in range(100):
|
||||
|
||||
# for each particle, generate a random angle and distance
|
||||
angle = random.uniform (0, 2 * math.pi)
|
||||
radius = random.uniform(0, 1) ** 0.5
|
||||
|
||||
# convert angle and distance from the explosion point into x and y velocity for the particle
|
||||
vx = speed * radius * math.sin(angle)
|
||||
vy = speed * radius * math.cos(angle)
|
||||
|
||||
# add the particle's position, velocity and age to the array
|
||||
particles.append((x, y, vx, vy, age))
|
||||
|
||||
|
||||
# This function redraws the screen by plotting each particle in the array
|
||||
|
||||
def draw():
|
||||
|
||||
# clear the screen
|
||||
screen.clear()
|
||||
|
||||
# loop through all the particles in the array
|
||||
for x, y, *_ in particles:
|
||||
|
||||
# for each particle in the array, plot its position on the screen
|
||||
screen.surface.set_at((int(x), int(y)), PARTICLE_COLOR)
|
||||
|
||||
|
||||
# This function updates the array of particles
|
||||
|
||||
def update(dt):
|
||||
|
||||
# to update the particle array, create a new empty array
|
||||
new_particles = []
|
||||
|
||||
# loop through the existing particle array
|
||||
for (x, y, vx, vy, age) in particles:
|
||||
|
||||
# if a particle was created more than a certain time ago, it can be removed
|
||||
if age + dt > MAX_AGE:
|
||||
continue
|
||||
|
||||
# update the particle's velocity - they slow down over time
|
||||
drag = DRAG ** dt
|
||||
vx *= drag
|
||||
vy *= drag
|
||||
|
||||
# update the particle's position according to its velocity
|
||||
x += vx * dt
|
||||
y += vy * dt
|
||||
|
||||
# update the particle's age
|
||||
age += dt
|
||||
|
||||
# add the particle's new position, velocity and age to the new array
|
||||
new_particles.append((x, y, vx, vy, age))
|
||||
|
||||
# replace the current array with the new one
|
||||
particles[:] = new_particles
|
||||
|
||||
|
||||
# This function creates an explosion at a random location on the screen
|
||||
|
||||
def explode_random():
|
||||
|
||||
# select a random position on the screen
|
||||
x = random.randrange(WIDTH)
|
||||
y = random.randrange(HEIGHT)
|
||||
|
||||
# call the explosion function for that position
|
||||
explode(x, y)
|
||||
|
||||
# call the random explosion function every 1.5 seconds
|
||||
clock.schedule_interval(explode_random, 1.5)
|
Loading…
Reference in a new issue