diff demos/shooter/scripts/scene.py @ 453:cf53848fb187

Scene now gets updated when an object moves from one node to another. Player is now part of the scene. Projectiles can be files by both player and enemies. Some code cleanup.
author prock@33b003aa-7bff-0310-803a-e67f0ece8222
date Tue, 06 Apr 2010 19:12:41 +0000
parents f07d779362da
children bd7e8f708adf
line wrap: on
line diff
--- a/demos/shooter/scripts/scene.py	Sat Apr 03 19:19:33 2010 +0000
+++ b/demos/shooter/scripts/scene.py	Tue Apr 06 19:12:41 2010 +0000
@@ -50,7 +50,7 @@
 		self._layer = objectLayer
 		self._nodes = list()
 		
-		self._player = Player(self._model, 'player', self._layer)
+		self._player = Player(self, 'player')
 		self._player.width = 0.075
 		self._player.height = 0.075
 		self._player.start()
@@ -59,12 +59,15 @@
 		self._lasttime = 0
 		
 		self._maxnodes = 128
+		self._xscale = 0
+		
+		self._time = 0
+		self._timedelta = 0
 
 	def initScene(self, mapobj):
-		layer = mapobj.getLayer('objects')
-		xscale = layer.getCellGrid().getXScale()
+		self._xscale = self._layer.getCellGrid().getXScale()
 				
-		enemies = layer.getInstances('enemy')
+		enemies = self._layer.getInstances('enemy')
 		
 		#initialize our scene array to some arbitrary size
 		for i in range(0,self._maxnodes):
@@ -75,18 +78,22 @@
 			print objectName
 			
 			if objectName == "saucer1":
-				enemy = Saucer1(self._model, 'enemy', self._layer, False)
+				enemy = Saucer1(self, 'enemy', False)
 			elif objectName == "saucer2":
-				enemy = Saucer2(self._model, 'enemy', self._layer, False)
+				enemy = Saucer2(self, 'enemy', False)
 			else:
-				enemy = Ship(self._model, 'enemy', self._layer, False)
+				enemy = Ship(self, 'enemy', False)
 				
 			enemy.instance = instance
 			enemy.start()
 
 			loc = instance.getLocation().getExactLayerCoordinates()
-			nodeindex = int(loc.x * xscale)
+			nodeindex = int(loc.x * self._xscale)
+			enemy.scenenodeid = nodeindex
 			self._nodes[nodeindex].spaceobjects.append(enemy)
+			
+		#and finally add the player to the scene
+		self.addObjectToScene(self._player)
 
 	def getObjectsInNode(self, nodeindex):
 		return self._nodes[nodeindex].instances
@@ -98,6 +105,26 @@
 			objects.extend(self._nodes[i].spaceobjects)
 			
 		return objects
+		
+	def addObjectToScene(self, obj):
+		#TODO: search to ensure the object isn't already part of the scene
+		loc = obj.instance.getLocation().getExactLayerCoordinates()
+		nodeindex = int(loc.x * self._xscale)
+		
+		self._nodes[nodeindex].spaceobjects.append(obj)
+		obj.scenenodeid = nodeindex		
+
+	def addProjectileToScene(self, projectile):
+		self._projectiles.append(projectile)
+	
+	def moveObjectInScene(self, obj):
+		loc = obj.instance.getLocation().getExactLayerCoordinates()
+		nodeindex = int(loc.x * self._xscale)
+		
+		if nodeindex != obj.scenenodeid:
+			self._nodes[obj.scenenodeid].spaceobjects.remove(obj)
+			self._nodes[nodeindex].spaceobjects.append(obj)
+			obj.scenenodeid = nodeindex
 	
 	def removeObjectFromScene(self, obj):
 		for node in self._nodes:
@@ -109,16 +136,17 @@
 		self._camera = cam
 		self._camera.setLocation(self._player.location)
 		
-	def _getPlayer(self):
-		return self._player
-
 	def update(self, time, keystate):
-		timedelta = time - self._lasttime
-		self._lasttime = time
+		timedelta = time - self._time
+		self._timedelta = timedelta
+		self._time = time
+		
+		self._keystate = keystate
 		
 		#update camera location
 		loc = self._camera.getLocation()
 		exactloc = self._camera.getLocation().getExactLayerCoordinates()
+		#slowly move to the right
 		exactloc.x += timedelta * 0.001
 		loc.setExactLayerCoordinates(exactloc)
 		self._camera.setLocation(loc)
@@ -137,12 +165,24 @@
 			rightnode = self._maxnodes
 		screenlist = self.getObjectsInRange(leftnode, rightnode)
 		
+
 		#update objects on the screen
 		for obj in screenlist:
 			obj.update(timedelta)
+			if obj.changedposition:
+				self.moveObjectInScene(obj)
 
-		#update the player
-		self._player.update(timedelta, keystate, self._camera)
+				#Testing enemy fire				
+				#prjct = obj.fire(time, fife.DoublePoint(-1,0))
+				#if prjct:
+				#	self._projectiles.append(prjct)
+			
+			if obj != self._player:
+				if obj.boundingbox.intersects(self._player.boundingbox):
+					#player touched an enemy.  Destroy player and 
+					#re-initialize scene
+					self._player.destroy()
+		
 		
 		#update the list of projectiles
 		projtodelete = list()
@@ -150,25 +190,51 @@
 			p.update(timedelta)
 			#check to see if the projectile hit any object on the screen
 			for o in screenlist:
-				if p.boundingbox.intersects(o.boundingbox):
-					self._player.applyScore(100)
-					p.destroy()
-					o.destroy()
-					self.removeObjectFromScene(o)
+				#cant get hit by your own bullet
+				if p.owner != o:
+					if p.boundingbox.intersects(o.boundingbox):
+						self._player.applyScore(100)
+						p.destroy()
+						o.destroy()
+						#temporary...  the destroy functions should spawn an explosion
+						#and also destroy the instance and remove itself from the scene
+						self.removeObjectFromScene(o)
 			
 			#build a list of projectiles to remove (ttl expired)
 			if not p.running:
 				projtodelete.append(p)
 
-		#remove any non running projectiles 
+		#remove any expired projectiles 
 		for p in projtodelete:
 			self._projectiles.remove(p)
+
+				
+	def _getPlayer(self):
+		return self._player
 		
-		#fire the currently selected gun
-		if keystate['SPACE']:
-			prjct = self._player.fire(time)
-			if prjct:
-				self._projectiles.append(prjct)
+	def _getKeyState(self):
+		return self._keystate
+		
+	def _getCamera(self):
+		return self._camera
+		
+	def _getObjectLayer(self):
+		return self._layer
+		
+	def _getModel(self):
+		return self._model
+		
+	def _getTime(self):
+		return self._time
+	
+	def _getTimeDelta(self):
+		return self._timedelta
 
 	player = property(_getPlayer)
+	keystate = property(_getKeyState)
+	camera = property(_getCamera)
+	objectlayer = property(_getObjectLayer)
+	model = property(_getModel)
+	time = property(_getTime)
+	timedelta = property(_getTimeDelta)