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

Source Code for Module Scene

  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  from Player import Player 
 24  from View import BackgroundLayer 
 25  from Session import MessageHandler, Message 
 26  from Input import KeyListener 
 27  from Camera import Camera 
 28  import Network 
 29  import Player 
 30  import Config 
 31   
 32  from OpenGL.GL import * 
 33  from OpenGL.GLU import * 
 34  import math 
 35  import colorsys 
 36  import pygame 
 37   
 38  Config.define("network", "updateinterval", int, 72) 
 39   
 40  # Messages from client to server 
41 -class CreateActor(Message): pass
42 -class ControlEvent(Message): pass
43 44 # Messages from server to client
45 -class ActorCreated(Message): pass
46 -class ActorDeleted(Message): pass
47 -class ActorData(Message): pass
48 -class ControlData(Message): pass
49
50 -class Scene(MessageHandler, BackgroundLayer):
51 - def __init__(self, engine, owner, **args):
52 self.objects = Network.ObjectCollection() 53 self.args = args 54 self.owner = owner 55 self.engine = engine 56 self.actors = [] 57 self.camera = Camera() 58 self.world = None 59 self.space = None 60 self.time = 0.0 61 self.actors = [] 62 self.players = [] 63 self.createCommon(**args)
64
65 - def addPlayer(self, player):
66 self.players.append(player)
67
68 - def removePlayer(self, player):
69 self.players.remove(player)
70
71 - def createCommon(self, **args):
72 pass
73
74 - def runCommon(self, ticks, world):
75 pass
76
77 - def run(self, ticks):
78 self.time += ticks / 50.0
79
80 - def handleActorCreated(self, sender, id, owner, name):
81 actor = globals()[name](self, owner) 82 self.objects[id] = actor 83 self.actors.append(actor)
84
85 - def handleActorDeleted(self, sender, id):
86 actor = self.objects[id] 87 self.actors.remove(actor) 88 del self.objects[id]
89
90 -class SceneClient(Scene, KeyListener):
91 - def __init__(self, engine, owner, session, **args):
92 Scene.__init__(self, engine, owner, **args) 93 self.session = session 94 self.player = self.session.world.getLocalPlayer() 95 self.controls = Player.Controls() 96 self.createClient(**args)
97
98 - def createClient(self, **args):
99 pass
100
101 - def createActor(self, name):
102 self.session.sendMessage(CreateActor(name = name))
103
104 - def shown(self):
105 self.engine.input.addKeyListener(self)
106
107 - def hidden(self):
108 self.engine.input.removeKeyListener(self)
109
110 - def keyPressed(self, key, unicode):
111 c = self.controls.keyPressed(key) 112 if c: 113 self.session.sendMessage(ControlEvent(flags = self.controls.flags)) 114 return True 115 return False
116
117 - def keyReleased(self, key):
118 c = self.controls.keyReleased(key) 119 if c: 120 self.session.sendMessage(ControlEvent(flags = self.controls.flags)) 121 return True 122 return False
123
124 - def handleControlData(self, sender, owner, flags):
125 # TODO: player mapping 126 for player in self.session.world.players: 127 if player.owner == owner: 128 player.controls.flags = flags 129 break
130
131 - def handleActorData(self, sender, id, data):
132 actor = self.objects[id] 133 actor.setState(*data)
134
135 - def run(self, ticks):
136 self.runCommon(ticks, self.session.world) 137 Scene.run(self, ticks)
138
139 - def render3D(self):
140 for actor in self.actors: 141 actor.render()
142
143 - def render(self, visibility, topMost):
144 font = self.engine.data.font 145 146 # render the scene 147 try: 148 glMatrixMode(GL_PROJECTION) 149 glPushMatrix() 150 glLoadIdentity() 151 gluPerspective(60, self.engine.view.aspectRatio, 0.1, 1000) 152 glMatrixMode(GL_MODELVIEW) 153 glLoadIdentity() 154 155 glPushMatrix() 156 self.camera.apply() 157 158 self.render3D() 159 finally: 160 glPopMatrix() 161 glMatrixMode(GL_PROJECTION) 162 glPopMatrix() 163 glMatrixMode(GL_MODELVIEW)
164
165 -class SceneServer(Scene):
166 - def __init__(self, engine, owner, server, **args):
167 Scene.__init__(self, engine, owner, **args) 168 self.server = server 169 self.updateInterval = self.engine.config.get("network", "updateinterval") 170 self.updateCounter = 0 171 self.changedControlData = {}
172
173 - def handleControlEvent(self, sender, flags):
174 self.changedControlData[sender] = flags
175
176 - def handleControlData(self, sender, owner, flags):
177 # TODO: player mapping 178 for player in self.server.world.players: 179 if player.owner == owner: 180 player.controls.flags = flags 181 break
182
183 - def handleCreateActor(self, sender, name):
184 id = self.objects.generateId() 185 self.server.broadcastMessage(ActorCreated(owner = sender, name = name, id = id))
186
187 - def handleSessionClosed(self, session):
188 for actor in self.actors: 189 if actor.owner == session.id: 190 id = self.objects.id(actor) 191 self.server.broadcastMessage(ActorDeleted(id = id))
192
193 - def handleSessionOpened(self, session):
194 for actor in self.actors: 195 id = self.objects.id(actor) 196 session.sendMessage(ActorCreated(owner = actor.owner, name = actor.__name__, id = id))
197
198 - def broadcastState(self):
199 for actor in self.actors: 200 id = self.objects.id(actor) 201 self.server.broadcastMessage(ActorData(id = id, data = actor.getState()), meToo = False) 202 203 for sender, flags in self.changedControlData.items(): 204 self.server.broadcastMessage(ControlData(owner = sender, flags = flags)) 205 self.changedControlData = {}
206
207 - def run(self, ticks):
208 self.runCommon(ticks, self.server.world) 209 Scene.run(self, ticks) 210 211 self.updateCounter += ticks 212 if self.updateCounter > self.updateInterval: 213 self.updateCounter %= self.updateInterval 214 self.broadcastState()
215