Module Lobby
[hide private]
[frames] | no frames]

Source Code for Module Lobby

  1  ##################################################################### 
  2  # -*- coding: iso-8859-1 -*-                                        # 
  3  #                                                                   # 
  4  # Frets on Fire                                                     # 
  5  # Copyright (C) 2006 Sami Kyöstilä                                  # 
  6  #                                                                   # 
  7  # This program is free software; you can redistribute it and/or     # 
  8  # modify it under the terms of the GNU General Public License       # 
  9  # as published by the Free Software Foundation; either version 2    # 
 10  # of the License, or (at your option) any later version.            # 
 11  #                                                                   # 
 12  # This program is distributed in the hope that it will be useful,   # 
 13  # but WITHOUT ANY WARRANTY; without even the implied warranty of    # 
 14  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     # 
 15  # GNU General Public License for more details.                      # 
 16  #                                                                   # 
 17  # You should have received a copy of the GNU General Public License # 
 18  # along with this program; if not, write to the Free Software       # 
 19  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,        # 
 20  # MA  02110-1301, USA.                                              # 
 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
48 - def shown(self):
49 self.engine.input.addKeyListener(self) 50 51 if self.singlePlayer: 52 self.session.world.createPlayer(_("Player")) 53 if self.songName: 54 self.session.world.startGame(libraryName = Song.DEFAULT_LIBRARY, songName = self.songName) 55 else: 56 self.session.world.startGame() 57 else: 58 n = self.session.id or 1 59 name = Dialogs.getText(self.engine, _("Enter your name:"), _("Player #%d") % n) 60 if name: 61 self.session.world.createPlayer(name) 62 else: 63 self.engine.view.popLayer(self)
64
65 - def hidden(self):
66 self.engine.input.removeKeyListener(self) 67 self.session.broker.removeMessageHandler(self) 68 if not self.gameStarted: 69 self.session.close() 70 self.engine.view.pushLayer(MainMenu.MainMenu(self.engine))
71
72 - def handleGameStarted(self, sender):
73 self.gameStarted = True 74 self.engine.addTask(GameTask(self.engine, self.session)) 75 self.engine.view.popLayer(self)
76
77 - def keyPressed(self, key, unicode):
78 c = self.engine.input.controls.getMapping(key) 79 if c in [Player.CANCEL, Player.KEY2]: 80 self.engine.view.popLayer(self) 81 elif (c in [Player.KEY1] or key == pygame.K_RETURN) and self.canStartGame(): 82 self.gameStarted = True 83 self.session.world.startGame() 84 return True
85
86 - def keyReleased(self, key):
87 pass
88
89 - def run(self, ticks):
90 self.time += ticks / 50.0
91
92 - def canStartGame(self):
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