Autor Tema: ¿Como cambio el color de los tiles por código?  (Leído 326 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Naitsabes0

¿Como cambio el color de los tiles por código?
« en: Marzo 04, 2018, 10:53:34 pm »
Creo que no me explique bien en http://www.comunidadgm.org/preguntas-y-respuestas/como-adapto-este-fondo/, ya que solo busco que este tile.



Tenta un color al azar, no me importa si todos se vuelven de un mismo color o parece un arcoiris, el caso es que no siempre tenga su mismo color de origen, en este caso el violeta.

Para este background



Le aplique este código a un objeto de control
ROOM STAR
Código: [Seleccionar]
///Color
background_blend[0] = make_colour_hsv( irandom(254), 255, 255 ); //color background

Por lo tanto me pregunto si saben como hacer una linea de código que funcione así.

Ya que el ultimo código que me han mencionado, en este caso el usuario "Clamud"

Código: [Seleccionar]
// lista para guardar ids de tiles
tile_list = ds_list_create();

// contador de tiles
tile_count = 0;

for (j=0; j<room_height; j+=TILE_HEIGHT) //escaneo vertical
for (i=0; i<room_width; i+=TILE_WIDTH) //escaneo horizontal
{
  tile_id = tile_layer_find(LAYER_DEPTH, i,j); //buscar tile
  if (tile_id <> -1) //si hay tile en esta posicion
  {
    ds_list_add(tile_list, tile_id); //agregar a la lista
    tile_count ++; //incrementar contador
  }
}


Código: [Seleccionar]
// color aleatorio
tile_color = make_colour_hsv(irandom(254), 255, 255);

// asignar color a todas las tiles
for (i=0; i<tile_count; i++)
{
  tile_id = tile_list[|i];
  tile_set_blend(tile_id, tile_color);
}

Parece tener mas elementos de los que son necesarios para afectar el color de los tiles, por lo que al igual que el background, debe haber una forma de decirle al objeto controlador que cambie el color de los tiles de un background de forma absoluta, sin tener que armar una lista engorrosa y innecesaria.

Nota: pueden ver que mis tile son de patrones en 4x en vez de 1x, mis mapas son muy grandes, por ende tiene miles de tile y que a su vez demanda mucho tiempo, por eso busco armar un linea de código como "background_blend[0] = make_colour_hsv( irandom(254), 255, 255 ); //color background", ya que no me importa que color tengan los tile, solo me interesa que todos sean afectados al iniciar la "room", así cada vez que el jugador entre, sera distinto a la ultima vez.
« última modificación: Marzo 06, 2018, 07:16:40 am por Naitsabes0 »


 
No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado Naitsabes0

Re:¿Como cambio el color de los tiles por código?
« Respuesta #1 en: Marzo 08, 2018, 10:32:25 am »
4 días y un sigo con la duda  :-\.
 


Desconectado shaoran

  • Algún dios sádico es prueba de nosotros
  • Administrador
  • Okupa
  • *
  • Puntos: 614
  • Mensajes: 1.498
  • Agradecido: 7 veces
  • Sexo: Masculino
  • Nyu Kyu Software
    • Ver Perfil
Re:¿Como cambio el color de los tiles por código?
« Respuesta #2 en: Marzo 08, 2018, 04:31:38 pm »
Hola !

En teoria, debes utilizar los Shaders para hacer esto , ya que no existen funciones directas para hacerlo.

Este tutorial pude ayudarte:

https://www.youtube.com/watch?time_continue=696&v=d2lFkuUvS_Y

Otra forma seria crear partículas por encima de ese tile con determinado color y transparencia , que daría la sensación de ser de otro color, lo malo es que esta solucion consumiria muchos recursos.

Algo como esta imagen:


Saludos!



Desconectado Clamud

Re:¿Como cambio el color de los tiles por código?
« Respuesta #3 en: Marzo 11, 2018, 04:34:45 pm »
Para que el código que publiqué anteriormente sea más fácil de utilizar, lo he convertido en un script
http://www.comunidadgm.org/desarrollo-de-scripts/colorear-capa-de-tiles-(blend-color)/
Puedes ver cómo funciona en el ejemplo adjunto.

En el ejemplo también se pueden cambiar los colores con un pequeño shader que escribí
// Fragment shader
// Monochrome
//
uniform vec4 in_Colour; //(r,g,b,a)

varying vec2 v_vTexCoord;
varying vec4 v_vColour;

void main()
{
   //get pixel colour
   vec4 pix = v_vColour * texture2D( gm_BaseTexture, v_vTexCoord );
   float r = pix.r;
   float g = pix.g;
   float b = pix.b;
   
   //calculate luminance
   float m = min(min(r, g), b);
   float M = max(max(r, g), b);
   float lum = (m + M)*0.5;
   //float lum = (r + g + b)/3.0;
   
   //set new color
   if( lum < 0.5 )
   {
      r = lum * in_Colour.r;
      g = lum * in_Colour.g;
      b = lum * in_Colour.b;
   }
   else
   {
      //map lum from [0.5, 1] to [0, 1]
      lum = lum*2.0 - 1.0;
      r = (1.0 - in_Colour.r)*lum + in_Colour.r;
      g = (1.0 - in_Colour.g)*lum + in_Colour.g;
      b = (1.0 - in_Colour.b)*lum + in_Colour.b;
      //g = lum*2.0 - 1.0;
      //b = g;
   }
   gl_FragColor.rgba = vec4(r, g, b, pix.a);
}

Para que el shader solo cambie los colores de una capa de tiles, se deben utilizar 2 objetos: Uno con mayor profundidad que la capa de tiles para que active el shader justo antes de que se dibujen las tiles; y otro con menor profundidad para que desactive el shader justo cuando las tiles se terminan de dibujar.

Para cambiar entre los 2 métodos, presiona espacio.