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 4133 miembros registrados.
El último usuario registrado es Neysersitoh.

Nuestros miembros han publicado un total de 84767 mensajes en 12064 argumentos.

[XP][WecTools] Eron's File Window

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP][WecTools] Eron's File Window

Mensaje por Eron el 2016-05-22, 17:23

Ésta tarde he hecho otro script añadido para el WecTools, ya que me pareció un add-on interesante =D
Lo que hace es cambiar la apariencia de Window File para dar más control sobre las carpetas y eso... Parecía sencillo pero no lo fue tanto x'DD

- Éste script debe implentarse en la base de scripts WecTools en la versión 0.5 o superior -

Es compatible con el otro que hice, el Load Tile Support, pero el Eron's File Window debe ir DEBAJO.

Autor: Eron
Versión: 1.0 (ESP) ... ¿Definitiva? No lo sé, ya veremos.

No son tools de esos así que aunque la carpeta Tools ya funcione hay que pegarlo como script, como siempre vamos.

Código:
#==============================================================================
# ** [WecTools] Eron's File Window
#==============================================================================
# * Éste script requiere la base de scripts WecTools versión 0.5 o superior.
#------------------------------------------------------------------------------
# Éste script debe quedar debajo del script "Load Tile Support" en caso de que
# se estén usando ámbos.
#------------------------------------------------------------------------------
# Autor: Eron
#==============================================================================

module WecTools
  
  ERON_FILE_WINDOW = true # NO CAMBIAR ÉSTO
  
  ERON_FILE_SEL = Color.new(255, 255, 0)
  
end

#==============================================================================
# ** Window_File
#==============================================================================

class Window_File < Window_Base
  
  IMAGE_EXT = ["bmp", "png"]
  DATA_EXT  = ["rxdata"]
  
  def initialize(x, y, width, height, rect, ext, type="load")
    super(x, y, width + 160 + 32, height, rect)
    @folder = Dir.getwd
    @ext = ext
    @list_window = Window_List.new(x + 160 + 16 + 32, y + 32, 160, 160 + 48)
    @list_window.z = self.z + 50
    @folder_window = Window_FolderList.new(x + 32, y + 64, 160, 160 + 16)
    @folder_window.z = self.z + 50
    @index = -1
    @image = Sprite_Image.new(x + 360 + 32, y + 32, 160, 160)
    @image.z = self.z + 100
    @type = type
    name = Vocab::SAVE_IMG_NAME
    create_writable_box(16 + 160 + 32, 36, 160, 24, name)
    @name_box = @writable_boxes[0]
    case @type
    when "load"
      @name_box.visible = false
      @name_box.active = false
      @name_box.spacebar = true
      @name_box.auto_clear = false
    when "save"
      @list_window.dispose
      @list_window = Window_List.new(x + 160 + 16 + 32, y + 64, 160, 160 + 16)
      @list_window.z = self.z + 50
    end
    refresh_list
    refresh
  end

  def dispose
    super
    @list_window.dispose
    @folder_window.dispose
    @image.dispose
    @tilemap_window.dispose rescue nil
  end
  
  def x=(x)
    dx = x - @x
    super(x)
    unless @list_window.nil?
      @list_window.x += dx
      @folder_window.x += dx
    end
    unless @image.nil?
      @image.x += dx
    end
    unless @tilemap_window.nil?
      @tilemap_window.x += dx
    end
  end
  
  def y=(y)
    dy = y - @y
    super(y)
    unless @list_window.nil?
      @list_window.y += dy
      @folder_window.y += dy
    end
    unless @image.nil?
      @image.y += dy
    end
    unless @tilemap_window.nil?
      @tilemap_window.y += dy
    end
  end
  
  def z=(z)
    def_z = z
    dz = z - @z
    super(def_z)
    unless @list_window.nil?
      @list_window.z += dz
      @folder_window.z += dz
    end
    unless @image.nil?
      @image.z += dz
    end
    unless @tilemap_window.nil?
      @tilemap_window.z += dz
    end
  end
  
  def refresh_list
    commands = []
    folders = Dir.folders(@folder)
    files = Dir.files(@folder)
    for file in files
      for ext in IMAGE_EXT
        if file.include?(".#{ext}")
          commands.push([image_icon, file])
        end
      end
    end
    @list_window.commands = commands
  end
  
  def refresh
    super
    return if @folder == nil
    @list_window.refresh
    @folder_window.folder = @folder
    rect1 = Rect.new(80, 0, 16, 16)
    rect2 = Rect.new(96, 0, 16, 16)
    template = $game_system.template
    bitmap = RPG::Cache.windowskin(template + "/Ticks")
    self.contents.blt(140 + 16, 32, bitmap, rect1)
    self.contents.blt(158 + 16, 32, bitmap, rect2)
    draw_rtp_tick(136 - 16 * 0, 32, 0)
    draw_rtp_tick(136 - 16 * 1, 32, 1)
    draw_rtp_tick(136 - 16 * 2, 32, 2)
    color = list_color.is_a?(Array) ? list_color[0] : list_color
    case @type
    when "load"
      self.contents.fill_rect(16 + 160 + 32, 32, 160 - 10, 160 + 48, color)
    when "save"
      self.contents.fill_rect(16 + 160 + 32, 64, 160 - 10, 160 + 16, color)
    end
    self.contents.fill_rect(32, 64, 160 - 10, 160 + 16, color)
    color = list_color.is_a?(Array) ? list_color[1] : list_color
    color = back_color if color.alpha == 0
    self.contents.fill_rect(360 + 32, 32, 160, 160, color)
    if load_tile_support == true
      if @type == "load"
        self.contents.font.size = 10
        self.contents.font.color = disabled_color
        self.contents.draw_text(336 + 160 + 32, 192, 64, 16, "SHIFT")
        self.contents.font.size = default_font.size
        self.contents.font.color = normal_color
      end
    end
    @image.refresh
    refresh_image
  end
  
  def load_tile_support
    return WecTools::LOAD_TILE_SUPPORT rescue false
  end
  
  def draw_rtp_tick(x, y, id)
    path = rtp_folders[id].gsub("\\", "/")
    template = $game_system.template
    bitmap = RPG::Cache.windowskin(template + "/Ticks")
    if path == @folder
      rect = Rect.new(16, 0, 16, 16)
    else
      rect = Rect.new(0, 0, 16, 16)
    end
    result_bitmap = Bitmap.new(16, 16)
    result_bitmap.blt(0, 0, bitmap, rect)
    if path == ""
      for iy in 0...result_bitmap.height
        for ix in 0...result_bitmap.width
          c = result_bitmap.get_pixel(ix, iy)
          color = Color.new([[c.red   - 40, 0].max, 128].min,
                            [[c.green - 40, 0].max, 128].min,
                            [[c.blue  - 40, 0].max, 128].min,
                            c.alpha)
          color.sat = 0
          result_bitmap.set_pixel(ix, iy, color)
        end
      end
    end
    self.contents.draw_bitmap(x, y, result_bitmap)
  end
  
  def rtp_folders
    result = []
    for i in 0..2
      result.push(AWorks.get_rtp_path(i+1))
    end
    return result
  end
  
  def refresh_image
    self.contents.fill_rect(360 + 32, 200, 128, 32, Color.new(0, 0, 0, 0))
    if @image.bitmap != nil
      self.contents.draw_text(360 + 32, 200, 64, 16, Vocab::WIDTH)
      self.contents.draw_text(360 + 96, 200, 64, 16, @image.bitmap.width.to_s)
      self.contents.draw_text(360 + 32, 216, 64, 16, Vocab::HEIGHT)
      self.contents.draw_text(360 + 96, 216, 64, 16, @image.bitmap.height.to_s)
    end
  end
  
  def refresh_item
    sy = @list_window.oy / 16
    index = @list_window.index
    if index >= (sy + @list_window.height / 16)
      @list_window.oy += (index - (sy + @list_window.height / 16 - 1)) * 16
      @list_window.index = index
    end
    if index < sy
      @list_window.oy -= (sy - index) * 16
      @list_window.index = index
    end
    item = @list_window.commands[@list_window.index]
    case item[0]
    when 0 # Folder
      if @double_click == true
        self.folder = @folder + "/" + item[1]
      end
      self.image = nil
    when 1 # Image
      case @type
      when "load"
        self.image = RPG::Cache.load_bitmap(self.folder + "/", item[1])
      when "save"
        name = item[1]
        for ext in IMAGE_EXT
          name.delete_text(".#{ext}")
        end
        @name_box.text = name
      end
    end
  end
  
  def data_icon
    return 2
  end
  
  def update
    super
    if self.active == true
      if load_tile_support == true
        if @tilemap_window.nil?
          if @type == "load"
            if Input.press?(Input::SHIFT)
              if !@image.bitmap.nil?
                update_shift_mode
              end
            end
          end
        end
      end
      @list_window.update
      @folder_window.update
      update_key_shortcuts
      if Mouse.trigger?(Mouse::LBUTTON)
        if Mouse.in_area?(self.x + 140 + 16, self.y + 32, 16, 16)
          if WecTools::FILE_ALL_FOLDERS == false && @folder == Dir.getwd
            return
          end
          folders = @folder.inside_folders
          if folders.size > 1
            folders.delete_at(folders.size - 1)
            self.folder = folders.join("/")
            return
          end
        end
        if Mouse.in_area?(self.x + 158 + 16, self.y + 32, 16, 16)
          self.folder = Dir.getwd
        end
        for i in 0..2
          if Mouse.in_area?(self.x + 136 - 16 * i, self.y + 32, 16, 16)
            if rtp_folders[i] != ""
              folder = rtp_folders[i]
              return if folder == nil
              self.folder = folder.gsub("\\", "/")
              return
            end
          end
        end
      end
      update_list
      update_folder
      update_input
      if @type == "load"
        update_keys
      end
    end
    if !@tilemap_window.nil? and @tilemap_window.visible == true
      update_tilemap
    end
  end

  def update_folder
    if Mouse.trigger?(Mouse::LBUTTON)
      if Mouse.in_area?(@folder_window.x, @folder_window.y,
        @folder_window.width - 10, @folder_window.height)
        folder_id = ((Mouse.y - @folder_window.y).to_f / 16).floor
        folder_id += (@folder_window.oy.to_f / 16).floor + 1
        af = @folder.inside_folders
        bf = Dir.folders(@folder)
        return if folder_id == af.size
        if folder_id < af.size
          new_folder = af[0...folder_id]
          self.folder = new_folder.join("/")
        else
          new_folder = af.clone.push(bf[folder_id - af.size - 1])
          self.folder = new_folder.join("/")
        end
      end
    end
  end
  
  def update_key_shortcuts
  end
  
  alias get_key_index_eronfix get_key_index unless $@
  def get_key_index(key)
    return if @list_window.commands.size == 0
    get_key_index_eronfix(key)
  end
end

#==============================================================================
# ** Window_FolderList
#==============================================================================

class Window_FolderList < Window_List
  
  attr_reader :folder
  
  def initialize(x, y, width, height)
    super(x, y, width, height)
    @folder = nil
  end
  
  def folder=(folder)
    @folder = folder
    self.oy = 0
    refresh
  end
  
  def current_folder
    return @folder.inside_folders.pop
  end
  
  def refresh
    self.contents.clear
    return if @folder == nil
    @commands = [""] if @commands.size == 0
    af = @folder.inside_folders
    bf = Dir.folders(@folder)
    @commands = af.clone.concat(bf)
    @contents_width = self.width - 10
    @contents_height = @commands.size * 16
    @index = -1
    self.contents = Bitmap.new(@contents_width, @contents_height)
    self.contents.font.name = default_font.name
    self.contents.font.size = default_font.size
    self.contents.font.color = normal_color
    refresh_contents_back
    for i in 0...af.size
      text = @commands[i]
      x = 4 + 4 * i
      y = 16 * i
      rect = Rect.new(0, 0, 16, 16)
      bitmap = RPG::Cache.icon("file_icons")
      self.contents.blt(x, y, bitmap, rect)
      dot_width = self.contents.text_size("..").width
      cw = @contents_width - x
      if (self.contents.text_size(text).width - dot_width) > cw
        max_index = cw / self.contents.text_size("A").width
        text = text[0..(max_index - 2)].to_s + ".."
      end
      if text == current_folder
        self.contents.font.color = WecTools::ERON_FILE_SEL
        self.contents.draw_text(x + 20, y, cw, 16, text)
        self.contents.font.color = normal_color
      else
        self.contents.draw_text(x + 20, y, cw, 16, text)
      end
    end
    x += 4
    for i in 0...bf.size
      text = @commands[af.size + i]
      y = 16 * (af.size + i)
      rect = Rect.new(0, 0, 16, 16)
      bitmap = RPG::Cache.icon("file_icons")
      self.contents.blt(x, y, bitmap, rect)
      dot_width = self.contents.text_size("..").width
      cw = @contents_width - x
      if (self.contents.text_size(text).width - dot_width) > cw
        max_index = cw / self.contents.text_size("A").width
        text = text[0..(max_index - 2)].to_s + ".."
      end
      self.contents.draw_text(x + 20, y, cw, 16, text)
    end
    refresh_contents
  end
end

Guía:
avatar
Eron
Principiante
Principiante

0/3

Créditos 1286

Gracias : 54

Volver arriba Ir abajo

RPG Maker XP Re: [XP][WecTools] Eron's File Window

Mensaje por Wecoc el 2016-05-23, 18:13

¡Pues se ve bastante bien la mejora, gracias! +1
Ahora lo añado al topic principal.

Lo de los nombres largos cortados es porque sigue sin estar muy optimizada la Window_List de la base, en principio si son muy largos tiene que salir hasta donde quepa + ".." (por ejemplo "Archivos de progra..", el problema es que depende del tipo de letra y el text_size hace lo que quiere.
avatar
Wecoc
Administrador
Administrador



Créditos 9217

Gracias : 493

Volver arriba Ir abajo

RPG Maker XP Re: [XP][WecTools] Eron's File Window

Mensaje por newold el 2016-06-09, 22:15

Yo con mi editor para rellenar los list box hago lo siguiente:

- Primero solo se dibuja los textos que "caben" en el área visible del list box y cuando se hace scroll en la lista se redibuja de nuevo el área visible, esto hace que puedas cargar listas enormes sin mucho delay ni lag (cuando una línea de texto se dibuja también se cachea para que cuando la tenga que dibujar al hacer el scroll tire de cache, y en vez de draw_text use blt)
- Segundo, para dibujar todo el texto que hay en cada línea, primero se crea una imagen (Bitmap.new(1,1)) a la que se le asigna el formato del texto que tengas en tu list box (fuente, tamaño, negrita...) y usando la función text_size se comprueba si el texto que se va a dibujar "cabe" en el list box sabiendo el tamaño horizontal de éste. Si sobresale entonces se crea un loop que va restando 1 al tamaño de la fuente en la imagen creada y se sigue comprobando el text_size hasta que quepa en el list box, y entonces se usan esos datos para cachear una imagen con el texto deseado que va en cada línea. Así se ve el nombre completo de cada línea y se distingue perfectamente el texto (se podría hacer lo mismo con stretch_blt pero esto puede distorsionar el texto.) Se puede definir también un límite de tamaño para que la fuente no sea muy pequeña, pero eso ya a tu gusto.

Además yo tengo implementado en mis list box que si a pesar de las comprobaciones anteriores la fuente llega a ser la mínima soportada y el texto sigue sobresaliendo del list box, éste se corta, se le añade ... al final y al dejar el cursor encima se abre un popup que muestra el nombre completo.

Bueno te doy esa idea por si la quieres implementar en tu list box base
avatar
newold
Principiante
Principiante

0/3

Créditos 1096

Gracias : 71

Volver arriba Ir abajo

RPG Maker XP Re: [XP][WecTools] Eron's File Window

Mensaje por Wecoc el 2016-06-10, 12:13

Si sobresale entonces se crea un loop que va restando 1 al tamaño de la fuente en la imagen creada y se sigue comprobando el text_size hasta que quepa en el list box

Sí, me parece mejor solución la del loop que la que tenía hasta ahora en Window_List, que usaba el text_size de "A" para calcular el total aproximado de letras que caben.
En realidad es un cálculo simple, lo único que lo complica un poco es que además hay que tener en cuenta el text_size de "..." a la hora de ir quitando letras (pero solo si no cabe entero de buenas a primeras)

Me parecen interesantes todas éstas propuestas, la mayoría intentaré implementarlas para la siguiente versión.
avatar
Wecoc
Administrador
Administrador



Créditos 9217

Gracias : 493

Volver arriba Ir abajo

RPG Maker XP Re: [XP][WecTools] Eron's File Window

Mensaje por orochii el 2016-06-10, 14:01

Para el tamaño de "..." supongo que después de comprobarse que no va a caber, hacer un loop quitando letras hasta que quepa el "...".
Código:
string = "asdasdasdasdasdasdasd"
b = Bitmap.new(1,1)
max_width = 160
if (b.text_size(string) > max_width)
  while (b.text_size(string)+b.text_size("...") > max_width)
    string = string[0,string.size-1]
  end
end

No sé si esto funciona pero tenía ganas de poner algo xD.
avatar
orochii
Caballero Shiro
Caballero Shiro

0/3

Créditos 6388

Gracias : 332

Volver arriba Ir abajo

RPG Maker XP Re: [XP][WecTools] Eron's File Window

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.