Пример #1
0
class TeamHandler(Handler):
    def __init__(self, teamID, returnTo, timeout=5000.0):
        Handler.__init__(self)
        if teamID is None:
            teamID = random.choice(list(Handler.contest.teamMap.keys()))
        self.team = Team(teamID)
        self.returnTo = returnTo

        self.teamPhoto = Handler.contest.teamPhotos.get(teamID)

        self.timeout = timeout
        self.timeoutTimer = Timer()

        pygame.mouse.set_visible(False)

    def on_event(self, event):
        if Handler.on_event(self, event):
            return True
        if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
            if self.timeoutTimer.clock > 500:
                self.nextHandler = self.returnTo

    def tick(self):
        Handler.tick(self)

        if self.teamPhoto == None:  # no point being in this handler
            return self.returnTo

        self.timeoutTimer.tick(self.delta())
        if self.timeout and self.timeoutTimer.clock > self.timeout:
            self.nextHandler = self.returnTo

        Handler.contest.rank_teams()
        teamRank = [
            _[0] for _ in Handler.contest.teamRanking if _[1] == self.team.key
        ][0]

        teamUni, teamName = Handler.contest.teamMap[self.team.key]

        get_screen().fill((0, 0, 0))

        block_blit(get_screen(), render(font('bold', 48), teamUni, '#FFFFFFi'),
                   (0, 48, 1024, 0), 'ct')

        block_blit(get_screen(), render(font('roman', 36), teamName,
                                        '#FFFFFF'), (0, 104, 1024, 0), 'ct')

        block_blit(get_screen(), self.teamPhoto, (0, 156, 1024, 504), 'cc')

        block_blit(get_screen(), render(font('italic', 52), teamRank,
                                        '#999999'), (0, 680, 60, 60), 'rc')

        get_screen().blit(self.team.draw(True), (68, 680))

        pygame.display.flip()

        return self.nextHandler
    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