Un tilemap es una grilla 2D donde cada celda contiene un nΓΊmero entero pequeΓ±o (tile ID) que se asocia a una imagen de tile. AsΓ es como casi todos los juegos 2D almacenan sus niveles β desde Super Mario Bros hasta los juegos indie modernos.
Un tilemap es una grilla 2D donde cada celda contiene un nΓΊmero entero pequeΓ±o (tile ID) que se asocia a una imagen de tile. AsΓ es como casi todos los juegos 2D almacenan sus niveles β desde Super Mario Bros hasta los juegos indie modernos.
Un tilemap es una grilla 2D donde cada celda contiene un nΓΊmero entero pequeΓ±o (tile ID) que se asocia a una imagen de tile. AsΓ es como casi todos los juegos 2D almacenan sus niveles β desde Super Mario Bros hasta los juegos indie modernos.
Beneficios de los tilemaps: - Los niveles son compactos β un mapa de 100Γ50 son solo 5,000 enteros - FΓ‘ciles de serializar (guardar/cargar niveles como archivos de texto) - Renderizado eficiente β dibuja solo los tiles visibles (culling) - Assets reutilizables β 10 imΓ‘genes de tile pueden construir niveles infinitos
Culling savings β tiles omitidos vs dibujados por frame
============================================================
TamaΓ±o de mapa Total Visible Omitidos Ahorrado
--------------------------------------------------------
PequeΓ±o (20Γ15) 300 300 0 0%
Mediano (50Γ30) 1500 408 1092 73%
Grande (100Γ50) 5000 408 4592 92%
Enorme (200Γ80) 16000 408 15592 97%
La Camera
La Camera representa el viewport hacia el mundo. Todo se dibuja en world space y se convierte a screen space para el rendering.
class Camera:def__init__(self, view_w, view_h):self.x =0.0# Camera top-left in world spaceself.y =0.0self.zoom =1.0def world_to_screen(self, wx, wy):"""What screen pixel does this world coordinate map to?""" sx = (wx -self.x) *self.zoom sy = (wy -self.y) *self.zoomreturnint(sx), int(sy)def screen_to_world(self, sx, sy):"""What world coordinate is under this screen pixel?""" wx = sx /self.zoom +self.x wy = sy /self.zoom +self.yreturn wx, wydef follow(self, target_x, target_y, dt, world_w, world_h):"""Smooth follow with lerp.""" desired_x = target_x -self.view_w / (2*self.zoom) desired_y = target_y -self.view_h / (2*self.zoom)self.x += (desired_x -self.x) *6.0* dt # Lerp# Clamp to world boundsself.x =max(0, min(self.x, world_w -self.view_w /self.zoom))self.y =max(0, min(self.y, world_h -self.view_h /self.zoom))
Camera Dead Zone
Una dead zone es una regiΓ³n alrededor del centro de la pantalla donde la Camera no se mueve. El jugador puede moverse libremente dentro de la dead zone; la Camera solo se mueve cuando el jugador llega a su borde.
Screen:
ββββββββββββββββββββββββββββββββββββ
β β
β ββββββββββββββββ β
β β DEAD ZONE β β
β β Player β β β camera β
β β moves here β doesn't β
β β freely β move β
β ββββββββββββββββ β
β β
ββββββββββββββββββββββββββββββββββββ
Parallax hace que el mundo se sienta profundo al hacer scroll de las diferentes capas de fondo a distintas velocidades.
Layer Speed (% of camera) Perceived depth
βββββ βββββββββββββββββββ βββββββββββββββ
Stars 5% Very far away
Distant mountains 15% Far
Near mountains 25% Medium
Clouds 30β50% Near background
class ParallaxLayer:""" factor = 0.0 β stationary (sky) factor = 1.0 β moves with the world (foreground) """def__init__(self, factor):self.factor = factordef draw(self, surface, camera_x): offset_x =int(camera_x *self.factor)for element inself.elements: screen_x = element.x - offset_x# Seamless horizontal wrap screen_x = screen_x % (WORLD_W + SCREEN_W) - SCREEN_W# Draw at screen_x...
Parallax Scrolling
Camera se desplazΓ³ 500px hacia la derecha
Capa Factor Desplazamiento IlusiΓ³n
--------------------------------------------------------
Estrellas (lejos) 0.05 25 EstΓ‘tico
MontaΓ±as distantes 0.15 75 Muy lejos
MontaΓ±as cercanas 0.25 125 Lejos
Nubes lejanas 0.30 150 Lejos
Nubes cercanas 0.50 250 Medio
Γrboles de fondo 0.70 350 Igual que el mundo
Objetos del mundo 1.00 500 Igual que el mundo
Tilemaps & Camera β Resumen
Tilemap = lista 2D de ints β compacto, serializable, eficiente
Culling: dibuja solo los tiles dentro del viewport β crΓtico para mapas grandes
La Camera convierte coordenadas world βοΈ screen para cada objeto
Smooth follow: lerp hacia la posiciΓ³n deseada de la Camera en cada frame
Dead zone: el jugador se mueve libremente en una regiΓ³n central antes de que la Camera lo siga
Parallax: las capas de fondo hacen scroll segΓΊn camera_x * factor; menor = mΓ‘s lejos