• Miércoles 20 de Noviembre de 2024, 10:35

Autor Tema:  Tiles  (Leído 2547 veces)

sk8erlucas

  • Miembro activo
  • **
  • Mensajes: 28
    • Ver Perfil
Tiles
« en: Lunes 1 de Diciembre de 2003, 23:02 »
0
Estuve investigando como usar tiles y no encontré nada, lo que quería saber es como usarlos, necesito crear un lugar largo y no me parece buena idea hacer un BMP de tan gran tamaño.
Así que investigué y decubrí que hay una técnica llamada tiles para hacer eso, el método es reemplazar una letra o número por un cuadrado, así se puede hacer el mapa en forma de texto. El problema es que no sé como copiar el sprite a otra superficie, y no sé si hacer tantos sprites (Uno por cuadrado por cámara).

Estoy seguro que hay una forma general de hacerla de la que todos parten al principio, si alguien la sabe me sería de mucha ayuda que me la diga.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Tiles
« Respuesta #1 en: Domingo 7 de Diciembre de 2003, 17:47 »
0
Bueno seria muy bueno que nos contaras en que lenguaje estas trabajando, para asi mirar lo de la copia en difderentes superficies, tenia un ejemplo en VB pero se me perio tratare de conseguirolo para la proxima semana.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Tiles
« Respuesta #2 en: Viernes 12 de Diciembre de 2003, 03:03 »
0
Cita de: "sk8erlucas"
Estuve investigando como usar tiles y no encontré nada, lo que quería saber es como usarlos, necesito crear un lugar largo y no me parece buena idea hacer un BMP de tan gran tamaño.
Así que investigué y decubrí que hay una técnica llamada tiles para hacer eso, el método es reemplazar una letra o número por un cuadrado, así se puede hacer el mapa en forma de texto. El problema es que no sé como copiar el sprite a otra superficie, y no sé si hacer tantos sprites (Uno por cuadrado por cámara).

Estoy seguro que hay una forma general de hacerla de la que todos parten al principio, si alguien la sabe me sería de mucha ayuda que me la diga.
Si puedes copiar una superficie  a la superficie de render no veo por que no puedas copiar una superficie a otra, es con la misma función. Si no estás usando 3D mejor si colocas TODAS tus superficies en RAM al momento de crearlas para que todo vaya más rápido en la mayoría de las máquinas.

Para los tiles (generalmente 32x32 pixeles o potencias de 2) utilizo una superficie con varios tiles ej: 512*512 y 256  tiles de 32x32 pixeles. Luego para copiarlos utilizo un simple cálculo para determinar el rectángulo "origen" en la superficie de tiles, que puedes optimizar con desplazadores si utilizas anchos de tiles que sean potencias de 2. De esta forma un byte representaría a uno de los 256 tiles.

Saludos.

sk8erlucas

  • Miembro activo
  • **
  • Mensajes: 28
    • Ver Perfil
Re: Tiles
« Respuesta #3 en: Martes 30 de Marzo de 2004, 00:37 »
0
Bueno, estuve probando y como que inventé un método para cargar los tiles en memoria. Espero que a alguien le sirva:

void CargarMapa(char *NombreArchivo)
{
   int aux;

   ifstream CanalEntrada(NombreArchivo);
   CanalEntrada >> vel_mapa;
   
   bool seguir = true;
   while(seguir == true)
   {
      char caracter;
      CanalEntrada >> caracter;

      columnas++;

      if (caracter == 'Q')
      {
         columnas = 0;
         filas++;
      }
      else if (caracter == 'F')
      {
         columnas--;
         filas++;
         seguir = false;
      }
   }
   
   ifstream CanalEntrada2(NombreArchivo);
   bloque = new st_bloque*[columnas];
   for (int i = 0; i < columnas; i++) bloque = new st_bloque[filas];

   float contX = 0, contY = 0;
   CanalEntrada2 >> vel_mapa;

   if (aux == 1) moverArAba = true;
   else moverArAba = false;
   
   for (int fila = 0; fila < filas; fila++)
   {
      for (int columna = 0; columna < columnas; columna++)
      {
         char caracter;

         CanalEntrada2 >> caracter;
         
         if (caracter == 'Q') CanalEntrada2 >> caracter;

         setCaracter(caracter, columna, fila);

         bloque[columna] [fila].PosX = contX;
         bloque[columna] [fila].PosY = contY;
         contX += 40;
      }

      contX = 0;
      contY += 40;
   }
}

Claro que en el .txt se encontrará la velocidad y luego el mapa, las q nos dicen que se ha llegado al fin del renglón y las f nos dicen el fin del archivo.

jaal2000

  • Miembro activo
  • **
  • Mensajes: 37
    • Ver Perfil
    • http://www.jaal.tk
Re: Tiles
« Respuesta #4 en: Jueves 17 de Junio de 2004, 18:27 »
0
Esta técnica fué utilizada por muchos juegos 2D (saga Última, Diablo, Warcraft, etc.), especialmente los que tenían vistas isométricas, "top down" o lateral (como los juegos de plataformas).

¿Qué es un mapa de bloques? (tile maps)

Es una matriz bidimensional que contiene en cada elemento la "descripción"
de una pequeña parte de un gran mapa. En un juego, por ejemplo uno de vista
cenital (desde encima), el mapa podr¡a ser el siguiente:

               0 0 0 0 0 0 0 0 0 0 0 0 0
               0 0 1 1 1 1 1 1 1 1 0 0 0
               0 0 1 0 0 0 0 0 0 1 0 0 0
               0 0 1 0 0 0 0 0 0 1 0 0 0
               0 0 1 0 0 0 0 0 0 1 0 0 0
               0 0 1 0 0 0 0 0 0 1 0 0 0
               0 0 1 1 1 2 1 1 1 1 0 0 0
               0 0 0 0 0 0 0 0 0 0 0 0 0

el cual describe una habitaci¢n o un recinto cerrado, en esta matriz los
"0" son el suelo, los "1" son paredes y el "2" es una puerta. Ahora, si
implementamos un algoritmo que lea esta matriz e interprete cada elemento,
para luego pintar imagenes en vez de ceros y unos, lo que se lograría es
dibujar un mapa convincente. Lo que se hace es ir tomando cada elemento de
la matriz y, según su valor, pintar determinada imagen (bloque). En el
ejemplo anterior al leer un "0" se dibuja un bitmap que contiene la imagen
de un trozo de suelo, al leer un "1" se dibuja un pedazo de pared y al leer
un "2" se dibuja una puerta.

En http://es.geocities.com/jaal81/Zip (EM2.zip), puedes encontrar un sencillo editor de "tile maps", que incluye todo el código fuente. Y si quieres puedes bajar esta pequeña (y antigua), pero útil, librería de gráficos para obtener código fuente acerca de los tile maps: http://es.geocities.com/jaal81/Zip (Lib13H.zip)
Alejandro Duarte.
DPA Software.

mortiz

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
Re: Tiles
« Respuesta #5 en: Sábado 19 de Junio de 2004, 18:16 »
0
Hola:
Yo te puedo responder desde el punto de vista vc++ y Dx9: puedes cargar un jpg laaargo, yo he cargado hasta de 4096 x 512 y funciona bien.
Pero ya que hice todo ese trabajo me entere de otro metodo, Usa funciones de DirectShow y puedes correr una pelicula completa como fondo y te ahorras las cargas de jpg's. Por otro lado si tu universo es circular como tanques desplazandose, se debe usar el metodo llamado Bump mapping, con esta Dx se encarga de presentar el fondo adecuado no importando la direccion de movimiento del sujeto.
 :alien:

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Tiles
« Respuesta #6 en: Miércoles 23 de Junio de 2004, 17:13 »
0
:whistling: pues tu soluicion me parece bastante fea mortiz  :scream:


eso va en contra de las buenas practicas de programacion..
y si , si hay problemas con superficies grandes, en especial si e requiere el uso de transparencias o de otros efectos.

el hecho de que sea jpg no importan ya que en una superficie ocupa igual tamaño un bmp que un jpg, y no es lo mismo usar un bmp de  640*480 donde este todo lo que necesitas para crear una escena de 15000 *15000 que usar un dibujo de 15000 * 15000

para crear una escena de 15000 por 15000 con tiles bien hechos se necesitaria en memoria algo asi si es a 24 bit de color

640 *480 *3 = 921.600 bytes = 900 Kilobytes

sin usar tiles, es decir con la tecnica que dices serian:

15000 *15000 *3 = 675.000.000 bytes = 675 Megabytes

asi que hay una diferencia demaqsiado grande..
y eso sin tener en cuenta que la escena puede requerir de mas de una capa lo cual generalmente triplicaria el consumo de memoria.  :lightsabre:  :smartass:
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io