unfiltered ticks; success indicator

This commit is contained in:
Frank DeMarco 2014-01-25 22:15:00 +09:00
parent 7cdca64d51
commit ac8c9089b8
4 changed files with 71 additions and 22 deletions

View File

@ -2,9 +2,9 @@ from GameChild import GameChild
class Animation(GameChild):
def __init__(self, parent, method=None, interval=None):
def __init__(self, parent, method=None, interval=None, unfiltered=False):
GameChild.__init__(self, parent)
self.time_filter = self.get_game().time_filter
self.unfiltered = unfiltered
self.default_method = method or self.build_frame
self.accounts = {}
self.register(self.default_method, interval=interval)
@ -20,7 +20,7 @@ class Animation(GameChild):
interval = kwargs["interval"]
for method in args:
if method not in self.accounts:
self.accounts[method] = Account(interval, self.time_filter)
self.accounts[method] = Account(interval, self)
else:
self.accounts[method].set_interval(interval)
@ -65,8 +65,9 @@ class Animation(GameChild):
class Account:
def __init__(self, interval, time_filter):
self.time_filter = time_filter
def __init__(self, interval, animation):
self.animation = animation
self.time_filter = animation.get_game().time_filter
self.set_interval(interval)
self.set_delay(0)
self.set_play_once(False)
@ -75,7 +76,7 @@ class Account:
self.halt()
def set_interval(self, interval):
if isinstance(interval, int):
if isinstance(interval, int) or isinstance(interval, str):
interval = [interval]
self.interval = interval
@ -97,7 +98,10 @@ class Account:
def update(self):
if self.playing:
ticks = self.time_filter.get_ticks()
if self.animation.unfiltered:
ticks = self.time_filter.get_unfiltered_ticks()
else:
ticks = self.time_filter.get_ticks()
self.update_delay(ticks)
if not self.delay:
interval = self.interval

View File

@ -52,6 +52,8 @@ class Game(GameChild):
self.delegate.dispatch()
if not self.interpolator.is_gui_active():
self.update()
else:
self.interpolator.gui.update()
self.video_recorder.update()
def run(self):

View File

@ -7,6 +7,7 @@ from pygame.locals import *
from GameChild import GameChild
from Sprite import Sprite
from Animation import Animation
class Interpolator(list, GameChild):
@ -21,7 +22,11 @@ class Interpolator(list, GameChild):
config = self.get_configuration()
if config.has_section("interpolate"):
for name, value in config.get_section("interpolate").iteritems():
self.append(Nodeset(name, value))
self.add_nodeset(name, value)
def add_nodeset(self, name, value, method=None):
self.append(Nodeset(name, value, method))
return len(self) - 1
def is_gui_active(self):
return self.gui_enabled and self.gui.active
@ -37,8 +42,8 @@ class Nodeset(list):
if isinstance(nodes, str):
self.parse_raw(nodes)
else:
self.parse_list(nodes)
self.interpolation_method = method
self.parse_list(nodes)
self.set_splines()
def parse_raw(self, raw):
@ -175,21 +180,24 @@ class LinearSpline(Spline):
return self.m * (t - self.x) + self.y
class GUI(GameChild):
class GUI(Animation):
B_DUPLICATE, B_WRITE, B_DELETE, B_LINEAR, B_CUBIC = range(5)
def __init__(self, parent):
GameChild.__init__(self, parent)
Animation.__init__(self, parent, unfiltered=True)
self.audio = self.get_audio()
self.display = self.get_game().display
self.display_surface = self.get_display_surface()
self.time_filter = self.get_game().time_filter
self.delegate = self.get_delegate()
self.success_indicator_active = True
self.success_indicator_blink_count = 0
self.load_configuration()
self.font = Font(None, self.label_size)
self.prompt = Prompt(self)
self.set_background()
self.set_success_indicator()
self.set_plot_rect()
self.set_marker_frame()
self.set_buttons()
@ -200,6 +208,7 @@ class GUI(GameChild):
self.subscribe(self.respond_to_command)
self.subscribe(self.respond_to_mouse_down, MOUSEBUTTONDOWN)
self.subscribe(self.respond_to_key, KEYDOWN)
self.register(self.show_success_indicator, interval=100)
def load_configuration(self):
config = self.get_configuration("interpolator-gui")
@ -216,6 +225,13 @@ class GUI(GameChild):
surface.fill((0, 0, 0))
self.background = surface
def set_success_indicator(self):
surface = Surface((10, 10))
surface.fill((0, 255, 0))
rect = surface.get_rect()
rect.topleft = self.display_surface.get_rect().topleft
self.success_indicator, self.success_indicator_rect = surface, rect
def set_plot_rect(self):
margin = self.margin
self.plot_rect = self.display_surface.get_rect().inflate(-margin,
@ -240,17 +256,18 @@ class GUI(GameChild):
buttons.append(Button(self, text[ii], x))
x += buttons[-1].location.w + 10
def set_nodeset_index(self, increment=None):
def set_nodeset_index(self, increment=None, index=None):
parent = self.parent
if not increment:
index = 0
else:
index = self.nodeset_index + increment
limit = len(parent) - 1
if index > limit:
if index is None:
if not increment:
index = 0
elif index < 0:
index = limit
else:
index = self.nodeset_index + increment
limit = len(parent) - 1
if index > limit:
index = 0
elif index < 0:
index = limit
self.nodeset_index = index
self.set_nodeset_label()
@ -357,6 +374,7 @@ class GUI(GameChild):
if bi is not None:
if bi == self.B_WRITE:
self.get_configuration().write()
self.play(self.show_success_indicator)
elif bi in (self.B_LINEAR, self.B_CUBIC):
nodeset = self.get_nodeset()
if bi == self.B_LINEAR:
@ -366,7 +384,7 @@ class GUI(GameChild):
self.store_in_configuration()
redraw = True
elif bi == self.B_DUPLICATE:
pass
self.prompt.activate("", self.add_nodeset)
elif bi == self.B_DELETE and len(self.parent) > 1:
self.parent.remove(self.get_nodeset())
self.set_nodeset_index(1)
@ -429,6 +447,14 @@ class GUI(GameChild):
node))
config.set("interpolate", nodeset.name, code)
def add_nodeset(self, name):
nodeset = self.get_nodeset()
self.set_nodeset_index(index=self.parent.add_nodeset(\
name, nodeset, nodeset.interpolation_method))
self.store_in_configuration()
self.draw()
return True
def collide_markers(self, pos):
for marker in self.markers:
if marker.location.collidepoint(pos):
@ -511,6 +537,19 @@ class GUI(GameChild):
prompt.update()
prompt.draw_text()
def show_success_indicator(self):
self.draw()
if self.success_indicator_blink_count > 1:
self.success_indicator_blink_count = 0
self.halt(self.show_success_indicator)
else:
if self.success_indicator_active:
self.display_surface.blit(self.success_indicator,
self.success_indicator_rect)
if self.success_indicator_active:
self.success_indicator_blink_count += 1
self.success_indicator_active = not self.success_indicator_active
class Marker(Sprite):

View File

@ -6,7 +6,7 @@ class TimeFilter(GameChild):
def __init__(self, parent):
GameChild.__init__(self, parent)
self.ticks = self.last_ticks = get_ticks()
self.ticks = self.unfiltered_ticks = self.last_ticks = get_ticks()
self.open()
def close(self):
@ -18,6 +18,9 @@ class TimeFilter(GameChild):
def get_ticks(self):
return self.ticks
def get_unfiltered_ticks(self):
return self.unfiltered_ticks
def get_last_ticks(self):
return self.last_ticks
@ -29,4 +32,5 @@ class TimeFilter(GameChild):
self.last_frame_duration = duration = ticks - self.last_ticks
if not self.closed:
self.ticks += duration
self.unfiltered_ticks += duration
self.last_ticks = ticks