# HG changeset patch # User Emmanuel Gil Peyrot # Date 1350758920 -7200 # Node ID e1f5dcd4b83e889d11da1a7477b4f7c6054939ec # Parent dc6ed7b1c6deb3f5723d0c097e919b1dc8f5690d Display something at the start of a stage. diff --git a/pytouhou/game/text.py b/pytouhou/game/text.py --- a/pytouhou/game/text.py +++ b/pytouhou/game/text.py @@ -16,6 +16,7 @@ from copy import copy from pytouhou.game.sprite import Sprite from pytouhou.vm.anmrunner import ANMRunner +from pytouhou.utils.interpolator import Interpolator class Glyph(object): @@ -32,6 +33,7 @@ class Widget(object): self.removed = False self.changed = True self.anmrunner = None + self.frame = 0 # Set up the backround sprite self.back_wrapper = back_wrapper @@ -43,6 +45,7 @@ class Widget(object): self.x, self.y = pos def update(self): + self.frame += 1 if self.changed: if self.anmrunner and not self.anmrunner.run_frame(): self.anmrunner = None @@ -118,19 +121,50 @@ class Text(GlyphCollection): glyph.sprite.color = colors[color] - def timeout_update(self): + def move_timeout_update(self): GlyphCollection.update(self) - if self.timeout % 2: + if self.frame % 2: for glyph in self.glyphes: glyph.y -= 1 - self.timeout -= 1 - if self.timeout == 0: + if self.frame == self.timeout: self.removed = True - def set_timeout(self, timeout): - self.timeout = timeout - self.update = self.timeout_update + def fadeout_timeout_update(self): + GlyphCollection.update(self) + if self.frame >= self.start: + if self.frame == self.start: + self.fade(self.effect, 255, lambda x: x) + elif self.frame == self.timeout - self.effect: + self.fade(self.effect, 0, lambda x: x) + if self.fade_interpolator: + self.fade_interpolator.update(self.frame) + self.alpha = int(self.fade_interpolator.values[0]) + for glyph in self.glyphes: + glyph.sprite.alpha = self.alpha + glyph.sprite.changed = True + if self.frame == self.timeout: + self.removed = True + + + def fade(self, duration, alpha, formula): + self.fade_interpolator = Interpolator((self.alpha,), self.frame, + (alpha,), self.frame + duration, + formula) + + + def set_timeout(self, timeout, effect=None, start=0): + if effect == None: #XXX + self.update = self.move_timeout_update + self.timeout = timeout + start + else: + self.alpha = 0 + for glyph in self.glyphes: + glyph.sprite.alpha = 0 + self.update = self.fadeout_timeout_update + self.effect = effect + self.start = start + self.timeout = timeout + start diff --git a/pytouhou/games/eosd.py b/pytouhou/games/eosd.py --- a/pytouhou/games/eosd.py +++ b/pytouhou/games/eosd.py @@ -91,6 +91,7 @@ class EoSDGame(Game): characters = resource_loader.get_eosd_characters() players = [EoSDPlayer(state, self, resource_loader, characters[state.character]) for state in player_states] + self.stage = stage #XXX interface = EoSDInterface(self, resource_loader) Game.__init__(self, resource_loader, players, stage, rank, difficulty, @@ -119,6 +120,11 @@ class EoSDInterface(object): for item in self.items: item.sprite.allow_dest_offset = True #XXX + self.level_start = [Text((176, 200), ascii_wrapper, text='STAGE %d' % game.stage)] #TODO: find the exact location. + self.level_start[0].set_timeout(240, effect=60, start=120) + self.level_start[0].set_color('yellow') + #TODO: use the system text for the stage name, and the song name. + self.labels = { 'highscore': Text((500, 58), ascii_wrapper, front, text='0'), 'score': Text((500, 82), ascii_wrapper, front, text='0'), @@ -160,6 +166,11 @@ class EoSDInterface(object): for elem in self.items: elem.update() + for elem in self.level_start: + elem.update() + if elem.removed: #XXX + self.level_start = [] + player_state = self.game.players[0].state self.highscore = max(self.highscore, player_state.effective_score) diff --git a/pytouhou/ui/gamerunner.py b/pytouhou/ui/gamerunner.py --- a/pytouhou/ui/gamerunner.py +++ b/pytouhou/ui/gamerunner.py @@ -218,6 +218,8 @@ class GameRunner(pyglet.window.Window, G # Redraw only changed labels labels = [label for label in labels if label.changed] + self.render_elements(interface.level_start) + if self.game.boss: self.render_elements(interface.boss_items)