from libs.animation import Animation from libs.texture import TextureWrapper class Fever: @staticmethod def create(tex: TextureWrapper, index: int, bpm: float): map = [Fever0, Fever1, Fever2, Fever3] selected_obj = map[index] return selected_obj(tex, index, bpm) class BaseFever: def __init__(self, tex: TextureWrapper, index: int, bpm: float, path: str = 'background'): self.name = 'fever_' + str(index) tex.load_zip(path, f'fever/{self.name}') self.bounce_up = Animation.create_move((60000 / bpm) / 2, total_distance=50, ease_out='quadratic') self.bounce_down = Animation.create_move((60000 / bpm) / 2, total_distance=50, ease_in='quadratic', delay=self.bounce_up.duration) def start(self): self.bounce_down.start() self.bounce_up.start() def update(self, current_time_ms: float, bpm: float): self.bounce_up.update(current_time_ms) self.bounce_down.update(current_time_ms) if self.bounce_down.is_finished: self.bounce_up.duration = (60000 / bpm) / 2 self.bounce_down.duration = (60000 / bpm) / 2 self.bounce_up.restart() self.bounce_down.restart() class Fever0(BaseFever): def draw(self, tex: TextureWrapper): tex.draw_texture(self.name, 'overlay_l', y=self.bounce_down.attribute-self.bounce_up.attribute) tex.draw_texture(self.name, 'overlay_r', y=self.bounce_down.attribute-self.bounce_up.attribute) class Fever1(BaseFever): def draw(self, tex: TextureWrapper): tex.draw_texture(self.name, 'overlay_l', y=self.bounce_down.attribute-self.bounce_up.attribute) tex.draw_texture(self.name, 'overlay_r', y=self.bounce_down.attribute-self.bounce_up.attribute) class Fever2(BaseFever): def draw(self, tex: TextureWrapper): tex.draw_texture(self.name, 'overlay_l', y=self.bounce_down.attribute-self.bounce_up.attribute) tex.draw_texture(self.name, 'overlay_r', y=self.bounce_down.attribute-self.bounce_up.attribute) class Fever3(BaseFever): def draw(self, tex: TextureWrapper): tex.draw_texture(self.name, 'overlay', y=self.bounce_down.attribute-self.bounce_up.attribute)