1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 import pygame
24 from OpenGL.GL import *
25 import math
26 import colorsys
27
28 from View import Layer
29 from Input import KeyListener
30 from GameTask import GameTask
31 from Session import MessageHandler
32 from Language import _
33 import MainMenu
34 import Dialogs
35 import Player
36 import Song
37
38 -class Lobby(Layer, KeyListener, MessageHandler):
39 - def __init__(self, engine, session, singlePlayer = False, songName = None):
40 self.engine = engine
41 self.session = session
42 self.time = 0.0
43 self.gameStarted = False
44 self.singlePlayer = singlePlayer
45 self.songName = songName
46 self.session.broker.addMessageHandler(self)
47
64
71
73 self.gameStarted = True
74 self.engine.addTask(GameTask(self.engine, self.session))
75 self.engine.view.popLayer(self)
76
85
88
89 - def run(self, ticks):
90 self.time += ticks / 50.0
91
93 return len(self.session.world.players) > 1 and self.session.isPrimary() and not self.gameStarted
94
95 - def render(self, visibility, topMost):
96 if self.singlePlayer:
97 return
98
99 self.engine.view.setOrthogonalProjection(normalize = True)
100 font = self.engine.data.font
101
102 try:
103 v = 1.0 - ((1 - visibility) ** 2)
104
105 glEnable(GL_BLEND)
106 glBlendFunc(GL_SRC_ALPHA, GL_ONE)
107 glEnable(GL_COLOR_MATERIAL)
108
109 text = _("Lobby (%d players)") % len(self.session.world.players)
110 w, h = font.getStringSize(text)
111
112 x = .5 - w / 2
113 d = 0.0
114 c = 1 - .25 * v
115
116 y = .1 - (1.0 - v) * .2
117
118 for i, ch in enumerate(text):
119 w, h = font.getStringSize(ch)
120 c = i * .05
121 glColor3f(*colorsys.hsv_to_rgb(.75, c, 1))
122 glPushMatrix()
123 s = .25 * (math.sin(i / 2 + self.time / 4) + 2)
124 glTranslate(-s * w / 2, -s * h / 2, 0)
125 font.render(ch, (x, y), scale = 0.002 * s)
126 glPopMatrix()
127 x += w
128
129 x = .1
130 y = .2 + (1 - v) / 4
131 glColor4f(1, 1, 1, v)
132
133 for player in self.session.world.players:
134 font.render(player.name, (x, y))
135 y += .08
136
137 if self.canStartGame():
138 s = _("Press Enter to Start Game")
139 sz = 0.0013
140 w, h = font.getStringSize(s, scale = sz)
141 font.render(s, (.5 - w / 2, .65), scale = sz)
142
143 finally:
144 self.engine.view.resetProjection()
145