Mercurial > qq-pygrafix
changeset 13:320ce875b24d
cache tiles
| author | Radomir Dopieralski <moindev@sheep.art.pl> |
|---|---|
| date | Thu, 28 Aug 2008 11:24:14 +0200 |
| parents | 57b9256be7b8 |
| children | 441252535ee9 |
| files | qq.py |
| diffstat | 1 files changed, 40 insertions(+), 55 deletions(-) [+] |
line wrap: on
line diff
--- a/qq.py Thu Aug 28 10:39:40 2008 +0200 +++ b/qq.py Thu Aug 28 11:24:14 2008 +0200 @@ -6,58 +6,36 @@ import pygame from pygame.locals import * -pygame.init() -pygame.display.set_mode((424, 400)) -font = pygame.font.Font("MgOpenModataBold.ttf", 11) # Motion offsets for particular directions # N E S W DX = [0, 1, 0, -1] DY = [-1, 0, 1, 0] -def load_tiles(filename, width=32, height=None): - if height is None: - height = width - image = pygame.image.load(filename).convert() - image_width, image_height = image.get_size() - tiles = [] - for x in range(0, image_width/width): - line = [] - tiles.append(line) - for y in range(0, image_height/height): - line.append(image.subsurface((x*width, y*height, width, height))) - return tiles -class Message: - image = pygame.image.load("dialog.png").convert() - image.set_alpha(192) +class TileCache: + def __init__(self): + self.cache = {} - def __init__(self, text): - self.screen = pygame.display.get_surface() - self.text = text - self.rect = self.image.get_rect() - self.rect.midtop = self.screen.get_rect().midtop - self.rect.move_ip(0, 8) - - def show(self): - self.screen.blit(self.image, self.rect) - for lineno, line in enumerate(self.text.split('\n')): - image = font.render(line, True, (0xFF, 0xFF, 0xFF)) - shadow = font.render(line, True, (0x22, 0x22, 0x66)) - rect = image.get_rect() - rect.topleft = self.rect.topleft - rect.move_ip(8, 8+lineno*font.get_linesize()) - shadow_rect = rect.move(2, 2) - self.screen.blit(shadow, shadow_rect) - self.screen.blit(image, rect) - pygame.display.flip() - while True: - event = pygame.event.wait() - if event.type == QUIT: - return - elif event.type == KEYDOWN: - return - + def __call__(self, filename, width=32, height=None): + if height is None: + height = width + key = (filename, width, height) + try: + return self.cache[key] + except: + pass + image = pygame.image.load(filename).convert() + image_width, image_height = image.get_size() + tiles = [] + for x in range(0, image_width/width): + line = [] + tiles.append(line) + for y in range(0, image_height/height): + line.append(image.subsurface((x*width, y*height, width, + height))) + self.cache[key] = tiles + return tiles class SortedUpdates(pygame.sprite.RenderUpdates): def sprites(self): @@ -67,10 +45,9 @@ class Shadow(pygame.sprite.Sprite): - image = pygame.image.load("shadow.png").convert() - image.set_alpha(64) - def __init__(self, sprite): + self.image = tiles("shadow.png", 24, 24)[0][0] + self.image.set_alpha(64) pygame.sprite.Sprite.__init__(self) self.rect = self.image.get_rect() self.sprite = sprite @@ -116,27 +93,31 @@ Stairs = 4 class Skeleton(Sprite): - frames = load_tiles("skeleton.png") - + def __init__(self, pos): + self.frames = tiles("skeleton.png") + Sprite.__init__(self, pos) class Crate(Sprite): - frames = load_tiles("box.png") + def __init__(self, pos): + self.frames = tiles("box.png") + Sprite.__init__(self, pos) class House(Sprite): - frames = load_tiles("house.png") + def __init__(self, pos): + self.frames = tiles("house.png") + Sprite.__init__(self, pos) class Player(Sprite): - frames = load_tiles("player.png") is_player = True def __init__(self, pos=(1, 1)): - Sprite.__init__(self) + self.frames = tiles("player.png") + Sprite.__init__(self, pos) self.direction = 2 self.animation = None self.image = self.frames[self.direction][0] - self.pos = pos self.rect.move_ip((0, 1)) def walk_animation(self): @@ -169,7 +150,7 @@ value = parser.get("level", option).strip() self.key[option[1]] = getattr(Items, value.capitalize()) tile_width, tile_height = 24, 16 - self.tiles = load_tiles(parser.get("level", "tileset"), + self.tiles = tiles(parser.get("level", "tileset"), tile_width, tile_height) width = len(self.map[0]) height = len(self.map) @@ -306,4 +287,8 @@ if __name__ == "__main__": + pygame.init() + pygame.display.set_mode((424, 400)) + font = pygame.font.Font("MgOpenModataBold.ttf", 11) + tiles = TileCache() Game().main()
