Posi,
orientame un poco, por que el foro esta completito, todavia no se que post me pueden interesar, donde puedo ir para informarme sobre programacion, el fenix, y la detencion de tiles?
Detección de tiles
- LordFred
- 256 bits

- Mensajes: 3560
- Registrado: 10 Ene 2005 22:05
- Ubicación: Barcelona
- Contactar:
- na_th_an
- 256 bits

- Mensajes: 11874
- Registrado: 22 Abr 2005 13:25
- Contactar:
Creo que te refieres a "detección", de "detectar" (a menos que lo que tengas son tiles móviles y los quieras "detener"). En cuanto a eso, depende mucho de cómo tengas organizado tu mapa. Si es en forma de rejilla, la cosa es facilísima. Si no, el tema se complica un poquito (un poquito solo, no demasiado).jorjum escribió:Posi,
orientame un poco, por que el foro esta completito, todavia no se que post me pueden interesar, donde puedo ir para informarme sobre programacion, el fenix, y la detencion de tiles?
En una rejilla, teniendo unas coordenadas (X, Y) en pixels y un tamaño de tile de NxN (recomendable que N sea potencia de 2, siendo 16 el número perfecto en mi opinión y en "resolución retro"), el problema se reduce primero a determinar si estamos "alineados con la rejilla" y luego a mirar en la misma si el tile con el que posiblemente colisionemos es o no traspasable.
Por ejemplo, si nos desplazamos pixel a pixel a la izquierda por un mapa de rejilla de tiles de 16x16 almacenado en un array "map", lo primero que hacemos:
Código: Seleccionar todo
1.- ¿Estamos alineados con la rejilla?
1.1. SÍ: ¿El tile justo a la izquierda es traspasable?
1.1.1. SÍ: x = x - 1.
1.1.2. NO: Paramos.
1.2. No: x = x - 1.
¿Cómo vemos si estamos alineados? Muy sencillo: cuando el resto de la división entre la coordenada X y la dimensión N de los tiles da CERO, o sea, que nuestra coordenada es un múltiplo de N. Esto se hace con un módulo (no macuerdo como era en DIV, puede que fuera % o MOD) o bien con un AND lógico a (N-1) -> solo si N es potencia de 2:
Código: Seleccionar todo
O bien:
if (x MOD 16 = 0)
O bien (más rápido):
if ((x AND 15) = 0)Código: Seleccionar todo
xrejilla = x / N;
yrejilla = y / N;La cosa es que puede ahora que nuestro sprite no esté alineado verticalemente con la rejilla, y eso también hay que comprobarlo. Si estamos alineados verticalemente con la rejilla solo tendremos que comprobar (xrejilla-1, yrejilla), pero si no, habrá también que comprobar el tile que está justo debajo de este: (xrejilla -1, yrejilla+1). Hazte un dibujo y lo verás claramente.
Por tanto, para ver si podemos avanzar a la izquierda con tiles de 16x16:
Código: Seleccionar todo
xrejilla = x / 16
yrejilla = y / 16
// ¿Estamos alineados a tile horizontalmente?
IF ((x AND 15) = 0) THEN
// ¿Estamos alineados a tile verticalmente?
IF ((y AND 15) = 0) THEN
// Estamos alineados verticalmente, solo
// comprobamos a la izquierda:
IF ( mapa (xrejilla - 1, yrejilla) = TRASPASABLE)
x = x - 1
ENDIF
ELSE
// No estamos alineados verticalmente, así que
// comprobamos a la izquierda y abajo a la izquierda:
IF ( mapa (xrejilla - 1, yrejilla) = TRASPASABLE AND mapa(xrejilla - 1, yrejilla + 1) = TRASPASABLE)
x = x - 1
END IF
END IF
ELSE
// No estamos alineados horizontalmente, entonces no
// habrá colisión y podemos avanzar:
x = x - 1
END IF
