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()