# HG changeset patch # User Simon Cross # Date 1302351945 -7200 # Node ID 02bf05964619e6259dbd6d6f97aacefc851b00aa # Parent 75dc259b41f5c9daa6a481b857db86d9aee07a4e FIREBALLS! diff -r 75dc259b41f5 -r 02bf05964619 skaapsteker/sprites/base.py --- 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) diff -r 75dc259b41f5 -r 02bf05964619 skaapsteker/sprites/player.py --- 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): diff -r 75dc259b41f5 -r 02bf05964619 skaapsteker/sprites/projectiles.py --- 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)