Skip to content

Instantly share code, notes, and snippets.

@davepape
Created October 24, 2013 15:28
Show Gist options
  • Save davepape/7139290 to your computer and use it in GitHub Desktop.
Save davepape/7139290 to your computer and use it in GitHub Desktop.
Uses the 1d fractal mountain code to generate a constantly changing electrical 'zap'. Also plays a looping sound effect.
import sys, random
from pyglet.gl import *
window = pyglet.window.Window()
tex = pyglet.image.load('glow.png').get_texture()
sound = pyglet.media.load('zap.wav')
player = pyglet.media.Player()
player.queue(sound)
player.eos_action = player.EOS_LOOP
player.play()
seed = 1
pause = False
def generatePoints(level,seed):
random.seed(seed)
numPoints = 2**level + 1
p = [0] * numPoints
displacement = 0.1
for l in range(level-1, -1, -1):
step = 2**l
for i in range(step, numPoints, step*2):
p[i] = (p[i-step] + p[i+step])/2.0 + random.gauss(0.0, displacement)
displacement /= 1.7
return p
def createShape(level,seed):
points = generatePoints(level,seed)
verts = []
texcoords = []
x = 0
for p in points:
y = p * 640.0 + 240.0
texcoords += [0, 0]
verts += [x, y-10.0]
texcoords += [0, 1]
verts += [x, y+10.0]
x = x + 640.0/(len(points)-1.0)
return pyglet.graphics.vertex_list(len(verts)/2, ('v2f', verts), ('t2f', texcoords))
def updateShape(level,seed):
global vlist
points = generatePoints(level,seed)
verts = []
texcoords = []
x = 0
for p in points:
y = p * 640.0 + 240.0
texcoords += [0, 0]
verts += [x, y-10.0]
texcoords += [0, 1]
verts += [x, y+10.0]
x = x + 640.0/(len(points)-1.0)
vlist.vertices = verts
vlist.texcoords = texcoords
level = 7
vlist = createShape(level,seed)
@window.event
def on_draw():
global vlist
glClear(GL_COLOR_BUFFER_BIT)
glColor3f(1,1,0)
glEnable(GL_TEXTURE_2D)
glBindTexture(GL_TEXTURE_2D, tex.id)
vlist.draw(GL_QUAD_STRIP)
glDisable(GL_TEXTURE_2D)
@window.event
def on_key_press(key, modifiers):
global level, pause, vlist
if key == pyglet.window.key.PLUS or key == pyglet.window.key.EQUAL:
level += 1
vlist = createShape(level, seed)
elif key == pyglet.window.key.MINUS and level > 0:
level -= 1
vlist = createShape(level, seed)
elif key == pyglet.window.key.SPACE:
pause = not pause
if pause:
player.pause()
else:
player.play()
def update(dt):
global seed, level, pause
if not pause:
seed = seed + 1
updateShape(level,seed)
pyglet.clock.schedule_interval(update,1/60.0)
pyglet.app.run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment