changeset 362:02bf05964619

FIREBALLS!
author Simon Cross <hodgestar@gmail.com>
date Sat, 09 Apr 2011 14:25:45 +0200
parents 75dc259b41f5
children 5e4e1432565a
files skaapsteker/sprites/base.py skaapsteker/sprites/player.py skaapsteker/sprites/projectiles.py
diffstat 3 files changed, 35 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/skaapsteker/sprites/base.py	Sat Apr 09 14:22:04 2011 +0200
+++ b/skaapsteker/sprites/base.py	Sat Apr 09 14:25:45 2011 +0200
@@ -19,7 +19,7 @@
 PC_LAYER = 0
 MONSTER_LAYER = 1
 NPC_LAYER = 2
-
+PROJECTILE_LAYER = 3
 
 
 class GameSprite(Sprite):
@@ -141,7 +141,7 @@
 class Monster(AnimatedGameSprite):
 
     collision_layer = MONSTER_LAYER
-    collides_with = set([PC_LAYER])
+    collides_with = set([PC_LAYER, PROJECTILE_LAYER])
 
     debug_color = (240, 120, 120)
 
@@ -207,6 +207,7 @@
 class NPC(AnimatedGameSprite):
 
     collision_layer = NPC_LAYER
+    collides_with = set([])
 
     debug_color = (240, 240, 240)
     bounce_factor = (0, 0)    #  NPC's don't bounce by default
@@ -227,8 +228,30 @@
 
 
 class Projectile(AnimatedGameSprite):
+
+    collision_layer = PROJECTILE_LAYER
+    collides_with = set()
+
     gravitates = False
 
+    DAMAGE = 10
+
+    def setup(self, hits):
+        if isinstance(hits, tuple):
+            self.hits = hits + (Geography,)
+        else:
+            self.hits = (hits, Geography)
+
+    def explode(self):
+        self.kill()
+
+    def collided(self, other):
+        if not isinstance(other, self.hits):
+            return
+        if hasattr(other, 'damage'):
+            other.damage(self.DAMAGE)
+        self.explode()
+
 
 class Item(GameSprite):
     mobile = False
@@ -263,7 +286,7 @@
 class Geography(Sprite):
     mobile = False
     gravitates = False
-    collides_with = set([PC_LAYER, MONSTER_LAYER, NPC_LAYER])
+    collides_with = set([PC_LAYER, MONSTER_LAYER, NPC_LAYER, PROJECTILE_LAYER])
     is_ground = True
     actionable = False
     bounce_factor = (0.0, 0.0)
--- a/skaapsteker/sprites/player.py	Sat Apr 09 14:22:04 2011 +0200
+++ b/skaapsteker/sprites/player.py	Sat Apr 09 14:25:45 2011 +0200
@@ -3,7 +3,7 @@
 import pygame.transform
 import time
 
-from ..sprites.base import find_sprite, TILE_SIZE, PC_LAYER, MONSTER_LAYER
+from ..sprites.base import find_sprite, Monster, TILE_SIZE, PC_LAYER, MONSTER_LAYER, PROJECTILE_LAYER
 from ..sprites.projectiles import Fireball
 from ..physics import Sprite
 from ..constants import Layers, FoxHud
@@ -14,7 +14,7 @@
 class Player(Sprite):
 
     collision_layer = PC_LAYER
-    collides_with = set([MONSTER_LAYER])
+    collides_with = set([MONSTER_LAYER, PROJECTILE_LAYER])
     wants_updates = True
 
     block = True
@@ -277,7 +277,7 @@
             pos = pygame.Rect(self.rect.midleft, (0, 0))
         else:
             pos = pygame.Rect(self.rect.midright, (0, 0))
-        fireball = Fireball(pos, direction=self.facing)
+        fireball = Fireball(pos, direction=self.facing, hits=Monster)
         AddSpriteEvent.post(fireball)
 
     def _lightning_attack(self):
--- a/skaapsteker/sprites/projectiles.py	Sat Apr 09 14:22:04 2011 +0200
+++ b/skaapsteker/sprites/projectiles.py	Sat Apr 09 14:25:45 2011 +0200
@@ -20,17 +20,17 @@
     }
 
     FIREBALL_WIDTH = 60 # pixels
+    VELOCITY = (300, -1000) # pps
 
-    def setup(self, direction):
+    def setup(self, direction, **opts):
+        super(Fireball, self).setup(**opts)
         self.facing = direction
         if self.facing == "left":
             shift = (-self.FIREBALL_WIDTH / 2, 0)
+            dv = (-self.VELOCITY[0], self.VELOCITY[1])
         else:
             shift = (self.FIREBALL_WIDTH / 2, 0)
+            dv = (self.VELOCITY[0], self.VELOCITY[1])
         self.rect.move_ip(shift)
         self.collide_rect.move_ip(shift)
-
-    def collided_player(self, player):
-        print "%s went boom with player" % self
-
-
+        self.deltav(dv)