Guest User

Untitled

a guest
Jan 21st, 2018
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.83 KB | None | 0 0
  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()
Add Comment
Please, Sign In to add comment