summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAaron Perley <aaron.perley@gmail.com>2016-10-16 23:48:20 -0400
committerAaron Perley <aaron.perley@gmail.com>2016-10-16 23:48:20 -0400
commitc1153ae74b6f023b7277cd1337537f0710b6d124 (patch)
tree6878f7dfc2a2f22bc65babb29bb682dd65760390
parentBasic twinkle (diff)
parentShark (diff)
downloadbridge-c1153ae74b6f023b7277cd1337537f0710b6d124.tar.zst
Merge branch 'master' into twinkle
Conflicts: ShowRunner.py
-rw-r--r--ShowRunner.py2
-rw-r--r--fish_show.py44
-rw-r--r--fish_types.py56
-rwxr-xr-xwebapp/run.py2
4 files changed, 66 insertions, 38 deletions
diff --git a/ShowRunner.py b/ShowRunner.py
index 618e80c..5fa46e7 100644
--- a/ShowRunner.py
+++ b/ShowRunner.py
@@ -16,4 +16,4 @@ def run_show():
TwinkleShow(bridge, send_queue=recv_queue, recv_queue=send_queue).run(framerate=FRAME_RATE)
print "done!"
-run_show() \ No newline at end of file
+run_show()
diff --git a/fish_show.py b/fish_show.py
index cb80d55..6abf3bc 100644
--- a/fish_show.py
+++ b/fish_show.py
@@ -11,16 +11,18 @@ from fish_types import Fish
class Light(object):
"""Represent a bridge light and its state."""
+ __slots__=('light', 'color', 'transitioning_to', 'x', 'y', 'step', 'result_color')
def __init__(self, x, y, light):
"""Store all facts about a light."""
self.light = light
self.color = color.black
+ self.result_color = self.color
self.transitioning_to = self.color
self.step = 0
self.x = x
self.y = y
- def update(self, depth, fishes):
+ def update_base(self, depth):
"""Change color depending on where the fish is."""
if abs(self.transitioning_to - self.color) <= self.step:
self.transitioning_to = pick_HSV(depth).to_RGB()
@@ -31,15 +33,20 @@ class Light(object):
)
self.color = new_background
- new_color = new_background
- for fish in fishes:
- coverage = compute_coverage(fish, self.x, self.y)
- fish_color = fish.color_at(self.x, self.y)
- new_color = coverage * fish_color + (1 - coverage) * new_color
+ self.result_color = new_background
+
+ def update_fish(self, fish):
+ coverage = compute_coverage(fish, self.x, self.y)
+ fish_color = fish.color_at(self.x, self.y)
+ self.result_color = coverage * fish_color + (1 - coverage) * self.result_color
+
+ def blit(self):
self.light.setRGBRaw(
- *map(lambda x: clamp(0, x, 1), new_color.components)
+ *map(lambda x: clamp(0, x, 1), self.result_color.components)
)
+
+
def compute_coverage(fish, x, y):
"""Calculate the coverage of a fish over a box."""
middle_of_fish = fish.x + fish.width / 2
@@ -91,8 +98,8 @@ class FishShow(Show):
MAX_DEPTH = 6
def init(self):
- self.lights = [Light(x, y, self.bridge.get_light(x, y))
- for y in xrange(self.bridge.HEIGHT)
+ self.lights = [[Light(x, y, self.bridge.get_light(x, y))
+ for y in xrange(self.bridge.HEIGHT)]
for x in xrange(self.bridge.WIDTH)]
self.fishes = set()
self.tick_count = 0
@@ -102,13 +109,26 @@ class FishShow(Show):
event = self.recv_event()
if event and event[0] == 'spawn':
new_fish = Fish.by_type(event[1]['type'])
- self.fishes.add(new_fish)
+ if new_fish:
+ self.fishes.add(new_fish)
+
+ for col in self.lights:
+ for light in col:
+ light.update_base(self.depth)
for fish in list(self.fishes):
if not fish.update():
self.fishes.remove(fish)
- for light in self.lights:
- light.update(self.depth, self.fishes)
+
+ for x in xrange(int(fish.x), int(fish.x+fish.width+1)):
+ if x < len(self.lights):
+ for light in self.lights[x]:
+ light.update_fish(fish)
+
+ for col in self.lights:
+ for light in col:
+ light.blit()
+
self.tick_count += 1
if self.tick_count % self.TICKS_PER_DEPTH == 0:
diff --git a/fish_types.py b/fish_types.py
index 61cd36a..6d24675 100644
--- a/fish_types.py
+++ b/fish_types.py
@@ -11,6 +11,9 @@ class Fish(object):
Must override color (or color_at), drag, width, height, tailThreshold,
tailDuration, tailAccelMag
"""
+
+ is_diamond = True
+
def __init__(self, x=None, y=None):
"""Create fish with default parameters."""
if x is not None:
@@ -23,6 +26,7 @@ class Fish(object):
self.y = 0.5
self.speed = C.Vector(0, 0)
self.tailAcceleration = C.Vector(self.tailAccelMag, 0)
+ self.tailThresholdCurrent = self.tailThreshold
self.tailMoving = False
self.tailMoveCount = 0
if not hasattr(self, 'theta_scale'):
@@ -55,9 +59,11 @@ class Fish(object):
return False
self.speed += self.drag * self.speed
- if abs(self.speed) < self.tailThreshold:
+ if abs(self.speed) < self.tailThresholdCurrent:
self.tailMoving = True
- self.tailThreshold = rand_in_range(0.5, 1.4)
+ self.tailThresholdCurrent = max(rand_in_range(
+ self.tailThreshold - 0.1, self.tailThreshold + 0.1
+ ), 0.0001)
self.fix_direction()
if self.tailMoveCount > self.tailDuration:
self.tailMoveCount = 0
@@ -97,22 +103,22 @@ class Fish(object):
class Jellyfish(Fish):
color = C.HSV(298/360, 89/100, 53/100).to_RGB()
- drag = -0.01
+ drag = -0.1
width = 15
height = 1.5
- tailThreshold = 0.001
- tailDuration = 4
- tailAccelMag = 0.001
+ tailThreshold = 0.2
+ tailDuration = 6
+ tailAccelMag = 0.25
class Dolphin(Fish):
- color = C.HSV(18/360, 0/100, 40/100).to_RGB()
+ color = C.HSV(18/360, 0/100, 10/100).to_RGB()
drag = -0.09
width = 35
height = 1.5
tailThreshold = 0.7
tailDuration = 2
- tailAccelMag = 0.8
+ tailAccelMag = 0.4
gravity = C.Vector(0, -0.01)
direction_fixed = False
@@ -156,7 +162,7 @@ class Boat(Fish):
class Dory(Fish):
# Need to try this on the bridge
- color = C.HSV(235/360, 100/100, 88/100).to_RGB()
+ color = C.HSV(235/360, 100/100, 100/100).to_RGB()
drag = -0.1
width = 23
height = 1.5
@@ -166,7 +172,7 @@ class Dory(Fish):
class Nemo(Fish):
- color = C.HSV(31/360, 100/100, 50/100).to_RGB()
+ color = C.HSV(40/360, 100/100, 10/100).to_RGB()
drag = -0.09
width = 23
height = 1.5
@@ -177,7 +183,7 @@ class Nemo(Fish):
class Whale(Fish):
drag = -0.2
- width = 50
+ width = 80
height = 2
tailThreshold = 0.7
tailDuration = 3
@@ -186,10 +192,10 @@ class Whale(Fish):
y = 0
- white_x_min = 30
- white_x_width = 8
- white_y_min = 1
- white_y_height = 1
+ white_x_min = 58
+ white_x_width = 6
+ white_y_min = 1.45
+ white_y_height = 0.5
def color_at(self, x, y):
"""Mostly copied from compute_coverage.
@@ -209,7 +215,7 @@ class Whale(Fish):
class Stingray(Fish):
- color = C.HSV(0/360, 0/100, 50/100).to_RGB()
+ color = C.HSV(0/360, 0/100, 10/100).to_RGB()
drag = -0.09
width = 15
height = 2
@@ -219,27 +225,29 @@ class Stingray(Fish):
class Eel(Fish):
- color = C.HSV(109/360, 83/100, 35/100).to_RGB()
+ color = C.HSV(109/360, 83/100, 0/100).to_RGB()
drag = -0.09
- width = 50
+ width = 30
height = 2
tailThreshold = 0.7
tailDuration = 2
- tailAccelMag = 0.1
+ tailAccelMag = 0.2
front_offset = 0
y = 0
+ is_diamond = False
def alpha_at(self, x, y):
rel_x = x - self.x
- rel_y = y - self.y
eel_height = math.sin(
2 * math.pi * (rel_x + self.front_offset) / self.width
) / 2 + 0.5
- y_blend = abs(rel_y - eel_height)
- if y_blend > 0.5:
+ y_blend = abs(y - eel_height)
+ if y_blend > 0.75:
return 0
- return (1 - y_blend)
+ if y_blend < 0.25:
+ return 1
+ return 1 - y_blend
def update(self):
self.front_offset += abs(self.speed)
@@ -252,7 +260,7 @@ class Eel(Fish):
class Shark(Fish):
- color = C.HSV(0/360, 0/100, 50/100).to_RGB()
+ color = C.HSV(0/360, 0/100, 10/100).to_RGB()
drag = -0.2
width = 50
height = 2
diff --git a/webapp/run.py b/webapp/run.py
index 2290f41..fb270a9 100755
--- a/webapp/run.py
+++ b/webapp/run.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
import sys
-sys.path.append('packages')
+sys.path.append('webapp/packages')
import threading