Fr3deric
7 years ago
1 changed files with 132 additions and 0 deletions
@ -0,0 +1,132 @@
@@ -0,0 +1,132 @@
|
||||
#!/usr/bin/env python3 |
||||
|
||||
import sys |
||||
import argparse |
||||
import time |
||||
import math |
||||
import colorsys |
||||
import blup.frame |
||||
import blup.output |
||||
import blup.animation |
||||
import blup.writebml |
||||
import numpy as np |
||||
import random |
||||
|
||||
WIDTH = 22 |
||||
HEIGHT = 16 |
||||
DEPTH = 256 |
||||
|
||||
G = np.array([0, 9.81]) |
||||
|
||||
class Fireball: |
||||
def __init__(self, startpos, startspeed, startcolor, lifetime, t0): |
||||
self.startpos, self.startspeed, self.startcolor, self.lifetime = \ |
||||
startpos, startspeed, startcolor, lifetime |
||||
self.t0 = t0 |
||||
self.pos = startpos |
||||
self.color = startcolor |
||||
self.dead = False |
||||
|
||||
def update_pos(self, t): |
||||
t = t - self.t0 |
||||
if t > self.lifetime: |
||||
self.dead = True |
||||
return |
||||
self.pos = 0.5 * G * t**2 + self.startspeed * t + self.startpos |
||||
self.color = self.startcolor * (1 - t/self.lifetime) |
||||
if random.randint(1, 10) > 8: |
||||
self.color = np.array([0, 0, 0]) |
||||
|
||||
def draw(self, frame): |
||||
if not self.dead: |
||||
frame.setPixel(int(round(self.pos[0])), int(round(self.pos[1])), |
||||
tuple(map(lambda x: int(round(x)), self.color))) |
||||
|
||||
class Rocket: |
||||
def __init__(self, startpos, startspeed, explode_height, t0, color): |
||||
self.startpos, self.startspeed, self.explode_height, self.t0 = \ |
||||
startpos, startspeed, explode_height, t0 |
||||
self.color = color |
||||
self.pos = None |
||||
self.exploded = False |
||||
|
||||
def update(self, t): |
||||
t = t - self.t0 |
||||
if t < 0 or self.exploded: |
||||
return |
||||
self.pos = 0.5 * G * t**2 + self.startspeed * t + self.startpos |
||||
if self.pos[1] <= self.explode_height: |
||||
self.exploded = True |
||||
self.color = np.array([0, 0, 0]) |
||||
|
||||
def draw(self, frame): |
||||
if self.pos is None or self.exploded: |
||||
return |
||||
frame.setPixel(int(round(self.pos[0])), int(round(self.pos[1])), |
||||
tuple(map(lambda x: int(round(x)), self.color))) |
||||
|
||||
|
||||
|
||||
|
||||
def getRandomColor(maxval): |
||||
return list(map(lambda x: int(round(x*maxval)), colorsys.hsv_to_rgb(random.random(), 1, 1))) |
||||
|
||||
if __name__ == '__main__': |
||||
parser = argparse.ArgumentParser(description='Generate plasma animations') |
||||
parser.add_argument('-d', '--delay', type=int, default=50) |
||||
parser.add_argument('-n', '--num-rockets', type=int, default=3) |
||||
parser.add_argument('output_file') |
||||
args = parser.parse_args() |
||||
|
||||
dim = blup.frame.FrameDimension(WIDTH, HEIGHT, DEPTH, 3) |
||||
anim = blup.animation.Animation(dim) |
||||
anim.tags['description'] = ' '.join(sys.argv) |
||||
|
||||
rockets = [] |
||||
for i in range(args.num_rockets): |
||||
rockets.append( |
||||
Rocket( |
||||
np.array([random.randint(0, dim.width-1), dim.height-1]), |
||||
np.array([random.randint(-8, 8), -20 + random.randint(-2, 2)]), |
||||
4 + random.randint(-2, 2), |
||||
random.randint(0, 40) / 10, |
||||
np.array([dim.depth-1] * 3) |
||||
) |
||||
) |
||||
|
||||
fbs = [] |
||||
t = 0 |
||||
while True: |
||||
frame = blup.animation.AnimationFrame(dim, args.delay) |
||||
|
||||
for fb in fbs: |
||||
fb.update_pos(t) |
||||
try: |
||||
fb.draw(frame) |
||||
except ValueError: |
||||
continue |
||||
fbs = list(filter(lambda f: not f.dead, fbs)) |
||||
|
||||
for r in rockets: |
||||
r.update(t) |
||||
try: |
||||
r.draw(frame) |
||||
except ValueError: |
||||
continue |
||||
if r.exploded: |
||||
color = np.array(getRandomColor(dim.depth-1)) |
||||
for i in range(random.randint(15, 25)): |
||||
v = np.array([ |
||||
random.choice([-1, 1]) * random.randint(0, 25), |
||||
random.choice([-1, 1]) * random.randint(0, 25), |
||||
]) |
||||
fbs.append(Fireball(r.pos, v, color, 1.5 + random.randint(-1, 1), t)) |
||||
rockets = list(filter(lambda r: not r.exploded, rockets)) |
||||
|
||||
anim.addFrame(frame) |
||||
|
||||
if len(rockets) == 0 and len(fbs) == 0: |
||||
break |
||||
t += args.delay / 1000 |
||||
|
||||
blup.writebml.writeBml(anim, args.output_file) |
Loading…
Reference in new issue