Mercurial > dw
changeset 15:930de4ac220d
Added attacking
| author | Radomir Dopieralski <moindev@sheep.art.pl> |
|---|---|
| date | Mon, 17 Dec 2007 03:16:11 +0100 |
| parents | ba58ad1eae95 |
| children | f51dc2d85927 |
| files | data/map.txt lib/game.py lib/level.py lib/mesg.py monster/__init__.py monster/jello.py monster/player.py |
| diffstat | 7 files changed, 86 insertions(+), 28 deletions(-) [+] |
line wrap: on
line diff
--- a/data/map.txt Mon Dec 17 02:14:14 2007 +0100 +++ b/data/map.txt Mon Dec 17 03:16:11 2007 +0100 @@ -6,7 +6,7 @@ S <floor.png> <jello> B <floor.png> <jello> Z <floor.png> <jello> -& <floor.png> <jello> +& <floor.png> <crate> @ <floor.png> <player> ::::::XXXXXXXXXXXXXX
--- a/lib/game.py Mon Dec 17 02:14:14 2007 +0100 +++ b/lib/game.py Mon Dec 17 03:16:11 2007 +0100 @@ -5,6 +5,7 @@ from util import * from level import Level from mesg import Mesg +from monster import MoveError, MoveBump, MoveBlocked class Game: def __init__(self): @@ -17,10 +18,13 @@ self.level = Level(os.path.join('data', 'map.txt')) def try_walk(self, d): - av = self.level.player - if self.level.map.is_blocked(av.x+delta_x[d], av.y+delta_y[d]): - return - av.walk(d) + try: + try: + self.level.player.walk(d) + except MoveBump, bump: + self.level.player.attack(d, bump.monster) + except MoveError: + self.level.animations.add(Mesg(sprite=self.level.player, text="blocked")) def main_loop(self): self.level.refresh(self.screen)
--- a/lib/level.py Mon Dec 17 02:14:14 2007 +0100 +++ b/lib/level.py Mon Dec 17 03:16:11 2007 +0100 @@ -39,9 +39,7 @@ image = self.get_image(os.path.join('image', urls[0])) background.blit(image , (x*24+48, y*16+32)) for url in urls[1:]: - monster = self.create_monster(x,y, url) - if url=='player': - self.player = monster + self.create_monster(x,y, url) x += 1 x = 0 y += 1 @@ -49,12 +47,7 @@ def create_monster(self, x, y, kind): module = __import__("monster.%s" % kind, globals(), {}, ["Mob"]) - monster = module.Mob(x, y) - monster.shadow = Shadow(monster) - self.monster = self - self.add_sprite(monster) - self.add_sprite(monster.shadow) - self.monsters[(x,y)] = monster + monster = module.Mob((x, y), self) return monster def add_sprite(self, sprite):
--- a/lib/mesg.py Mon Dec 17 02:14:14 2007 +0100 +++ b/lib/mesg.py Mon Dec 17 03:16:11 2007 +0100 @@ -14,14 +14,16 @@ def __init__(self, x=0, y=0, text="Hello!", color=(255, 255, 255), sprite=None): pygame.sprite.Sprite.__init__(self) self.x = x - self.y = y + self.y = y self.z = y*16-8 self.dh = 10 self.image = font.render(text, False, color).convert() self.alpha = 255 self.rect = Rect(0,0, self.image.get_width(), self.image.get_height()) self.rect.center = (self.x*24+12+48, self.y*16-8+32) - if sprite: self.rect.center = sprite.rect.center + if sprite: + self.rect.center = sprite.rect.center + self.z = sprite.z+1 def update(self): if self.alpha <= 0:
--- a/monster/__init__.py Mon Dec 17 02:14:14 2007 +0100 +++ b/monster/__init__.py Mon Dec 17 03:16:11 2007 +0100 @@ -2,22 +2,69 @@ from pygame.locals import * import os + +from shadow import Shadow from util import * +class MoveError(Exception): + pass + +class MoveBump(MoveError): + def __init__(self, pos, monster): + self.pos = pos + self.monster = monster + + def __repr__(self): + return "bump (%d, %d), %s" % (self.pos[0], self.pos[1], repr(self.monster)) + +class MoveBlocked(MoveError): + def __init__(self, pos): + self.pos = pos + + def __repr__(self): + return "block (%d, %d)" % (self.pos[0], self.pos[1]) + + class Monster(pygame.sprite.Sprite): '''Monsters only have two frames of animation.''' - def __init__(self, x=0, y=0, image_file="monster.png"): + def __init__(self, pos, level, image_file="monster.png"): pygame.sprite.Sprite.__init__(self) self.frame = 0 self.delay = 0 - self.x = x - self.y = y + self.level = level + self.x, self.y = pos + self.place(pos) + self.frames = read_frames(os.path.join("image", image_file)) + self.anim = self.frames[0] + self.shadow = Shadow(self) + self.level.add_sprite(self) + self.level.add_sprite(self.shadow) + self.shadow.update() + self.update() + + def place(self, pos): + x, y = pos + self.move(pos) self.z = y*16-12 self.rect = Rect(self.x*24+48, self.z+32, 24, 24) - self.frames = read_frames(os.path.join("image", image_file)) - self.anim = self.frames[0] - self.update() + try: + self.shadow.update() + except AttributeError: + pass + + def move(self, pos): + x, y = pos + if self.level.map.is_blocked(x,y): + raise MoveBlocked(pos) + if self.level.monsters.get(pos, None): + raise MoveBump(pos, self.level.monsters[pos]) + try: + del self.level.monsters[(self.x, self.y)] + except KeyError: + pass + self.x, self.y = pos + self.level.monsters[pos] = self def animate(self, delay=0): '''Change the frame of animation''' @@ -31,5 +78,12 @@ self.delay += 1 self.image = self.anim[self.frame] + def die(self): + try: + self.shadow.kill() + except AttributeError: + pass + self.kill() + def update(self): self.animate(3)
--- a/monster/jello.py Mon Dec 17 02:14:14 2007 +0100 +++ b/monster/jello.py Mon Dec 17 03:16:11 2007 +0100 @@ -4,8 +4,8 @@ from monster import Monster class Mob(Monster): - def __init__(self, x, y): - Monster.__init__(self, x, y, "jello.png") + def __init__(self, pos, level): + Monster.__init__(self, pos, level, "jello.png") def update(self): self.animate(3)
--- a/monster/player.py Mon Dec 17 02:14:14 2007 +0100 +++ b/monster/player.py Mon Dec 17 03:16:11 2007 +0100 @@ -2,13 +2,15 @@ from pygame.locals import * from monster import Monster +from mesg import Mesg from util import * class Mob(Monster): - def __init__(self, x, y): + def __init__(self, pos, level): self.facing = 0 self.step = 0 - Monster.__init__(self, x, y, "abi2.png") + Monster.__init__(self, pos, level, "abi2.png") + self.level.player = self def update(self): if self.step>0: @@ -25,6 +27,9 @@ def walk(self, direction): self.facing = direction + self.move((self.x+delta_x[self.facing],self.y+delta_y[self.facing])) self.step = 8 - self.x += delta_x[self.facing] - self.y += delta_y[self.facing] + + def attack(self, direction, monster): + self.level.animations.add(Mesg(sprite=monster, text="miss", color=(255,255,0))) +
