Skip to content

Commit

Permalink
Animate path movements
Browse files Browse the repository at this point in the history
  • Loading branch information
marian42 committed Feb 1, 2016
1 parent a01a214 commit b664b27
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 13 deletions.
15 changes: 14 additions & 1 deletion helpers.py
Expand Up @@ -31,4 +31,17 @@ def brighten_color(color, factor): # 0 is brightest, 1 is no change
b = color & 255
g = (color >> 8) & 255
r = (color >> 16) & 255
return Color(int(255 - (255 - r) * factor), int(255 - (255 - g) * factor), int(255 - (255 - b) * factor))
return Color(int(255 - (255 - r) * factor), int(255 - (255 - g) * factor), int(255 - (255 - b) * factor))

def blend_colors(color1, color2, progress):
b1 = color1 & 255
g1 = (color1 >> 8) & 255
r1 = (color1 >> 16) & 255

b2 = color2 & 255
g2 = (color2 >> 8) & 255
r2 = (color2 >> 16) & 255

inverted_progress = 1.0 - progress
return Color(int(inverted_progress * r1 + progress * r2), int(inverted_progress * g1 + progress * g2), int(inverted_progress * b1 + progress * b2))

58 changes: 46 additions & 12 deletions modules/witness.py
Expand Up @@ -43,10 +43,25 @@ def draw(self, screen):
screen.pixel[self.exit_on_screen.x][self.exit_on_screen.y] = self.line_color

class Path:
def __init__(self, puzzle):
def __init__(self, puzzle, screen):
self.puzzle = puzzle
self.screen = screen
self.steps = [puzzle.entry]

self.offset_time = 0.25
self.offset_start = time.clock()
self.offset_end = self.offset_start + self.offset_time

def animate_undo(self):
self.offset_end = time.clock()
self.offset_start = self.offset_end + self.offset_time

while time.clock() < self.offset_start:
time.sleep(0.1)

self.offset_end = time.clock()


def move(self, direction):
if abs(direction.x) + abs(direction.y) != 1:
return
Expand All @@ -57,27 +72,46 @@ def move(self, direction):
return

if len(self.steps) > 1 and self.steps[len(self.steps) - 2] == next:
self.animate_undo()
self.steps.pop()
return

if next in self.steps:
return

self.offset_start = time.clock()
self.offset_end = self.offset_start + self.offset_time

self.steps.append(next)

def draw(self, screen):
for x in range(3):
for y in range(3):
screen.pixel[self.puzzle.offset.x + x + self.steps[0].x * self.puzzle.cell_size - 1][self.puzzle.offset.y + y + self.steps[0].y * self.puzzle.cell_size - 1] = self.puzzle.path_color

def draw(self):
offset = 1.0 - min(1, max(0, (time.clock() - self.offset_start) / (self.offset_end - self.offset_start)))
print offset

for i in range(len(self.steps) - 1):
for p in range(self.puzzle.cell_size):
screen.pixel[self.puzzle.offset.x + self.steps[i].x * self.puzzle.cell_size + (self.steps[i + 1].x - self.steps[i].x) * p][self.puzzle.offset.y + self.steps[i].y * self.puzzle.cell_size + (self.steps[i + 1].y - self.steps[i].y) * p] = self.puzzle.path_color
#local_offset = max(0, min(1, i - (len(self.steps) - 1) + offset))
local_offset = offset
if i != len(self.steps) - 2:
local_offset = 0
pixel_offset = max(0, min(1, (1 - local_offset ) * (self.puzzle.cell_size) - p + 1))
color = blend_colors(self.puzzle.line_color, self.puzzle.path_color, pixel_offset)
self.screen.pixel[self.puzzle.offset.x + self.steps[i].x * self.puzzle.cell_size + (self.steps[i + 1].x - self.steps[i].x) * p][self.puzzle.offset.y + self.steps[i].y * self.puzzle.cell_size + (self.steps[i + 1].y - self.steps[i].y) * p] = color

color = blend_colors(self.puzzle.line_color, self.puzzle.path_color, 1.0 - min(1, max(0, offset * self.puzzle.cell_size)))
self.screen.pixel[self.puzzle.offset.x + self.steps[len(self.steps) - 1].x * self.puzzle.cell_size][self.puzzle.offset.y + self.steps[len(self.steps) - 1].y * self.puzzle.cell_size] = color

if self.steps[len(self.steps) -1] == self.puzzle.exit and offset == 0:
self.screen.pixel[self.puzzle.exit_on_screen.x][self.puzzle.exit_on_screen.y] = self.puzzle.path_color

screen.pixel[self.puzzle.offset.x + self.steps[len(self.steps) - 1].x * self.puzzle.cell_size][self.puzzle.offset.y + self.steps[len(self.steps) - 1].y * self.puzzle.cell_size] = self.puzzle.path_color
if len(self.steps) > 0:
for x in range(3):
for y in range(3):
color = self.puzzle.path_color
if len(self.steps) == 1:
color = blend_colors(self.puzzle.path_color, self.puzzle.line_color, min(1, max(0, offset)))

if self.steps[len(self.steps) -1] == self.puzzle.exit:
screen.pixel[self.puzzle.exit_on_screen.x][self.puzzle.exit_on_screen.y] = self.puzzle.path_color
self.screen.pixel[self.puzzle.offset.x + x + self.steps[0].x * self.puzzle.cell_size - 1][self.puzzle.offset.y + y + self.steps[0].y * self.puzzle.cell_size - 1] = color



Expand All @@ -87,13 +121,13 @@ def __init__(self, screen, gamepad):
self.gamepad = gamepad

self.puzzle = Puzzle()
self.path = Path(self.puzzle)
self.path = Path(self.puzzle, screen)

self.gamepad.on_press.append(self.on_key_down)

def draw(self):
self.puzzle.draw(self.screen)
self.path.draw(self.screen)
self.path.draw()
self.screen.update()

def tick(self):
Expand Down

0 comments on commit b664b27

Please sign in to comment.