Mercurial > skaapsteker
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!