diff demos/shooter/scripts/world.py @ 455:e686b82d93d0

Added the ability to pause the game. Added the main menu.
author prock@33b003aa-7bff-0310-803a-e67f0ece8222
date Wed, 07 Apr 2010 19:37:42 +0000
parents bd7e8f708adf
children 41fd97da94d1
line wrap: on
line diff
--- a/demos/shooter/scripts/world.py	Tue Apr 06 21:25:10 2010 +0000
+++ b/demos/shooter/scripts/world.py	Wed Apr 07 19:37:42 2010 +0000
@@ -34,6 +34,55 @@
 from scripts.ships.player import Player
 from scripts.scene import Scene
 
+class MainMenu(object):
+	def __init__(self, world):
+		self._world = world
+		self._widget = pychan.loadXML('gui/mainmenu.xml')
+
+		self._continue = self._widget.findChild(name="continue")
+		self._newgame = self._widget.findChild(name="new_game")
+		self._credits = self._widget.findChild(name="credits")
+		self._highscores = self._widget.findChild(name="high_scores")
+		self._quit = self._widget.findChild(name="quit")
+		
+		self._widget.position = (0,0)
+
+		eventMap = {
+			'continue': self._world.continueGame,
+			'new_game': self._world.newGame,
+			'credits': self._world.showCredits,
+			'high_scores': self._world.showHighScores,
+			'quit': self._world.quit,
+		}
+
+		self._widget.mapEvents(eventMap)		
+		
+		self._continueMinWidth = self._continue.min_width
+		self._continueMinHeight = self._continue.min_height
+		self._continueMaxWidth = self._continue.max_width
+		self._continueMaxHeight = self._continue.max_height	
+
+		
+	def show(self, cont=False):
+		if cont:
+			self._continue.min_width = self._continueMinWidth
+			self._continue.min_height = self._continueMinHeight
+			self._continue.max_width = self._continueMaxWidth
+			self._continue.max_height = self._continueMaxHeight
+			
+		else:
+			self._continue.min_width = 0
+			self._continue.min_height = 0
+			self._continue.max_width = 0
+			self._continue.max_height = 0
+
+		self._continue.adaptLayout()
+		self._widget.show()
+		
+	def hide(self):
+		self._widget.hide()
+		
+
 class World(EventListenerBase):
 	"""
 	The world!
@@ -41,14 +90,13 @@
 	This class handles:
 	  setup of map view (cameras ...)
 	  loading the map
-	  GUI for right clicks
 	  handles mouse/key events which aren't handled by the GUI.
 	   ( by inheriting from EventlistenerBase )
 
-	That's obviously too much, and should get factored out.
 	"""
-	def __init__(self, engine):
+	def __init__(self, app, engine):
 		super(World, self).__init__(engine, regMouse=True, regKeys=True)
+		self._applictaion = app
 		self.engine = engine
 		self.timemanager = engine.getTimeManager()
 		self.eventmanager = engine.getEventManager()
@@ -59,33 +107,78 @@
 		self.pump_ctr = 0
 		self.map = None
 		self.scene = None
+		self._paused = True
+		self._pausedtime = 0
+		self._starttime = 0
+		
+		self._mainmenu = MainMenu(self)
+		self.showMainMenu()
+		
+		self._hudwindow = None
 
+	
+	def showMainMenu(self):
+		if self.scene:
+			self._paused = True
+			cont = True
+		else:
+			cont = False
+			
+		self._mainmenu.show(cont)
+		
+	def showCredits(self):
+		pass
+		
+	def showHighScores(self):
+		pass
+		
+	def quit(self):
+		self.reset()
+		self._applictaion.requestQuit()
+		
 	def reset(self):
-		"""
-		Clear the agent information and reset the moving secondary camera state.
+		#TODO: ensure these get destroyed correctly
+		if self.map:
+			self.model.deleteMap(self.map)
+		self.map = None
+		
+		self.cameras = {}
+		self.scene = None
+
+	def loadLevel(self, filename):
 		"""
-		self.cameras = {}
-
-	def load(self, filename):
-		"""
-		Load a xml map and setup agents and cameras.
+		Load a xml map and setup cameras.
 		"""
 		self.filename = filename
 		self.reset()
-		self.map = loadMapFile(filename, self.engine)
+		self.map = loadMapFile(self.filename, self.engine)
 
 		self.scene = Scene(self.engine, self.map.getLayer('objects'))
 		
-		self.mainwindow = pychan.loadXML('gui/mainwindow.xml')
-		self.fpstext = self.mainwindow.findChild(name="fps")
-		self.velocitytext = self.mainwindow.findChild(name="velocity")
-		self.positiontext = self.mainwindow.findChild(name="position")
-		self.scoretext = self.mainwindow.findChild(name="score")
-		self.mainwindow.position = (0,0)
-		self.mainwindow.show()
+		if not self._hudwindow:
+			self._hudwindow = pychan.loadXML('gui/mainwindow.xml')
+			self.fpstext = self._hudwindow.findChild(name="fps")
+			self.velocitytext = self._hudwindow.findChild(name="velocity")
+			self.positiontext = self._hudwindow.findChild(name="position")
+			self.scoretext = self._hudwindow.findChild(name="score")
+			self._hudwindow.position = (0,0)
 		
 		self.scene.initScene(self.map)
 		self.initCameras()
+
+		self._hudwindow.show()
+		
+		self._starttime = self.timemanager.getTime()
+		
+
+	def newGame(self):
+		self.loadLevel("maps/shooter_map1.xml")
+		self._mainmenu.hide()
+		self._paused = False
+		
+	def continueGame(self):
+		self._mainmenu.hide()
+		self._paused = False
 		
 	def initCameras(self):
 		"""
@@ -113,6 +206,9 @@
 			self.keystate['RIGHT'] = True
 		elif keyval == fife.Key.SPACE:
 			self.keystate['SPACE'] = True
+		elif keyval == fife.Key.P:
+			self._paused = not self._paused
+			self._pausedtime += self.timemanager.getTime()
 		elif keyval in (fife.Key.LEFT_CONTROL, fife.Key.RIGHT_CONTROL):
 			self.keystate['CTRL'] = True
 
@@ -153,29 +249,39 @@
 		Called every frame.
 		"""
 		
+		if not self.scene:
+			return
+		
 		#update the scene
-		self.scene.update(self.timemanager.getTime(), self.keystate)
+		if not self._paused:
+			if self.scene.paused:
+				self.scene.unpause(self.timemanager.getTime() - self._starttime)
+				
+			self.scene.update(self.timemanager.getTime() - self._starttime, self.keystate)
 		
 		
-		#update the HUD
-		avgframe = self.timemanager.getAverageFrameTime()
-		if avgframe > 0:
-			fps = 1 / (avgframe / 1000)
-		else:
-			fps = 0
-		fpstxt = "%3.2f" % fps
-		self.fpstext.text = unicode(fpstxt)
+			#update the HUD
+			avgframe = self.timemanager.getAverageFrameTime()
+			if avgframe > 0:
+				fps = 1 / (avgframe / 1000)
+			else:
+				fps = 0
+			fpstxt = "%3.2f" % fps
+			self.fpstext.text = unicode(fpstxt)
 		
-		player = self.scene.player
-		exactcoords = player.location.getExactLayerCoordinates()
-		pos = "%1.2f" % exactcoords.x + ", %1.2f" % exactcoords.y
-		self.positiontext.text = unicode(pos)
+			player = self.scene.player
+			exactcoords = player.location.getExactLayerCoordinates()
+			pos = "%1.2f" % exactcoords.x + ", %1.2f" % exactcoords.y
+			self.positiontext.text = unicode(pos)
 		
-		vel = "%1.2f" % player.velocity.x + ", %1.2f" % player.velocity.y
-		self.velocitytext.text = unicode(vel)
+			vel = "%1.2f" % player.velocity.x + ", %1.2f" % player.velocity.y
+			self.velocitytext.text = unicode(vel)
 		
-		score = unicode(str(player.score))
-		self.scoretext.text = score
-		
+			score = unicode(str(player.score))
+			self.scoretext.text = score
+			
+		else:
+			if not self.scene.paused:
+				self.scene.pause(self.timemanager.getTime() - self._starttime)
 		
 		self.pump_ctr += 1