mirror of
https://github.com/polyfloyd/ledcat-nyancat.git
synced 2025-07-04 16:20:09 +02:00
Allow frame delays to be overridden
This commit is contained in:
parent
02274c9a7c
commit
587598e8c5
2 changed files with 48 additions and 39 deletions
|
@ -36,53 +36,59 @@ class Nyancat(object):
|
||||||
def __init__(self, width, height):
|
def __init__(self, width, height):
|
||||||
self.width = width
|
self.width = width
|
||||||
self.height = height
|
self.height = height
|
||||||
|
self.frame_index = 0
|
||||||
self.sparkles = []
|
self.sparkles = []
|
||||||
|
|
||||||
def render(self):
|
def render(self):
|
||||||
for anim_frame in anim_cat:
|
self.frame_index = (self.frame_index + 1) % len(anim_cat)
|
||||||
if len(self.sparkles) < 32:
|
anim_frame = anim_cat[self.frame_index]
|
||||||
self.sparkles.append(Sparkle(self.width, self.height))
|
|
||||||
|
|
||||||
frame = bytearray(self.width * self.height * 3)
|
if len(self.sparkles) < 32:
|
||||||
# Render the background
|
self.sparkles.append(Sparkle(self.width, self.height))
|
||||||
for i in range(self.width * self.height):
|
|
||||||
frame[i*3:i*3+3] = background_color
|
|
||||||
|
|
||||||
# Render the tail
|
frame = bytearray(self.width * self.height * 3)
|
||||||
for (x, tail_y) in enumerate(self.plot_tail(self.width - 10)):
|
# Render the background
|
||||||
for (y, color) in enumerate(tail_colors, tail_y - len(tail_colors) // 2):
|
for i in range(self.width * self.height):
|
||||||
if 0 <= y < self.height:
|
frame[i*3:i*3+3] = background_color
|
||||||
i = y * self.width + x
|
|
||||||
frame[i*3:i*3+3] = color
|
|
||||||
|
|
||||||
# Copy animated frame
|
# Render the tail
|
||||||
for anim_x in range(anim_frame.size[0]):
|
for (x, tail_y) in enumerate(self.plot_tail(self.width - 10)):
|
||||||
for anim_y in range(anim_frame.size[1]):
|
for (y, color) in enumerate(tail_colors, tail_y - len(tail_colors) // 2):
|
||||||
pix = anim_frame.getpixel((anim_x, anim_y))
|
if 0 <= y < self.height:
|
||||||
if pix[3] != 0: # Test for alpha
|
i = y * self.width + x
|
||||||
x = (self.width - anim_frame.size[0]) + anim_x
|
frame[i*3:i*3+3] = color
|
||||||
y = (self.height // 2 - anim_frame.size[1] // 2) + anim_y
|
|
||||||
i = ((y * self.width) + x) * 3
|
|
||||||
frame[i:i+3] = pix[:3]
|
|
||||||
|
|
||||||
# Render and update the sparkles
|
# Copy animated frame
|
||||||
for sp in self.sparkles:
|
for anim_x in range(anim_frame.size[0]):
|
||||||
for x in range(anim_sparkle[0].size[0]):
|
for anim_y in range(anim_frame.size[1]):
|
||||||
for y in range(anim_sparkle[0].size[1]):
|
pix = anim_frame.getpixel((anim_x, anim_y))
|
||||||
pix_x = sp.x + x - anim_sparkle[0].size[0] // 2
|
if pix[3] != 0: # Test for alpha
|
||||||
pix_y = sp.y + y - anim_sparkle[0].size[1] // 2
|
x = (self.width - anim_frame.size[0]) + anim_x
|
||||||
if 0 <= pix_x < self.width and 0 <= pix_y < self.height:
|
y = (self.height // 2 - anim_frame.size[1] // 2) + anim_y
|
||||||
i = pix_y * self.width + pix_x
|
i = ((y * self.width) + x) * 3
|
||||||
pix = anim_sparkle[sp.frame_index].getpixel((x, y))
|
frame[i:i+3] = pix[:3]
|
||||||
if pix[3] != 0:
|
|
||||||
frame[i*3:i*3+3] = pix[:3]
|
|
||||||
sp.x -= 3
|
|
||||||
sp.frame_index += 1
|
|
||||||
# Remove expired sparkles
|
|
||||||
self.sparkles = list(filter(lambda sp: sp.frame_index < len(anim_sparkle), self.sparkles))
|
|
||||||
|
|
||||||
sys.stdout.buffer.write(frame)
|
# Render and update the sparkles
|
||||||
time.sleep(1 / 30)
|
for sp in self.sparkles:
|
||||||
|
for x in range(anim_sparkle[0].size[0]):
|
||||||
|
for y in range(anim_sparkle[0].size[1]):
|
||||||
|
pix_x = sp.x + x - anim_sparkle[0].size[0] // 2
|
||||||
|
pix_y = sp.y + y - anim_sparkle[0].size[1] // 2
|
||||||
|
if 0 <= pix_x < self.width and 0 <= pix_y < self.height:
|
||||||
|
i = pix_y * self.width + pix_x
|
||||||
|
pix = anim_sparkle[sp.frame_index].getpixel((x, y))
|
||||||
|
if pix[3] != 0:
|
||||||
|
frame[i*3:i*3+3] = pix[:3]
|
||||||
|
sp.x -= 3
|
||||||
|
sp.frame_index += 1
|
||||||
|
# Remove expired sparkles
|
||||||
|
self.sparkles = list(filter(lambda sp: sp.frame_index < len(anim_sparkle), self.sparkles))
|
||||||
|
|
||||||
|
sys.stdout.buffer.write(frame)
|
||||||
|
self.sleep()
|
||||||
|
|
||||||
|
def sleep(self):
|
||||||
|
time.sleep(1 / 30)
|
||||||
|
|
||||||
def plot_tail(self, width):
|
def plot_tail(self, width):
|
||||||
pass # Virtual
|
pass # Virtual
|
||||||
|
|
|
@ -31,3 +31,6 @@ class NyancatSignal(Nyancat):
|
||||||
for x in range(width):
|
for x in range(width):
|
||||||
amplitude = sum(map(lambda hist: hist[x * WAVE_FACTOR], self.samples_history)) / len(self.samples_history) * 3
|
amplitude = sum(map(lambda hist: hist[x * WAVE_FACTOR], self.samples_history)) / len(self.samples_history) * 3
|
||||||
yield int((amplitude * .5 - .5) * self.height) + self.height
|
yield int((amplitude * .5 - .5) * self.height) + self.height
|
||||||
|
|
||||||
|
def sleep(self):
|
||||||
|
pass # Handled by a blocking read from the audio source
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue