domingo, 23 de marzo de 2008

Dirty Rects

Dirty Rects es una tecninca muy usada en la programacion 2d, consiste en solo dibujar lo que este sucio, de esa manera se evita procesar informacion innecesariamente, un ejemplo sencillo de la tecnica seria

global dirty
dirty = True

def draw() :
#Aqui va el codigo de ploteo y de dibujo
global dirty
dirty = False # Como recien fue dibujado ya no esta sucio

def main():
while True
if dirty:
draw()


Es tan facil como esto, ahora como ejemplo final voy a reescribir el codigo del ploteo isometrico ocupando dirty rects


#-------Empieza Codigo-----------
#Isometric Plot
import pygame
from pygame import *

global dirty
dirty = True

TILESIZE = 64
SCREEN = pygame.display.set_mode((800, 600))
BLUE = (0, 0, 200)
GROUND_IMAGE = pygame.image.load('grass.png')

def plot():
SCREEN.fill((0, 200 , 0))

"""Aqui en el range es donde vamos a poner cuantos tiles queremos dibujar
En este caso son 15 tiles en la direccion y, y 10 tiles en la direccion x
y por lo tanto vamos a dibujar 150 tiles"""

for y in range(0, 15):
for x in range(0, 10):
"""tenemos 2 tipos de posiciones en este ploteo,
posiciones de pixeles y posiciones de tiles,
la posiciones de pixeles se incrementan de 1 en 1,
las de tile depende del ploteo que queramos,
en este caso nuestra imagen mide 64*32 pixeles,
por lo tanto cada posicion horizontal esta a 64 pixeles
de la siguiente, pero en el caso vertical,
las imagenes estan distanciadas por 32 pixeles
y dijimos que habia que moverse desde
la mitad de la imagen para abajo
o sea: imagen/4 para abajo
"""

tile_x = x * TILESIZE
tile_y = y * TILESIZE/4

if y % 2 == 0: # si estamos en una fila par(partiendo desde 0 seria la fila 0,2,4,6,8)
SCREEN.blit(GROUND_IMAGE, (tile_x, tile_y))

else:
tile_x += 32 # corregimos la posicion para las filas impares
SCREEN.blit(GROUND_IMAGE, (tile_x, tile_y))

global dirty
dirty = False

def main():
clock = pygame.time.Clock()
fps = 40

ready = False
while not(ready):
clock.tick(fps)
print clock.get_fps()
if dirty:
plot()

pygame.display.update()

events = pygame.event.get()
for event in events:
if event.type == QUIT:
return
if event.type == KEYDOWN:
ready = True

main()
#-------Termina Codigo-----------

No hay comentarios: