# HG changeset patch # User Simon Cross # Date 1301855087 -7200 # Node ID fa1bb94cfa769bbdecd2596c9981a0f0e8f7bfd4 # Parent 34038447be2397f8750f54f03ef628477f359c94 Re-factor drawing to blit to a clip rect in the One True Level Surface before blitting that to the screen. diff -r 34038447be23 -r fa1bb94cfa76 scripts/level-editor --- 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) diff -r 34038447be23 -r fa1bb94cfa76 skaapsteker/level.py --- 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) diff -r 34038447be23 -r fa1bb94cfa76 skaapsteker/levelscene.py --- 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!