# HG changeset patch
# User prock@33b003aa-7bff-0310-803a-e67f0ece8222
# Date 1272043022 0
# Node ID ab28994820ddaf73b5d5a7a17a847a1b1690ab26
# Parent 41f7754f2a4bb1b9dde3926290ab36d22d757548
Added some powerups including a spread weapon and an extra life.
Fixed the problem where the player could fly off the screen.
diff -r 41f7754f2a4b -r ab28994820dd demos/shooter/maps/shooter_map1.xml
--- a/demos/shooter/maps/shooter_map1.xml Thu Apr 22 21:04:13 2010 +0000
+++ b/demos/shooter/maps/shooter_map1.xml Fri Apr 23 17:17:02 2010 +0000
@@ -7,6 +7,8 @@
+
+
@@ -461,6 +463,8 @@
+
+
@@ -501,7 +505,9 @@
-
+
+
+
@@ -561,6 +567,8 @@
+
+
diff -r 41f7754f2a4b -r ab28994820dd demos/shooter/objects/powerups/cannonspread5/cannon_spread.png
Binary file demos/shooter/objects/powerups/cannonspread5/cannon_spread.png has changed
diff -r 41f7754f2a4b -r ab28994820dd demos/shooter/objects/powerups/cannonspread5/object.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/shooter/objects/powerups/cannonspread5/object.xml Fri Apr 23 17:17:02 2010 +0000
@@ -0,0 +1,4 @@
+
+
diff -r 41f7754f2a4b -r ab28994820dd demos/shooter/objects/powerups/extralife/extralife.png
Binary file demos/shooter/objects/powerups/extralife/extralife.png has changed
diff -r 41f7754f2a4b -r ab28994820dd demos/shooter/objects/powerups/extralife/object.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/shooter/objects/powerups/extralife/object.xml Fri Apr 23 17:17:02 2010 +0000
@@ -0,0 +1,4 @@
+
+
diff -r 41f7754f2a4b -r ab28994820dd demos/shooter/scripts/common/baseobject.py
--- a/demos/shooter/scripts/common/baseobject.py Thu Apr 22 21:04:13 2010 +0000
+++ b/demos/shooter/scripts/common/baseobject.py Fri Apr 23 17:17:02 2010 +0000
@@ -31,6 +31,7 @@
SHTR_LASTBOSS = 2
SHTR_PROJECTILE = 3
SHTR_ENEMYSHIP = 4
+SHTR_POWERUP = 5
class SpaceObject(object):
@@ -143,6 +144,8 @@
def _setInstance(self, instance):
self._instance = instance
+ if self._instance:
+ self._instance.thisown = 0
def _getVelocity(self):
return self._velocity
diff -r 41f7754f2a4b -r ab28994820dd demos/shooter/scripts/gui/guis.py
--- a/demos/shooter/scripts/gui/guis.py Thu Apr 22 21:04:13 2010 +0000
+++ b/demos/shooter/scripts/gui/guis.py Fri Apr 23 17:17:02 2010 +0000
@@ -176,7 +176,6 @@
for highscore in self._scores:
if score._score > highscore._score:
element = i
- print element
break
i += 1
diff -r 41f7754f2a4b -r ab28994820dd demos/shooter/scripts/powerups.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/shooter/scripts/powerups.py Fri Apr 23 17:17:02 2010 +0000
@@ -0,0 +1,82 @@
+# -*- coding: utf-8 -*-
+
+# ####################################################################
+# Copyright (C) 2005-2009 by the FIFE team
+# http://www.fifengine.de
+# This file is part of FIFE.
+#
+# FIFE is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+# ####################################################################
+
+from fife import fife
+from scripts.ships.shipbase import SpaceObject
+from scripts.weapons import *
+
+class PowerUp(SpaceObject):
+ def __init__(self, scene, powerupName, instance, findInstance=True):
+ super(PowerUp, self).__init__(scene, powerupName, findInstance)
+
+ self.instance = instance
+ self._type = SHTR_POWERUP
+
+ self.width = 0.025
+ self.height = 0.025
+
+ def applyPowerUp(self, ship):
+ self.destroy()
+ self._scene.queueObjectForRemoval(self)
+
+class CannonSpread5PU(PowerUp):
+ def __init__(self, scene, powerupName, instance, findInstance=True):
+ super(CannonSpread5PU, self).__init__(scene, powerupName, instance, findInstance)
+
+ self._dir = 0
+ self._time = 1500
+ self._velocity.x = -0.25
+ self._velocity.y = 0
+
+ def applyPowerUp(self, ship):
+ ship.weapon = CannonSpread5(self._scene, ship, 300)
+ self.destroy()
+ self._scene.queueObjectForRemoval(self)
+
+ def update(self):
+ if self._dir == 1:
+ self._velocity.y = -0.25
+ elif self._dir == 0:
+ self._velocity.y = 0.25
+
+ if self._time >= 3000:
+ if self._dir == 1:
+ self._dir = 0
+ elif self._dir == 0:
+ self._dir = 1
+
+ self._time = 0
+
+ self._time += self._scene.timedelta
+
+ super(CannonSpread5PU, self).update()
+
+class ExtraLifePU(PowerUp):
+ def __init__(self, scene, powerupName, instance, findInstance=True):
+ super(ExtraLifePU, self).__init__(scene, powerupName, instance, findInstance)
+
+ def applyPowerUp(self, ship):
+ ship.lives += 1
+ self.destroy()
+ self._scene.queueObjectForRemoval(self)
+
\ No newline at end of file
diff -r 41f7754f2a4b -r ab28994820dd demos/shooter/scripts/scene.py
--- a/demos/shooter/scripts/scene.py Thu Apr 22 21:04:13 2010 +0000
+++ b/demos/shooter/scripts/scene.py Fri Apr 23 17:17:02 2010 +0000
@@ -25,6 +25,7 @@
from scripts.ships.shipbase import *
from scripts.ships.player import Player
from scripts.ships.enemies import *
+from scripts.powerups import *
from scripts.common.helpers import Rect
class SceneNode(object):
@@ -100,6 +101,7 @@
self._player.start()
enemies = list()
+ powerups = list()
temp = self._layer.getInstances('dodge1')
enemies.extend(temp)
@@ -118,10 +120,15 @@
temp = self._layer.getInstances("boss")
enemies.extend(temp)
+
+ temp = self._layer.getInstances("cannonspread5")
+ powerups.extend(temp)
+
+ temp = self._layer.getInstances("extralife")
+ powerups.extend(temp)
for instance in enemies:
objectName = instance.getId()
- print objectName
if objectName == "dodge1":
enemy = Saucer1(self, 'enemy', instance, False)
@@ -145,6 +152,25 @@
enemy.scenenodeid = nodeindex
self._nodes[nodeindex].spaceobjects.append(enemy)
+ for instance in powerups:
+ objectName = instance.getId()
+
+ print objectName
+
+ if objectName == "cannonspread5":
+ powerup = CannonSpread5PU(self, 'cannonspread5', instance, False)
+ elif objectName == "extralife":
+ powerup = ExtraLifePU(self, 'extralife', instance, False)
+ else:
+ powerup = PowerUp(self, 'powerup', instance, False)
+
+ powerup.start()
+
+ loc = instance.getLocation().getExactLayerCoordinates()
+ nodeindex = int(loc.x * self._xscale)
+ powerup.scenenodeid = nodeindex
+ self._nodes[nodeindex].spaceobjects.append(powerup)
+
#and finally add the player to the scene
self.addObjectToScene(self._player)
@@ -281,12 +307,15 @@
if obj.type != SHTR_PLAYER and obj.type != SHTR_PROJECTILE:
if obj.running and obj.boundingbox.intersects(self._player.boundingbox):
- #player touched an enemy. Destroy player and
- #re-initialize scene
- if not self._player.invulnerable:
- #collision damage of 1
- self.playerHit(1)
- obj.applyHit(1)
+ if obj.type == SHTR_ENEMYSHIP:
+ #player touched an enemy. Destroy player and
+ #re-initialize scene
+ if not self._player.invulnerable:
+ #collision damage of 1
+ self.playerHit(1)
+ obj.applyHit(1)
+ elif obj.type == SHTR_POWERUP:
+ obj.applyPowerUp(self._player)
elif obj.type == SHTR_PROJECTILE:
@@ -301,7 +330,7 @@
for o in pcollide:
#cant get hit by your own bullet
- if obj.owner != o and o.type != SHTR_PROJECTILE:
+ if obj.owner != o and o.type != SHTR_PROJECTILE and o.type != SHTR_POWERUP:
if o.running and obj.boundingbox.intersects(o.boundingbox):
if o != self._player and obj.owner.type == SHTR_PLAYER:
o.applyHit(obj.damage)
diff -r 41f7754f2a4b -r ab28994820dd demos/shooter/scripts/ships/enemies.py
--- a/demos/shooter/scripts/ships/enemies.py Thu Apr 22 21:04:13 2010 +0000
+++ b/demos/shooter/scripts/ships/enemies.py Fri Apr 23 17:17:02 2010 +0000
@@ -50,7 +50,7 @@
class Saucer1(Ship):
def __init__(self, scene, name, instance, findInstance=True):
super(Saucer1, self).__init__(scene, name, findInstance)
- self._instance = instance
+ self.instance = instance
self._type = SHTR_ENEMYSHIP
self._dir = 0
self._time = 500
@@ -90,7 +90,7 @@
class Saucer2(Ship):
def __init__(self, scene, name, instance, findInstance=True):
super(Saucer2, self).__init__(scene, name, findInstance)
- self._instance = instance
+ self.instance = instance
self._type = SHTR_ENEMYSHIP
self._dir = 0
self._time = 1000
@@ -133,7 +133,7 @@
class DiagSaucer(Ship):
def __init__(self, scene, name, direction, instance, findInstance=True):
super(DiagSaucer, self).__init__(scene, name, findInstance)
- self._instance = instance
+ self.instance = instance
self._type = SHTR_ENEMYSHIP
self.width = 0.2
self.height = 0.075
@@ -161,7 +161,7 @@
class Streaker(Ship):
def __init__(self, scene, name, instance, findInstance=True):
super(Streaker, self).__init__(scene, name, findInstance)
- self._instance = instance
+ self.instance = instance
self._type = SHTR_ENEMYSHIP
self.width = 0.2
self.height = 0.2
@@ -196,7 +196,7 @@
class Boss(Ship):
def __init__(self, scene, name, instance, findInstance=True):
super(Boss, self).__init__(scene, name, findInstance)
- self._instance = instance
+ self.instance = instance
self._type = SHTR_LASTBOSS
self.width = 0.85
self.height = 0.25
diff -r 41f7754f2a4b -r ab28994820dd demos/shooter/scripts/ships/player.py
--- a/demos/shooter/scripts/ships/player.py Thu Apr 22 21:04:13 2010 +0000
+++ b/demos/shooter/scripts/ships/player.py Fri Apr 23 17:17:02 2010 +0000
@@ -65,7 +65,6 @@
#give player the default weapon (the cannon)
self.weapon = Cannon(self._scene, self, 200)
-
def _getScore(self):
return self._score
@@ -92,7 +91,10 @@
#50 is defined in the players "flash" animation file
#2 is the number of frames in the animation
#TODO: read these values somehow from the animation
- number = (milliseconds / 50) / 2
+ number = int((milliseconds / 50) / 2)
+
+ if number <= 0:
+ return
self._invulnerable = True
self.flash(number)
@@ -178,28 +180,36 @@
if not self._boundingBox.intersects(camrect):
if (self._boundingBox.x + self._boundingBox.w) < camrect.x:
- self._velocity.x = 0
+ if self._velocity.x < 0:
+ self._velocity.x = 0
pos.x += (camrect.x - (self._boundingBox.x + self._boundingBox.w))/self._xscale + 0.03
- pos.y += self._velocity.y * (self._scene.timedelta/1000.0)/self._yscale
+
+ if not ((self._boundingBox.y + self._boundingBox.h) < camrect.y) and not (self._boundingBox.y > (camrect.y + camrect.h)):
+ pos.y += self._velocity.y * (self._scene.timedelta/1000.0)/self._yscale
+
oldpos.setExactLayerCoordinates(pos)
-
-# elif (bbox.y + bbox.h) < camrect.y or (bbox.y - bbox.h) > camrect.y:
-# pos.x += self._velocity.x * (timedelta/1000.0)
-# oldpos.setExactLayerCoordinates(pos)
-# self._velocity.y = 0
- elif (self._boundingBox.y + self._boundingBox.h) < camrect.y or self._boundingBox.y > (camrect.y + camrect.h):
+ if self._boundingBox.x > ( camrect.x + camrect.w ):
+ self._velocity.x = 0
+
+ if (self._boundingBox.y + self._boundingBox.h) < camrect.y:
+ if self._velocity.y < 0:
+ self._velocity.y = 0
pos.x += self._velocity.x * (self._scene.timedelta/1000.0)/self._xscale
- self._velocity.y = 0
+ oldpos.setExactLayerCoordinates(pos)
+ if self._boundingBox.y > (camrect.y + camrect.h):
+ if self._velocity.y > 0:
+ self._velocity.y = 0
+ pos.x += self._velocity.x * (self._scene.timedelta/1000.0)/self._xscale
oldpos.setExactLayerCoordinates(pos)
- else:
- self._velocity.x = 0
- self._velocity.y = 0
self.location = oldpos
def _getLives(self):
return self._lives
+ def _setLives(self, lives):
+ self._lives = lives
+
def _getInvulnerable(self):
return self._invulnerable
@@ -207,5 +217,5 @@
self._invulnerable = inv
score = property(_getScore)
- lives = property(_getLives)
+ lives = property(_getLives, _setLives)
invulnerable = property(_getInvulnerable, _setInvulnerable)
\ No newline at end of file
diff -r 41f7754f2a4b -r ab28994820dd demos/shooter/scripts/weapons.py
--- a/demos/shooter/scripts/weapons.py Thu Apr 22 21:04:13 2010 +0000
+++ b/demos/shooter/scripts/weapons.py Fri Apr 23 17:17:02 2010 +0000
@@ -232,4 +232,48 @@
self._scene.addObjectToScene(pjctl7)
self._lastfired = self._scene.time
+
+class CannonSpread5(Weapon):
+ def __init__(self, scene, ship, firerate):
+ super(CannonSpread5, self).__init__(scene, ship, firerate)
+
+ self._projectileVelocity = 1
+
+ def fire(self, direction):
+
+ if (self._scene.time - self._lastfired) > self._firerate:
+ velocity = normalize(direction)
+ velocity.x = velocity.x * self._projectileVelocity
+ velocity.y = velocity.y * self._projectileVelocity
+ origin = fife.DoublePoint(0,0)
+
+ p2 = rotatePoint(origin, velocity, -10)
+ p3 = rotatePoint(origin, velocity, -5)
+ p4 = rotatePoint(origin, velocity, 0)
+ p5 = rotatePoint(origin, velocity, 5)
+ p6 = rotatePoint(origin, velocity, 10)
+
+ pjctl2 = Projectile(self._scene, self._ship, "bullet1", 3000 )
+ pjctl2.run(p2, self._ship.location)
+ self._scene.addObjectToScene(pjctl2)
+
+ pjctl3 = Projectile(self._scene, self._ship, "bullet1", 3000 )
+ pjctl3.run(p3, self._ship.location)
+ self._scene.addObjectToScene(pjctl3)
+
+ pjctl4 = Projectile(self._scene, self._ship, "bullet1", 3000 )
+ pjctl4.run(p4, self._ship.location)
+ self._scene.addObjectToScene(pjctl4)
+
+ pjctl5 = Projectile(self._scene, self._ship, "bullet1", 3000 )
+ pjctl5.run(p5, self._ship.location)
+ self._scene.addObjectToScene(pjctl5)
+
+ pjctl6 = Projectile(self._scene, self._ship, "bullet1", 3000 )
+ pjctl6.run(p6, self._ship.location)
+ self._scene.addObjectToScene(pjctl6)
+
+
+ self._lastfired = self._scene.time
+