Detección de tiles

El lugar para hablar de los emuladores. || Post here if you have any question about the emulators.

Moderadores: Neville, CEZ

Responder
Avatar de Usuario
jorjum
8 bits
8 bits
Mensajes: 40
Registrado: 06 Nov 2006 17:26

Mensaje por jorjum »

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?
Be water my friend
Avatar de Usuario
LordFred
256 bits
256 bits
Mensajes: 3560
Registrado: 10 Ene 2005 22:05
Ubicación: Barcelona
Contactar:

Mensaje por LordFred »

... pues yo de fénix no he leido mucho... perooooo... hay algunos cracks de los más cracks en fénix por aquí... así que, si no encuentras... crealo.
Avatar de Usuario
na_th_an
256 bits
256 bits
Mensajes: 11874
Registrado: 22 Abr 2005 13:25
Contactar:

Mensaje por na_th_an »

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?
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).

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.
Basicamente, si nuestro sprite no está alineado con la rejilla NO colisionará con ningún tile .Es justo cuando estamos en el límite cuando ES POSIBLE que el tile a la izquierda sea no traspasable.

¿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ómo, sabiendo X, miramos qué tile le corresponde de la rejilla? Fácil. Si estamos alineados a la rejilla, las coordenadas en la misma serán:

Código: Seleccionar todo

xrejilla = x / N;
yrejilla = y / N;
El tile que está en nuestra casilla es mapa (xrejilla, yrejilla), y el que está a la izquierda, por ejemplo, será (xrejilla - 1, yrejilla).

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
Sé que parece lioso la primera vez, pero te aseguro que tiene mucha lógica. Coge papel de cuadritos, pinta una rejilla, pinta tus sprites, y te darás cuenta.
Avatar de Usuario
jorjum
8 bits
8 bits
Mensajes: 40
Registrado: 06 Nov 2006 17:26

Mensaje por jorjum »

Probare a ver, que esoty empezando y todavia algunos conceptos me suenan a chino.

Gracias.
Be water my friend
Responder