changeset 40:fa1bb94cfa76

Re-factor drawing to blit to a clip rect in the One True Level Surface before blitting that to the screen.
author Simon Cross <hodgestar@gmail.com>
date Sun, 03 Apr 2011 20:24:47 +0200
parents 34038447be23
children 55bb5bb40873
files scripts/level-editor skaapsteker/level.py skaapsteker/levelscene.py
diffstat 3 files changed, 37 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/level-editor	Sun Apr 03 20:24:17 2011 +0200
+++ b/scripts/level-editor	Sun Apr 03 20:24:47 2011 +0200
@@ -19,8 +19,9 @@
 
 def run(levelname):
     clock = pygame.time.Clock()
-    surface = pygame.display.get_surface()
+    screen_surface = pygame.display.get_surface()
     level = Level(levelname)
+    level_surface = level.get_surface()
     position = [0, 0]
     while True:
         events = pygame.event.get()
@@ -47,7 +48,11 @@
         position[1] = max(position[1], 0)
         position[1] = min(position[1], level.pixel_size[1] - SCREEN[1])
 
-        level.draw(surface, position)
+        clip_rect = pygame.Rect(position, screen_surface.get_size())
+        level_surface.set_clip(clip_rect)
+        level.draw(level_surface)
+        screen_surface.blit(level_surface, (0, 0), area=clip_rect)
+
         pygame.display.flip()
         clock.tick(FRAMERATE)
 
--- a/skaapsteker/level.py	Sun Apr 03 20:24:17 2011 +0200
+++ b/skaapsteker/level.py	Sun Apr 03 20:24:47 2011 +0200
@@ -1,6 +1,8 @@
 import json
 
 from pygame import Rect, Surface, constants
+from pygame.sprite import Group
+from pygame.locals import SRCALPHA, HWSURFACE
 
 import data
 from sprites import enemies
@@ -45,7 +47,7 @@
 
     def build_tiles(self):
         self.tileset = TileSet(self.level_data['tileset'])
-        self.tiles = []
+        self.tiles = Group()
         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])
@@ -53,7 +55,7 @@
             for x, char in enumerate(row):
                 tile = self.tileset.get_tile(char, (x, y))
                 if tile:
-                    self.tiles.append(tile)
+                    self.tiles.add(tile)
         print "level:", self.tile_size, self.pixel_size
 
 
@@ -68,6 +70,9 @@
             self.sprites.append(find_sprite(sprite_desc))
         print self.sprites
 
+    def get_surface(self):
+        return Surface(self.pixel_size, flags=SRCALPHA)
+
 
     def get_background_pos(self, pos, display_size):
         bg_scalable_x = self.background_size[0] - display_size[0]
@@ -79,20 +84,18 @@
         return (scaled_x, scaled_y)
 
 
-    def draw_background(self, surface, pos):
-        bg_pos = self.get_background_pos(pos, surface.get_size())
-        surface.blit(self.background.subsurface(Rect(bg_pos, surface.get_size())), (0, 0))
+    def draw_background(self, surface):
+        clip_rect = surface.get_clip()
+        bg_pos = self.get_background_pos(clip_rect.topleft, clip_rect.size)
+        surface.blit(self.background, clip_rect.topleft, area=Rect(bg_pos, clip_rect.size))
 
 
-    def draw_tiles(self, surface, pos):
-        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_tiles(self, surface):
+        self.tiles.draw(surface)
 
 
-    def draw(self, surface, pos):
-        self.draw_background(surface, pos)
-        self.draw_tiles(surface, pos)
+    def draw(self, surface):
+        self.draw_background(surface)
+        self.draw_tiles(surface)
 
 
--- a/skaapsteker/levelscene.py	Sun Apr 03 20:24:17 2011 +0200
+++ b/skaapsteker/levelscene.py	Sun Apr 03 20:24:47 2011 +0200
@@ -2,15 +2,27 @@
 
 import engine
 import level
+import physics
+import pygame
 
 class LevelScene(engine.Scene):
 
     def __init__(self, leveldef):
         self._level = level.Level(leveldef)
+        self._level_surface = self._level.get_surface()
         self._pos = (0, 0)
+        self._world = physics.World()
+
+    def draw(self, screen_surface):
+        self._world.update()
 
-    def draw(self, surface):
-        self._level.draw(surface, self._pos)
+        clip_rect = pygame.Rect(self._pos, screen_surface.get_size())
+        self._level_surface.set_clip(clip_rect)
+
+        self._level.draw(self._level_surface)
+        self._world.draw(self._level_surface)
+
+        screen_surface.blit(self._level_surface, (0, 0), area=clip_rect)
 
     def dispatch(self, ev):
         # handle events here!