# 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 +