def tick(self): Handler.tick(self) if self.nextHandler != self: nextHandler, self.nextHandler = self.nextHandler, self return nextHandler self.animationTimer.tick(self.delta()) self.attractTimer.tick(self.delta()) self.refreshTimer.tick(self.delta()) self.keyTimer.tick(self.delta()) if self.ffMode: self.ffTimer.tick(self.delta()) self.ffTimer.clock = min(self.ffTimer.clock, self.ffLength) u = self.ffTimer.clock / self.ffLength Handler.contest.revealUntil = int(0.0 + \ (1 - u) * Handler.contest.freezeTime + \ u * Handler.contest.contestTime) self.attractSpeed = 300 else: self.attractSpeed = 1000 curScroll = (abs(self.pendingScroll) + 4) / 5 if self.pendingScroll < 0: curScroll *= -1 self.offsetY += curScroll self.pendingScroll -= curScroll if self.offsetY < 0: self.offsetY = 0 self.pendingScroll = 0 # no need to scroll further elif self.offsetY > self.maxOffsetY: self.offsetY = self.maxOffsetY self.pendingScroll = 0 if (not self.awardsMode ) and self.refreshTimer.clock > self.refreshFreq: self.refreshTimer.reset() try: Handler.contest.refresh_runs() self.setup_animation() Handler.contest.load_clock() except IOError, e: pass if self.lockTo: self.offsetY += self.teamHeight * 12 self.attractTimer.clock = \ (self.offsetY * self.attractSpeed) / self.teamHeight self.lockTo = None for run in Handler.contest.newRunList[-1]: if run.answer == 'Y': self.lockTo = run.team
def tick(self): Handler.tick(self) if self.nextHandler != self: nextHandler, self.nextHandler = self.nextHandler, self return nextHandler self.animationTimer.tick(self.delta()) self.attractTimer.tick(self.delta()) self.refreshTimer.tick(self.delta()) self.keyTimer.tick(self.delta()) if self.ffMode: self.ffTimer.tick(self.delta()) self.ffTimer.clock = min(self.ffTimer.clock, self.ffLength) c = self.ffTimer.clock l = self.ffLength t = Handler.contest.contestTime f = Handler.contest.freezeTime # original equations # u = c / l # d = ((1 - u) * f + u * t) # factored equation d = f + (c * (t - f)) // l Handler.contest.revealUntil = d self.attractSpeed = 300 else: self.attractSpeed = 1000 curScroll = (abs(self.pendingScroll) + 4) // 5 if self.pendingScroll < 0: curScroll *= -1 self.offsetY += curScroll self.pendingScroll -= curScroll if self.offsetY < 0: self.offsetY = 0 self.pendingScroll = 0 # no need to scroll further elif self.offsetY > self.maxOffsetY: self.offsetY = self.maxOffsetY self.pendingScroll = 0 if (not self.awardsMode ) and self.refreshTimer.clock > self.refreshFreq: self.refreshTimer.reset() try: Handler.contest.refresh_runs() self.setup_animation() Handler.contest.load_clock() except IOError as e: pass if self.lockTo: self.offsetY += self.teamHeight * 12 self.attractTimer.clock = \ (self.offsetY * self.attractSpeed) // self.teamHeight self.lockTo = None for run in Handler.contest.newRunList[-1]: if run.answer == 'Y': self.lockTo = run.team if not self.lockTo: self.pendingScroll = 0 self.offsetY = (self.teamHeight * self.attractTimer.clock) // self.attractSpeed self.offsetY -= self.teamHeight * 12 if self.offsetY < 0: self.offsetY = 0 if self.offsetY > self.maxOffsetY + self.teamHeight // 2: self.attractTimer.reset() if self.ffMode: if self.ffTimer.clock >= self.ffLength: self.ffMode = False self.awardsMode = True Handler.contest.newRunList = [[]] else: # show a random team photo self.nextHandler = TeamHandler(None, self) get_screen().fill((0, 0, 0)) block_blit(get_screen(), image('logo.jpg'), \ (0, 0, 1024, 768), 'cc') Handler.contest.rank_teams() numTeams = len(Handler.contest.teamRanking) baseY = -self.offsetY + 48 + self.teamHeight * (numTeams - 1) if Handler.contest.teamRanking[::-1][0][0] >= 100: fontsz = 34 else: fontsz = 52 for rank, teamID in Handler.contest.teamRanking[::-1]: moveY = 0 if teamID in self.moveMap.keys(): oldPos, newPos = self.moveMap[teamID] # old equation, using float (kept line for clarity) # moveY = self.teamHeight * (oldPos - newPos) * (1 - cubic_spline(self.animationTimer.clock / self.animationSpeed)) n = self.teamHeight * (oldPos - newPos) moveY = n - cubic_spline_int(n, self.animationTimer.clock, self.animationSpeed) if self.lockTo == teamID: # keep locked team at screen center self.pendingScroll = baseY + moveY - 408 + self.teamHeight // 2 # only draw stuff that will appear on-screen if -self.teamHeight + 40 < baseY < 768: if rank >= 1000: rank = u'\u221E' else: rank = str(rank) block_blit(get_screen(), \ render(font('italic', fontsz), \ rank, '#999999'), \ (0, baseY, 60, self.teamHeight), 'rc') if -self.teamHeight + 40 < baseY + moveY < 768: team = Team(teamID) get_screen().blit(team.draw(self.lockTo == team.key), (68, baseY + moveY)) # reposition cursor baseY -= self.teamHeight self.draw_header() pygame.display.flip() return self