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 3763 miembros registrados.
El último usuario registrado es Carlos Rodriguez.

Nuestros miembros han publicado un total de 85779 mensajes en 12216 argumentos.

[XP] Terrenos invisibles + Mostrar terrenos en mapa

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] Terrenos invisibles + Mostrar terrenos en mapa

Mensaje por Wecoc el 2016-09-24, 15:05

Terrenos invisibles


Éste script permite asignar invisibilidad a los tiles de un determinado terreno, y controlarlo in-game.

No requiere créditos. Va encima de main como siempre, y debería ser compatible con todo.

Código:
#==============================================================================
# ** [XP] Terrenos invisibles
#------------------------------------------------------------------------------
#  Autor: Wecoc (no requiere créditos)
#==============================================================================

MAX_TERRAINS = 7

#==============================================================================
# ** Game_System
#==============================================================================

class Game_System
  attr_accessor :invisible_terrains
  alias invisible_terrains_ini initialize unless $@
  def initialize
    invisible_terrains_ini
    @invisible_terrains = {}
    for i in 0..MAX_TERRAINS
      @invisible_terrains[i] = false
    end
  end
end

#==============================================================================
# ** Spriteset_Map
#==============================================================================

class Spriteset_Map
  def setup_tileset
    for i in 0..6
      autotile_name = $game_map.autotile_names[i]
      @tilemap.autotiles[i] = RPG::Cache.autotile(autotile_name).clone
    end
    @tilemap.tileset = RPG::Cache.tileset($game_map.tileset_name).clone
    w = @tilemap.tileset.width / 32
    h = @tilemap.tileset.height / 32
    blank = Color.new(0, 0, 0, 0)
    for i in 0..6
      terrain_id = $game_map.terrain_tags[(i + 1) * 48]
      if @invisible_terrains[terrain_id] == true
        aw = @tilemap.autotiles[i].width
        ah = @tilemap.autotiles[i].height
        @tilemap.autotiles[i].fill_rect(0, 0, aw, ah, blank)
      end
    end
    for iy in 0...h
      for ix in 0...w
        tile_id = 384 + ix + iy * 8
        terrain_id = $game_map.terrain_tags[tile_id]
        if @invisible_terrains[terrain_id] == true
          @tilemap.tileset.fill_rect(ix * 32, iy * 32, 32, 32, blank)
        end
      end
    end
  end
  
  alias invisible_terrains_upd update unless $@
  def update
    need_refresh = false
    if @invisible_terrains == nil
      @invisible_terrains = {}
      for i in 0..MAX_TERRAINS
        @invisible_terrains[i] = false
        need_refresh = true
      end
    end
    for i in 0..MAX_TERRAINS
      if @invisible_terrains[i] != $game_system.invisible_terrains[i]
        @invisible_terrains[i] = $game_system.invisible_terrains[i]
        need_refresh = true
      end
    end
    if need_refresh == true
      setup_tileset
      $game_map.refresh
    end
    invisible_terrains_upd
  end
end

Funcionamiento

Mejor lo explico con un ejemplo. Si queremos que los tiles con terreno 1 sean invisibles en el juego y solo se vean en el editor (útil para sistemas con pasabilidad compleja como los parallax mapping, al tile le dibujas una cruz y listo) al principio del juego debemos usar ésto en un Llamar Script desde evento:

$game_system.invisible_terrains[1] = true

Para que vuelva a ser visible

$game_system.invisible_terrains[1] = false ; true

Ese último true es por un bug del maker que ya se ha comentado muchas veces.

Ese 1 puede ir de 0 a 7 (terrenos por defecto) y si estáis usando un sistema a parte que permite más IDs de terreno solo tenéis que ir al principio del script, buscar ésta línea:

MAX_TERRAINS = 7

y cambiar el número por el nuevo máximo.

Nota: Los cambios se almacenan en las partidas guardadas así que seguramente dé problemas al cargar partidas que se guardaron antes de insertar el script.
Para updatear esas partidas de modo que sirvan usad el script Wecoc's Script SaveFiles Updater

Para quien quiera también hice unos tiles que podéis usar para el parallax junto con éste script.

Tiles:
avatar
Wecoc
Administrador
Administrador



Créditos 9370

Gracias : 517

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Terrenos invisibles + Mostrar terrenos en mapa

Mensaje por Wecoc el 2016-09-25, 09:54

Mostrar terrenos en mapa


Añado otro script, compatible con el anterior y compatible con todo (pero debe ir justo al final de la lista, por encima de main). Los pongo juntos porque mi recomendación es usar los dos en vez de solo uno, para ampliar el potencial de los terrenos.

Éste script permite visualizar los terrenos in-game. Para hacerlo, en modo Debug pulsad la tecla F8.

No requiere créditos, fue muy sencillo de hacer. Soporta infinitos terrenos, pese a que por defecto solo hay 7.

Código:
#==============================================================================
# ** Mostrar terrenos en mapa
#------------------------------------------------------------------------------
#  Autor: Wecoc (no requiere créditos)
#==============================================================================


module Terrain
  
  PASSABLE    = [] # Define aquí los terrenos pasables
  NO_PASSABLE = [] # Define aquí los terrenos no pasables
  
  a, b, c, d = 192, 155, 117, 100
  
  COLORS = [Color.new(a, c, c, d),
            Color.new(a, b, c, d),
            Color.new(a, a, c, d),
            Color.new(b, a, c, d),
            Color.new(c, a, c, d),
            Color.new(c, a, b, d),
            Color.new(c, a, a, d),
            Color.new(c, b, a, d),
            Color.new(c, c, a, d),
            Color.new(b, c, a, d),
            Color.new(a, c, a, d),
            Color.new(a, c, b, d)]
  
end

class Game_Map
  alias terrain_support_pass? passable? unless $@
  def passable?(x, y, d, self_event = nil)
    terrain = terrain_tag(x, y)
    return true if Terrain::PASSABLE.include?(terrain)
    return false if Terrain::NO_PASSABLE.include?(terrain)
    return terrain_support_pass?(x, y, d, self_event)
  end
end

class Spriteset_Map
  unless $@
    alias terrain_show_ini initialize
    alias terrain_show_dis dispose
    alias terrain_show_upd update
  end
  
  def initialize
    terrain_show_ini
    setup_terrain
  end
  
  def setup_terrain
    @terrain_sprite = Sprite.new(@viewport1)
    width = $game_map.width
    height = $game_map.height
    @terrain_sprite.bitmap = Bitmap.new(width * 32, height * 32)
    @terrain_sprite.z = 2000
    @terrain_sprite.visible = false
    for iy in 0...$game_map.height
      for ix in 0...$game_map.width
        terrain = $game_map.terrain_tag(ix, iy)
        next if terrain == 0
        color_index = terrain % Terrain::COLORS.size
        color = Terrain::COLORS[color_index]
        x = ix * 32 ; y = iy * 32
        @terrain_sprite.bitmap.fill_rect(x, y, 32, 32, color)
        @terrain_sprite.bitmap.font.name = "Impact"
        @terrain_sprite.bitmap.font.size = 32
        @terrain_sprite.bitmap.font.color = Color.new(0,0,0)
        @terrain_sprite.bitmap.draw_text(x - 1, y - 1, 32, 32, terrain.to_s, 1)
        @terrain_sprite.bitmap.draw_text(x - 1, y + 1, 32, 32, terrain.to_s, 1)
        @terrain_sprite.bitmap.draw_text(x + 1, y - 1, 32, 32, terrain.to_s, 1)
        @terrain_sprite.bitmap.draw_text(x + 1, y + 1, 32, 32, terrain.to_s, 1)
        @terrain_sprite.bitmap.font.color = Color.new(255,255,255)
        @terrain_sprite.bitmap.draw_text(x, y, 32, 32, terrain.to_s, 1)
      end
    end
  end
  
  def dispose
    @terrain_sprite.dispose
    terrain_show_dis
  end
  
  def update
    terrain_show_upd
    return if @terrain_sprite.nil?
    @terrain_sprite.ox = $game_map.display_x / 4
    @terrain_sprite.oy = $game_map.display_y / 4
    @terrain_sprite.update
    if $DEBUG
      if Input.press?(Input::F8)
        @terrain_sprite.visible = true
      else
        @terrain_sprite.visible = false
      end
    end
  end
end

Cualquier duda me lo comentáis.
avatar
Wecoc
Administrador
Administrador



Créditos 9370

Gracias : 517

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.