changeset 35:38d2f7c43d86

Sprite-based tiles. \o/
author Jeremy Thurgood <firxen@gmail.com>
date Sun, 03 Apr 2011 19:15:51 +0200
parents e6d912306658
children 885e763bb118
files scripts/level-editor skaapsteker/level.py skaapsteker/sprites/base.py
diffstat 3 files changed, 38 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- 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()
--- 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):
--- 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)
+