Quiero que mi personaje se vuelva invisible al andar sobre bosques.

¿Puede detectar que tipo de tile está pisando y si es el que yo quiero, cambiarle el alpha para que se vuelva invisible?

El mapa es grande, por lo tanto descarto el usar objetos.

Solo si tus tiles están alineados a una cuadricula especifica, por así decirlo de 32*32.

Ajá¿Cómo?

¿Me puedes adelantar un ejemplo de uso?

Gracias.

Lo que puedes hacer es que al pasar por tal punto se active una time line que te active la invisibilidad del personaje

te recomiendo que uses objetos y que los desactives si están lejos de la vista con instance_deactivate();


#6 Agosto 26, 2013, 10:32:01 PM Ultima modificación: Agosto 26, 2013, 10:37:11 PM por brunoxzx
Ups, me había olvidado por completo de esté tema  ???. Cuando está clase de cosas me sucedan, podrían enviarme un mp. Quizá debería haber una norma, que dejara hacer repost cuando tu post se ha perdido en el inmenso abismo de las preguntas que quedaron sin responder.

Bueno. Primero que nada sugiero que todos tus tiles de pasto estén puestas en el mismo depth y como había dicho antes alineadas por un numero cualquiera, de preferencia una potencia de dos.

Bueno. Hay dos soluciones, la más simple y también con la que obtienes menos rendimiento, es la siguiente:
[gml]
    //TileFind(depth, x, y, alignx, alginy);
    //Ej: TileFind(1000, mouse_x, mouse_y, 32, 32);
    return( tile_layer_find(argument0, (argument1 div argument3)*argument3, (argument2 div argument4)*argument4 );
[/gml]
Está se puede optimizar un poquitín usando operadores a nivel de bits para evitar las divisiones y multiplicaciones, sin embargo lo veo inútil ya que el tiempo que toma buscar los tiles es enorme (solo un poco más rápido que buscar un objeto) y no haría prácticamente ningún cambio.

Bueno, el segundo modo guardar la posición de todos tus tiles de pasto en un array bidimensional o una grilla, entonces saber si hay un tile en determinada posición sería prácticamente igual de rápido que acceder a  una variable.

Esté método tiene la desventaja de que necesitas hacer un pre-proceso al iniciar el room. Que dependiendo del numero de tiles puede llegar a demorarse más de un segundo. Esto por supuesto puede evadirse, pero necesitarás algunos conocimientos sobre carga de archivos.

[gml]
     //TileMapCreate(array, depth, celdasX, celdasY, alingX, alingY);
     for(var i=(argument2-1), i>=0 ; i--){
          for(var j=(argument3-1), j>=0 ; j--){
                argument0[0, 0]=tile_layer_find(argument1, i * argument4), tile_layer_find(argument1, j * argument5));
          }
     }
     return(argument0);
[/gml]

Como dije, esté script puede llegar a tomar su tiempo, así que lo que yo haría para evadir esto es que en la copia final de mi juego, creo un archivo binario, de texto o guardo una estructura (como una lista) con todas las posiciones de los tiles de pasto por cada room. Luego simplemente creo un script para cargar está lista dentro de mi array y listo se convierte en un proceso mucho más rápido si se hace bien.

[gml]
     //TileMapFind(array, x, y, alignx, aligny);
     return(argument0[argument1 div argument3, argument2 div argument4]);
[/gml]


Y un ejemplo para usar estós últimos dos.

Creas un objeto control que sea persistente y que esté en todos tus rooms con pasto.
En el evento create, haces esto.
[gml]
APasto[0, 0]=0;
[/gml]

Ev room start:
[gml]
APasto=TileMapCreate( APasto, -999, room_width div 32, room_height div 32, 32, 32);
[/gml]

Y bueno en cualquier otro objeto que quieras puedes hacer esto.
Ev draw:
[gml]
draw_text(10, 10, "El mouse está en el pasto?: ");
if ( TileMapFind(APasto, mouse_x, mouse_y, 32, 32)>=0 )  {
      draw_text(10, 30, "Sí");
      //sound_play(sound_pasto);
}else draw_text(10, 30, "No;
[/gml]