Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.
Conectarse

Recuperar mi contraseña

Temas importantes
----------------------------------------
Páginas con recursos RPG Maker
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
Afiliados
Estadísticas
Tenemos 4131 miembros registrados.
El último usuario registrado es salyantoyoutube.

Nuestros miembros han publicado un total de 84723 mensajes en 12058 argumentos.

Script pasabilidad por tile. ¿Existe?

Ver el tema anterior Ver el tema siguiente Ir abajo

Script pasabilidad por tile. ¿Existe?

Mensaje por teivko el 2017-02-15, 12:05

Bueno, pues quería saber si existe algun tipo de Script que dependiendo del tile, tenga una pasabilidad u otra, una prioridad u otra. Me explico.

Imaginaos un mapa de una caverna, tenéis una serie de paredes que lógicamente no se pueden traspasar, pero justo hay un punto donde queréis que sea traspasable, pues añadiéndole un tile especifico esta zona se vuelve pasable. O una valle con un lago, donde esta claro que no se puede entrar, pero justo por una zona si se puede. Yo me imaginaba algo como tileset que tengan estas imágenes:


(La he cogido de Wecoc en un tema suyo llamado TERRENOS INVISIBLES)

Entonces el programa al comprobar el tile, se da cuenta de que es el tile de pasabilidad completa, o cualquier otra y entonces te deja pasar, aunque existe otro tile que dice que no puedes pasar.

También le veo otra utilidad, puedes poner prioridades diferentes a diferentes elementos aunque en el tileset tenga una sola. Por ejemplo, un arbol con sus tipicas prioridades, pero otro diferente al que por X motivo se queda siempre por debajo del personaje.

Espero haberme explicado correctamente lol!
avatar
teivko
Iniciado
Iniciado

0/3

Créditos 45

Gracias : 3

Volver arriba Ir abajo

Re: Script pasabilidad por tile. ¿Existe?

Mensaje por alex1633 el 2017-02-15, 12:59

Para hacer que un tile sea pasable o no, aquí, en la base de datos, en tilesets, tienes la lista de los mapas, donde cada tile representa una X, una O, o un cuadrado.

La X significa que "no" es pasable
La O significa que "sí" es pasable
El cuadrado, no sé que significa, pero lo he visto en paredes
Spoiler:

Luego en pestaña direcciones, tienes las flechas, que significan hacia que dirección puede pasar el personaje o el evento (Siempre que no sea un evento tipo atravesable)
La flecha como bien marca, si es para arriba, pues significa que el personaje puede ir de abajo a arriba, si es para abajo, de arriba a abajo, si marca a la izquierda, de derecha a izquierda y si mira a la derecha, de izquierda a derecha. Para evitar una dirección, se pincha en la flecha hacia donde no se quiere que el personaje o el evento vaya, y se sustitute por un "."
Spoiler:
avatar
alex1633
Soñador
Soñador

0/3

Créditos 391

Gracias : 15

Volver arriba Ir abajo

Re: Script pasabilidad por tile. ¿Existe?

Mensaje por teivko el 2017-02-15, 14:20

Buenas Alex, muchas gracias por tu respuesta, aunque no era exactamente lo que preguntaba. Se como hacer que un tile de un tileset sea pasable o no, yo a lo que me referia es hacer que ese tile, que tu pones en el mapa unas veces sea pasable y otras no, unas veces tenga prioridad 1 y otras 5.

Imaginate que pongo el tronco en cinco sitios diferentes, lo que quiero es que por ejemplo cada tronco tenga cinco prioridades diferentes, claro, esto es facil duplicando en el tileset el grafico, pero y si lo tuviera que hacer para todo? Seria un tileset enorme con muchos graficos repetidos. Yo lo que busco, aunque es sobretodo por curiosidad, es si existe algun script que me permita añadir en la ultima capa una serie de tiles que marquen tanto la pasibilidad como la prioridad. Algo como la imagen que habia puesto arriba.
avatar
teivko
Iniciado
Iniciado

0/3

Créditos 45

Gracias : 3

Volver arriba Ir abajo

Re: Script pasabilidad por tile. ¿Existe?

Mensaje por Wecoc el 2017-02-15, 21:15

Éste script que puse aquí sirve para lo que dices de la pasabilidad: Control de Pasabilidad por mapa

La prioridad es mucho más complicada porque hacerle cambios implica modificar el script Tilemap, como ya dije en ese post, y es un script oculto del programa así que no se puede modificar directamente. La única opción es usar un script de Tilemap personalizado, por ejemplo uno muy usado es el de Poccil y a partir de ahí hacer las modificaciones que se deseen, en éste caso control dinámico de perioridades por coordenada y capa. Cabe mencionar que aunque hay muchos scripts de Tilemap muy bien logrados, todos flojean en algo en relación al original, normalmente dan más lag por estar hechos en RGSS directamente.

Hace ya tiempo empecé un script que comparte una idea similar a lo que se está diciendo... No lo terminé por el mismo motivo de Tilemap que he explicado. Éste, amplía las características de los tiles dándoles nuevas propiedades:

1 - Tile cuya pasabilidad no se tiene en cuenta, sinó que se considerará siempre la de su capa anterior como propia. Eso sirve por ejemplo si quieres que unos papeles sirvan tanto para el suelo y puedas pasar por encima, como para ponerlos encima de una mesa, por lo que no puedes atravesarlos. Puede que sea lo que andas buscando.

2 - Lo mismo con la prioridad. No funciona porque requiere el Tilemap, pero la utilidad detrás de ésto sería hacer un tile que tanto sirve para suelo, como encima de mesa (y puedes pasar por detrás de ésta) o incluso encima de estantería alta... Simplemente imita la prioridad del tile de abajo de modo que queda encima (más tipo el mapeado de VX/Ace/MV). Según parece el RPG maker XP por defecto tenía esa opción pero por algún motivo la quitaron antes de realizarlo, quizá complicaba demasiado el Tilemap por defecto o consideraron que no hacía falta (es solo una teoría).

Hay otras prioridades en el script.

Código:
#==============================================================================
# ** TileExtension BETA 0.1
#==============================================================================

module TileExtension
  Custom = {} # No cambiar
 
  # Significado de los Hash siguientes: Tileset ID => [Tiles]
  #--------------------------------------------------------------------------
  # 1. Tiles cuya pasabilidad es ignorada.
  #--------------------------------------------------------------------------
  AvoidPassability = {1 => [384, 385]}
  #--------------------------------------------------------------------------
  # 2. Tiles cuya prioridad es ignorada, quedan encima del tile de la capa ant.
  # No está hecho. Requiere un Tilemap personalizado.
  #--------------------------------------------------------------------------
  AvoidPriority    = {}
  #--------------------------------------------------------------------------
  # 3. Tiles con efecto Hierba alta ignorado.
  #--------------------------------------------------------------------------
  AvoidBush        = {1 => [384, 385]}
  #--------------------------------------------------------------------------
  # 4. Tiles donde los encuentros en mapa no funcionan.
  # No está implementado.
  #--------------------------------------------------------------------------
  AvoidEncounters  = {1 => [384, 385]}
  #--------------------------------------------------------------------------
  # 5. Opciones extra. No hay ninguna implementada.
  #--------------------------------------------------------------------------
  Custom['Label']  = {1 => [384]} # Ejemplo: Tile "Escalera"
  Custom['Dash']  = {1 => [96]}  # Ejemplo: Tile "Correr"
 
  #--------------------------------------------------------------------------
  # * Cómo obtener los parámetros:
  #--------------------------------------------------------------------------
  # TileExtension.passability_data(ID tileset, ID tile)
  # TileExtension.priority_data(ID tileset, ID tile)
  # TileExtension.bush_data(ID tileset, ID tile)
  # TileExtension.encounters_data(ID tileset, ID tile)
  # TileExtension.custom_data('Label', ID tileset, ID tile)
  # TileExtension.custom_data('Dash', ID tileset, ID tile)
  #--------------------------------------------------------------------------
  module_function
  def passability_data(tileset, tile_id)
    tile_id = tile_id - (tile_id % 48) if tile_id <= 384
    return false if !AvoidPassability.keys.include?(tileset)
    return AvoidPassability[tileset].include?(tile_id)
  end
 
  def priority_data(tileset, tile_id)
    tile_id = tile_id - (tile_id % 48) if tile_id <= 384
    return false if !AvoidPriority.keys.include?(tileset)
    return AvoidPriority[tileset].include?(tile_id)
  end
 
  def bush_data(tileset, tile_id)
    tile_id = tile_id - (tile_id % 48) if tile_id <= 384
    return false if !AvoidBush.keys.include?(tileset)
    return AvoidBush[tileset].include?(tile_id)
  end
 
  def encounters_data(tileset, tile_id)
    tile_id = tile_id - (tile_id % 48) if tile_id <= 384
    return false if !AvoidEncounters.keys.include?(tileset)
    return AvoidEncounters[tileset].include?(tile_id)
  end
 
  def custom_data(name, tileset, tile_id)
    return false if !Custom.keys.include?(name)
    tile_id = tile_id - (tile_id % 48) if tile_id <= 384
    return false if !Custom[name].keys.include?(tileset)
    return Custom[name][tileset].include?(tile_id)
  end
end

#==============================================================================
# ** Game_Map
#==============================================================================

class Game_Map
  #--------------------------------------------------------------------------
  # * Get Tileset ID
  #--------------------------------------------------------------------------
  def tileset_id
    return @map.tileset_id
  end
  #--------------------------------------------------------------------------
  # * Determine if Passable
  #--------------------------------------------------------------------------
  def passable?(x, y, d, self_event = nil)
    unless valid?(x, y)
      return false
    end
    bit = (1 << (d / 2 - 1)) & 0x0f
    for event in events.values
      if event.tile_id >= 0 and event != self_event and
        event.x == x and event.y == y and not event.through
        next if TileExtension.passability_data(tileset_id, event.tile_id)
        if @passages[event.tile_id] & bit != 0
          return false
        elsif @passages[event.tile_id] & 0x0f == 0x0f
          return false
        elsif @priorities[event.tile_id] == 0
          return true
        end
      end
    end
    for i in [2, 1, 0]
      tile_id = data[x, y, i]
      next if TileExtension.passability_data(tileset_id, tile_id)
      if tile_id == nil
        return false
      elsif @passages[tile_id] & bit != 0
        return false
      elsif @passages[tile_id] & 0x0f == 0x0f
        return false
      elsif @priorities[tile_id] == 0
        return true
      end
    end
    return true
  end
  #--------------------------------------------------------------------------
  # * Determine Thicket
  #--------------------------------------------------------------------------
  def bush?(x, y)
    if @map_id != 0
      for i in [2, 1, 0]
        tile_id = data[x, y, i]
        next if TileExtension.bush_data(tileset_id, tile_id)
        if tile_id == nil
          return false
        elsif @passages[tile_id] & 0x40 == 0x40
          return true
        end
      end
    end
    return false
  end
end

Si te sirve lo que tiene hecho, genial. Si álguien quiere terminarlo, extra-genial. No pido créditos xD
avatar
Wecoc
Administrador
Administrador



Créditos 9213

Gracias : 491

Volver arriba Ir abajo

Re: Script pasabilidad por tile. ¿Existe?

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


Permisos de este foro:
No puedes responder a temas en este foro.