# HG changeset patch # User Jeremy Thurgood # Date 1301850951 -7200 # Node ID 38d2f7c43d869d104c8fe1784bb4effaabdb87ce # Parent e6d912306658f44c090ebbd641f99049fb2e998d Sprite-based tiles. \o/ diff -r e6d912306658 -r 38d2f7c43d86 scripts/level-editor --- a/scripts/level-editor Sun Apr 03 19:05:56 2011 +0200 +++ b/scripts/level-editor Sun Apr 03 19:15:51 2011 +0200 @@ -43,9 +43,9 @@ return position[0] = max(position[0], 0) - position[0] = min(position[0], level.level_size[0] - SCREEN[0]) + position[0] = min(position[0], level.pixel_size[0] - SCREEN[0]) position[1] = max(position[1], 0) - position[1] = min(position[1], level.level_size[1] - SCREEN[1]) + position[1] = min(position[1], level.pixel_size[1] - SCREEN[1]) level.draw(surface, position) pygame.display.flip() diff -r e6d912306658 -r 38d2f7c43d86 skaapsteker/level.py --- a/skaapsteker/level.py Sun Apr 03 19:05:56 2011 +0200 +++ b/skaapsteker/level.py Sun Apr 03 19:15:51 2011 +0200 @@ -4,17 +4,7 @@ import data from sprites import enemies -from sprites.base import find_sprite - - -TILE_SIZE = (64, 64) - - -class Tile(object): - "This is temporary until we have a proper tile class." - - def __init__(self, tilefile): - self.image = data.load_image(tilefile) +from sprites.base import TILE_SIZE, find_sprite, Geography @@ -23,17 +13,18 @@ self.dirname = 'tiles/' + dirname - def get_tile(self, tilechar): - tilefile = self.dirname + '/' + self.char_to_name(tilechar) - return Tile(tilefile) + def get_tile(self, tilechar, pos): + return Geography(pos, self.get_image(tilechar)) - def char_to_name(self, tilechar): - return { + def get_image(self, tilechar): + image_name = { '.': 'blank.png', '-': 'floor.png', 'X': 'solid.png', }[tilechar] + image_file = self.dirname + '/' + image_name + return data.load_image(image_file) @@ -55,10 +46,15 @@ def build_tiles(self): self.tileset = TileSet(self.level_data['tileset']) self.tiles = [] - for row in self.level_data['tiles']: - self.tiles.append([self.tileset.get_tile(char) for char in row]) - self.level_size = (len(self.tiles[0]) * TILE_SIZE[0], len(self.tiles) * TILE_SIZE[1]) - print "level:", self.level_size + tile_data = self.level_data['tiles'] + self.tile_size = (len(tile_data[0]), len(tile_data)) + self.pixel_size = (self.tile_size[0] * TILE_SIZE[0], self.tile_size[1] * TILE_SIZE[1]) + for y, row in enumerate(tile_data): + for x, char in enumerate(row): + tile = self.tileset.get_tile(char, (x, y)) + if tile: + self.tiles.append(tile) + print "level:", self.tile_size, self.pixel_size def setup_enemies(self): @@ -72,15 +68,12 @@ self.sprites.append(find_sprite(sprite_desc)) print self.sprites - def tile_pos(self, x, y): - return (x * TILE_SIZE[0], y * TILE_SIZE[1]) - def get_background_pos(self, pos, display_size): bg_scalable_x = self.background_size[0] - display_size[0] bg_scalable_y = self.background_size[1] - display_size[1] - lev_scalable_x = self.level_size[0] - display_size[0] - lev_scalable_y = self.level_size[1] - display_size[1] + lev_scalable_x = self.pixel_size[0] - display_size[0] + lev_scalable_y = self.pixel_size[1] - display_size[1] scaled_x = (pos[0] * bg_scalable_x) / lev_scalable_x scaled_y = (pos[1] * bg_scalable_y) / lev_scalable_y return (scaled_x, scaled_y) @@ -92,11 +85,10 @@ def draw_tiles(self, surface, pos): - whole_level = Surface(self.level_size, flags=constants.SRCALPHA) - for y, row in enumerate(self.tiles): - for x, tile in enumerate(row): - whole_level.blit(tile.image, self.tile_pos(x, y)) - surface.blit(whole_level.subsurface(Rect(pos, surface.get_size())), (0, 0)) + colliderect = surface.get_rect().move(pos) + for tile in self.tiles: + if colliderect.colliderect(tile.rect): + surface.blit(tile.image, (tile.rect.left - pos[0], tile.rect.top - pos[1])) def draw(self, surface, pos): diff -r e6d912306658 -r 38d2f7c43d86 skaapsteker/sprites/base.py --- a/skaapsteker/sprites/base.py Sun Apr 03 19:05:56 2011 +0200 +++ b/skaapsteker/sprites/base.py Sun Apr 03 19:15:51 2011 +0200 @@ -1,8 +1,13 @@ """Basic sprite classes.""" +from pygame import Rect + from skaapsteker.physics import Sprite +TILE_SIZE = (64, 64) + + class Monster(Sprite): def __init__(self, pos, **opts): Sprite.__init__(self) @@ -36,6 +41,14 @@ gravitates = False + def __init__(self, pos, image): + Sprite.__init__(self) + self.tile_pos = pos + self.image = image + self.rect = Rect((pos[0] * TILE_SIZE[0], pos[1] * TILE_SIZE[1]), TILE_SIZE) + + + def find_sprite(descr): """Create a sprite object from a dictionary describing it.""" descr = descr.copy() @@ -45,3 +58,4 @@ mod = __import__(mod_name, fromlist=[cls_name]) cls = getattr(mod, cls_name) return cls(**descr) +