Semestre 02, 2026
las ocho vistas de un enemigo
atrás
7
6 0
izq der
5 ● 1
según el ángulo
4 2 entre su frente
3 y el jugador
de frente
No importa dónde está el sprite, sino dónde está respecto al jugador.
▓ sprite (600, 320)
╱ │
╱ │
d ╱ │ dy = 70
╱ │
╱ θ │
jugador ●───────────────
(250,250) dx = 350
Usar la misma cantidad que las paredes es lo que mantiene pegados los sprites a la escena.
dirección de vista a
│
│ ▓ sprite
│ ╱
│ ╱ β
│╱
●
jugador
β < 0 a la izquierda, β > 0 a la derecha
Un sprite con el centro apenas afuera del cono todavía puede tener media silueta adentro. Sin margen se corta de golpe en la orilla.
El semiancho angular del propio sprite. En el ejemplo son 160.83 columnas, que a 0.046189 grados por columna dan 7.43 grados.
β columna angular columna con tangente diferencia
-30.0° 0.0 0.0 0.0
-15.0° 324.8 348.3 23.5
0.0° 649.5 650.0 0.5
+15.0° 974.3 951.7 22.6
+30.0° 1299.0 1300.0 1.0
centro = 894
│
izq = 734 │ der = 1055
┌────────────────────┼────────────────────┐ arriba = 289
│ │ │
│ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ │
450 ────┼────────────────────●────────────────────┼──── horizonte
│ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ │
│ │ │
└────────────────────┼────────────────────┘ abajo = 611
lado = 321.67
La coordenada horizontal sale del punto de impacto del rayo y es la misma para toda la columna.
Sale de la posición dentro del rectángulo y cambia en cada columna que se pinta.
orillas reales lo que se pinta
izq = -120 de 0 a 1055
der = 1055
arr = -230 de 0 a 899
aba = 1130
el sprite mide 1175 px de lado,
pero solo se escribe lo que
cae dentro de la pantalla
la imagen lo que se pinta
░░░░▓▓░░░░ ▓▓
░░░▓▓▓▓░░░ ▓▓▓▓
░░▓▓▓▓▓▓░░ ▓▓▓▓▓▓
░░░▓▓▓▓░░░ ▓▓▓▓
░░░░▓▓░░░░ ▓▓
░ transparente, no se escribe
▓ opaco, se escribe
Un color que nunca aparece en el arte, casi siempre magenta puro. Cualquier texel de ese color se salta. Es lo más barato y lo que usaba la época.
Un cuarto canal dice qué tan opaco es cada texel. Permite bordes suaves, pero obliga a mezclar con el color que ya estaba.
vista desde arriba
pared
═══════════════
│
│ ▓ sprite (más lejos)
│
●
jugador
el sprite no debería verse
columna 0 1 2 ... 1299
┌─────┬─────┬─────┬───┬─────┐
z-buffer │ 412 │ 410 │ 408 │...│ 396 │
└─────┴─────┴─────┴───┴─────┘
▲
│
una escritura por columna
mientras se pintan las paredes
Se compara la distancia corregida del sprite con la que guardó la pared. Si el sprite está más lejos, esa columna entera se salta.
columnas 734 ... 870 871 ... 1055
pared (z-buffer) 300 ... 300 500 ... 500
sprite 350 ... 350 350 ... 350
comparación 350 ≥ 300 350 < 500
resultado tapado se dibuja
┌──────────────────────────┬────────────────────────────┐
│ ███ pared ███ │ ▓▓ mitad visible ▓▓ │
└──────────────────────────┴────────────────────────────┘
A está lejos B está cerca
de lejos a cerca de cerca a lejos
┌──────────────┐ ┌──────────────┐
│ AAAA │ │ AAAA │
│ AABBBB │ │ AAAABB │
│ BBBB │ │ BBBB │
└──────────────┘ └──────────────┘
B queda al frente A tapa a B aunque
como corresponde está más lejos
Es como trabaja un pintor: primero el fondo, después lo que está adelante. Cada capa cubre a la anterior.
Ordenar unas decenas de sprites es despreciable frente al pintado. Se rehace en cada cuadro, porque el orden depende de dónde está el jugador.
dibujar todas las paredes ──► llenar el z-buffer, una distancia por columna
│
▼ calcular la distancia de cada sprite
▼ ordenar de lejos a cerca
│
── por cada sprite ──────────────────────────────────
▼ vector al sprite ────────────► dx · dy
▼ distancia y ángulo ──────────► d · θ
▼ desvío normalizado ──────────► β
▼ filtro de visibilidad ───────► dentro o descartado
▼ columna central y lado ──────► centro · lado
▼ rectángulo y recorte ────────► columnas y filas a pintar
│
── por cada columna del rectángulo ──────────────────
▼ comparar con el z-buffer ────► tapada o visible
▼ por cada fila: texel → transparencia → pintar