Mercurial > qq-pygrafix
changeset 9:31534af99229
walls with overlays
| author | Radomir Dopieralski <moindev@sheep.art.pl> |
|---|---|
| date | Wed, 27 Aug 2008 18:11:36 +0200 |
| parents | 8d647cfd6115 |
| children | b87fd9e8c365 |
| files | corridor.png dungeon.png level.map qq.py |
| diffstat | 4 files changed, 53 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- a/level.map Sun Aug 24 01:21:44 2008 +0200 +++ b/level.map Wed Aug 27 18:11:36 2008 +0200 @@ -4,16 +4,16 @@ \@: player \S: skeleton \b: crate -map: ############### +map: ###.########### #.......#.#.#.# #......#.#.#.## #...@.......#.# #......s...#.## - #...........#.# + #...........#.. ##.#.#.#...#.## #.#.#.#.....#.# ##.#.b.#......# - #..........s..# + ...........s..# ##.##.###.....# #..##.###...#.# ##.##.###....##
--- a/qq.py Sun Aug 24 01:21:44 2008 +0200 +++ b/qq.py Wed Aug 27 18:11:36 2008 +0200 @@ -109,8 +109,6 @@ self.animation.next() - - class Skeleton(Sprite): frames = load_tiles("skeleton.png") @@ -162,7 +160,7 @@ 'wall': 0, 'floor': 1, 'skeleton': Skeleton, - 'crate': Crate + 'crate': Crate, } def __init__(self, filename="level.map"): parser = ConfigParser.ConfigParser() @@ -174,29 +172,58 @@ if option.startswith('\\'): self.key[option[1]] = parser.get("level", option).strip() tile_width, tile_height = 24, 16 - tiles = load_tiles("corridor.png", tile_width, tile_height) + self.tiles = load_tiles("dungeon.png", tile_width, tile_height) width = len(self.map[0]) height = len(self.map) self.image = pygame.Surface((width*tile_width, height*tile_height)) + self.overlays = {} y = 0 for line in self.map: x = 0 for c in line: tile = self.item_names[self.key[c]] - if tile != 0: - self.image.blit(tiles[0][0], (x*tile_width, y*tile_height)) - elif y > 1 and self.get(x, y-1) != 'wall': - self.image.blit(tiles[0][1], (x*tile_width, y*tile_height)) + if tile: + self.image.blit(self.tiles[0][3], (x*tile_width, y*tile_height)) + else: + if self(x, y+1): + if self(x+1, y) and self(x-1, y): + tile_image = self.tiles[3][2] + elif self(x+1, y): + tile_image = self.tiles[2][2] + elif self(x-1, y): + tile_image = self.tiles[0][2] + else: + tile_image = self.tiles[1][2] + else: + if self(x+1, y+1) and self(x-1, y+1): + tile_image = self.tiles[3][1] + elif self(x+1, y+1): + tile_image = self.tiles[2][1] + elif self(x-1, y+1): + tile_image = self.tiles[0][1] + else: + tile_image = self.tiles[1][1] + self.image.blit(tile_image, (x*tile_width, y*tile_height)) + if self(x, y-1): + if self(x+1, y) and self(x-1, y): + overlay_image = self.tiles[3][0] + elif self(x+1, y): + overlay_image = self.tiles[2][0] + elif self(x-1, y): + overlay_image = self.tiles[0][0] + else: + overlay_image = self.tiles[1][0] + self.overlays[(x, y)] = overlay_image if tile != 1 and tile != 0: self.items[(x, y)] = tile x += 1 y += 1 - def get(self, x, y): + def __call__(self, x, y): try: - return self.key[self.map[y][x]] + return self.item_names[self.key[self.map[y][x]]] except IndexError: - return 'wall' + return None def draw(self, surface): surface.blit(self.image, (0, 0)) @@ -212,13 +239,19 @@ def use_level(self, level): self.shadows = pygame.sprite.RenderUpdates() self.sprites = SortedUpdates() + self.overlays = pygame.sprite.RenderUpdates() self.level = level - for pos, kind in self.level.items.iteritems(): + for pos, kind in level.items.iteritems(): item = kind(pos) if kind == Player: self.player = item self.sprites.add(item) self.shadows.add(Shadow(item)) + for pos, image in level.overlays.iteritems(): + x, y = pos + overlay = pygame.sprite.Sprite(self.overlays) + overlay.image = image + overlay.rect = image.get_rect().move(x*24, y*16-16) self.background = self.level.image.copy() def control(self): @@ -228,7 +261,7 @@ def walk(d): x, y = self.player.pos self.player.direction = d - if self.level.get(x+DX[d], y+DY[d]) != 'wall': + if self.level(x+DX[d], y+DY[d]): self.player.animation = self.player.walk_animation() if pressed(K_UP): walk(0) @@ -243,6 +276,7 @@ def main(self): clock = pygame.time.Clock() self.screen.blit(self.background, (0, 0)) + self.overlays.draw(self.screen) pygame.display.flip() while not self.game_over: self.sprites.clear(self.screen, self.background) @@ -252,8 +286,9 @@ self.control() self.player.update() self.shadows.update() - dirty = self.shadows.draw(self.screen) - dirty += self.sprites.draw(self.screen) + self.shadows.draw(self.screen) + dirty = self.sprites.draw(self.screen) + self.overlays.draw(self.screen) pygame.display.update(dirty) clock.tick(15) for event in pygame.event.get():
