Пример #1
0
    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