explosion

The game screen appears here if your browser supports the Canvas API.

Attribution

This code example is taken from Wireframe #1 Source Code: The genius behind Defender's explosions, pages 32-33. The code example was created by Daniel Pope, and the comments were created by Simon Long.

Licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported.

Original Python code


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)