Mercurial > pavulon
changeset 15:d8731b40e57e
move item definitions to the level file
| author | Radomir Dopieralski <moindev@sheep.art.pl> |
|---|---|
| date | Thu, 28 Aug 2008 14:07:12 +0200 |
| parents | 441252535ee9 |
| children | 4223254474e1 |
| files | box.png crate.png level.map qq.py |
| diffstat | 4 files changed, 93 insertions(+), 87 deletions(-) [+] |
line wrap: on
line diff
--- a/level.map Thu Aug 28 12:10:21 2008 +0200 +++ b/level.map Thu Aug 28 14:07:12 2008 +0200 @@ -1,38 +1,58 @@ [level] -tileset: ground.png -map:###.########### - #.......#.#.#.# - #.>....#.#.h.## - #...@.......#.# - #......s...#.## - #.............. - ##.#.#.#...#.## - #...........#.# - ##.#.#.#......# - ...........s..# - ##.##.###..b..# - #..##.###.bb#.# - ##.##.###....## - #.....###...#.# - ############### +tileset = ground.png +map = ###.########### + #.......#.#.#.# + #.>....#.#.h.## + #...@.......#.# + #......s...#.## + #.............. + ##.#.#.#...#.## + #...........#.# + ##.#.#.#......# + ...........s..# + ##.##.###..b..# + #..##.###.bb#.# + ##.##.###....## + #.....###...#.# + ############### [#] -name: wall +name = wall +tile = 0, 0 +pass = false +wall = true [.] -name: floor +name = floor +pass = true +tile = 0, 3 [@] -name: player +name = player +pass = true +tile = 0, 3 +player = true +sprite = player.png [s] -name: skeleton +name = skeleton +pass = false +tile = 0, 3 +sprite = skeleton.png [>] -name: stairs +name = stairs +pass = true +tile = 3, 3 [b] -name: crate +name = crate +pass = false +tile = 0, 3 +sprite = crate.png [h] -name: house +name = house +tile = 0, 3 +pass = false +sprite = house.png
--- a/qq.py Thu Aug 28 12:10:21 2008 +0200 +++ b/qq.py Thu Aug 28 14:07:12 2008 +0200 @@ -59,8 +59,10 @@ class Sprite(pygame.sprite.Sprite): is_player = False - def __init__(self, pos=(0, 0)): + def __init__(self, pos=(0, 0), frames=None): pygame.sprite.Sprite.__init__(self) + if frames: + self.frames = frames self.image = self.frames[0][0] self.rect = self.image.get_rect() self.animation = self.stand_animation() @@ -87,57 +89,36 @@ def update(self): self.animation.next() -class Items: - """ Group all the item classes together.""" - Wall = 0 - Floor = 1 - Stairs = 4 - class Skeleton(Sprite): - def __init__(self, pos): - self.frames = tiles("skeleton.png") - Sprite.__init__(self, pos) +class Player(Sprite): + """ Display and animate the player character.""" + is_player = True - class Crate(Sprite): - def __init__(self, pos): - self.frames = tiles("box.png") - Sprite.__init__(self, pos) - - - class House(Sprite): - def __init__(self, pos): - self.frames = tiles("house.png") - Sprite.__init__(self, pos) - + def __init__(self, pos=(1, 1)): + self.frames = tiles("player.png") + Sprite.__init__(self, pos) + self.direction = 2 + self.animation = None + self.image = self.frames[self.direction][0] + # Move it on top of all other sprites on the same tile + self.rect.move_ip((0, 1)) - class Player(Sprite): - """ Display and animate the player character.""" - is_player = True - - def __init__(self, pos=(1, 1)): - self.frames = tiles("player.png") - Sprite.__init__(self, pos) - self.direction = 2 - self.animation = None - self.image = self.frames[self.direction][0] - self.rect.move_ip((0, 1)) + def walk_animation(self): + for frame in range(4): + self.image = self.frames[self.direction][frame] + yield None + self.move(3*DX[self.direction], 2*DY[self.direction]) + yield None + self.move(3*DX[self.direction], 2*DY[self.direction]) - def walk_animation(self): - for frame in range(4): - self.image = self.frames[self.direction][frame] - yield None - self.move(3*DX[self.direction], 2*DY[self.direction]) - yield None - self.move(3*DX[self.direction], 2*DY[self.direction]) - - def update(self): - if self.animation is None: - self.image = self.frames[self.direction][0] - else: - try: - self.animation.next() - except StopIteration: - self.animation = None + def update(self): + if self.animation is None: + self.image = self.frames[self.direction][0] + else: + try: + self.animation.next() + except StopIteration: + self.animation = None class Level: @@ -152,7 +133,7 @@ for section in parser.sections(): if len(section) == 1: value = parser.get(section, "name") - self.key[section] = getattr(Items, value.capitalize()) + self.key[section] = dict(parser.items(section)) tile_width, tile_height = 24, 16 self.tiles = tiles(parser.get("level", "tileset"), tile_width, tile_height) @@ -164,15 +145,17 @@ for line in self.map: x = 0 for c in line: - tile = self.key[c] - if tile: + if not self.key[c].get('wall', None): # floor - if isinstance(tile, int): - floor = tile - else: - floor = 1 - self.items[(x, y)] = tile((x, y)) - self.image.blit(self.tiles[floor-1][3], + if 'sprite' in self.key[c]: + self.items[(x, y)] = self.key[c] + try: + tile_x, tile_y = self.key[c]['tile'].split(',') + tile_x = int(tile_x) + tile_y = int(tile_y) + except ValueError, KeyError: + tile_x, tile_y = 0, 3 + self.image.blit(self.tiles[tile_x][tile_y], (x*tile_width, y*tile_height)) else: # wall @@ -211,8 +194,8 @@ def __call__(self, x, y): """ Tell what is at this position on the map.""" try: - return self.key[self.map[y][x]] - except IndexError: + return self.key[self.map[y][x]]['pass'] in ('true', 'yes', 'True', 'Yes', '1', 'on', 'On') + except (IndexError, AttributeError): return None def draw(self, surface): @@ -232,11 +215,14 @@ self.sprites = SortedUpdates() self.overlays = pygame.sprite.RenderUpdates() self.level = level - for pos, item in level.items.iteritems(): - if item.is_player: - self.player = item - self.sprites.add(item) - self.shadows.add(Shadow(item)) + for pos, tile in level.items.iteritems(): + if tile.get("player") in ('true', '1', 'yes', 'on'): + sprite = Player(pos) + self.player = sprite + else: + sprite = Sprite(pos, tiles(tile["sprite"])) + self.sprites.add(sprite) + self.shadows.add(Shadow(sprite)) for pos, image in level.overlays.iteritems(): x, y = pos overlay = pygame.sprite.Sprite(self.overlays)
