Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

[XP] Loading Bar

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] Loading Bar

Mensaje por Wecoc el 2017-07-18, 21:44

Éste script crea una barra de cargado al iniciar el proyecto.

Es muy personalizable; se puede cambiar la posición, el ancho y alto, el color (incluso se pueden poner colores dinámicos según cuanto le quede, o usar una imagen como barra), se puede poner color de fondo... De todo. Eso sí, hay que saber algo de scripts para esas cosas. Por defecto sale verde en la parte de arriba y sobre fondo negro, a lo cutre pero efectivo xD

Por tal como está montado el script, la barra es lo primero que sale, antes que cualquier otra cosa. Aún así se puede modificar para que en vez de eso salga al iniciar nueva partida o al cargar partida. Otra opción podría ser dentro del propio título, pero sin mostrar/activar la ventana de título hasta el final del cargado.

Lo importante de éste script es que esa barra no es inútil, realmente se estan cargando los recursos gráficos del juego todos antes de iniciarlo, a diferencia de cargarse a medida que se van necesitando como ocurre por defecto, así que al usar éste script en principio deberías notar una considerable reducción del lag. No estoy seguro porque apenas lo he testeado así que si alguien me lo confirma me hará un gran favor xD Es compatible con todo y no se carga nada del juego así que podéis probarlo tranquilos.

Otro detalle; con alguna pequeña modificación se puede adaptar para VX y Ace. Para MV no hace falta porque ya tiene esa opción.

Código:
#==============================================================================
# ** [XP] Loading Bar [Versión Lite] 1.0
#------------------------------------------------------------------------------
# Autor: Wecoc - No requiere créditos
# La versión Lite no funciona con archivos RTP, pero va mucho más rápido
# a obtener los del propio proyecto, y sin tantos problemas en proyectos
# encriptados. Por lo tanto, es la ideal en juegos independizados.
#==============================================================================

module LoadingScreen

  LOAD_DATA_BACK = ""
 
  def self.create_sprites
    @sprite = Sprite.new
    @sprite.z = 9999
    @sprite.bitmap = Bitmap.new(640, 4)
    @sprite.bitmap.fill_rect(@sprite.bitmap.rect, Color.new(0, 255, 0))
    @background = Sprite.new
    @background.bitmap = RPG::Cache.title(LOAD_DATA_BACK) rescue nil
  end
 
  def self.load_file_data
    RPG::Cache.clear
    folders = Dir["Graphics/*"].select{|x| File.ftype(x) == "directory"}
    file_number = 0 ; files = [] ; n = 0
    for f in folders
      c = Dir["#{f}/*"]
      c = c.select{|x| [".png",".jpg",".bmp"].include?(File.extname(x))}
      files.concat(c)
      file_number += c.size
    end
    loop do
      n += 1
      file = files.shift
      break if file.nil?
      dir, base = File.dirname(file), File.basename(file)
      RPG::Cache.load_bitmap("#{dir}/", base) rescue nil
      self.draw_bar_state(n, file_number)
      break if n >= file_number or files.size == 0
    end
  end
 
  def self.draw_bar_state(n, file_number)
    return if @sprite.nil?
    w = @sprite.bitmap.width
    h = @sprite.bitmap.height
    nw = w * (n.to_f / file_number)
    color = Color.new(0, 255, 0)
    @sprite.bitmap.clear
    @sprite.bitmap.fill_rect(0, 0, nw.floor, h, color)
    Graphics.update if n % 2 == 0
  end
 
  def self.dispose_sprites
    @sprite.dispose
    @background.dispose
    @sprite = nil
    @background = nil
  end
end

LoadingScreen.create_sprites
LoadingScreen.load_file_data
LoadingScreen.dispose_sprites

Versión normal (vieja):

Código:
#==============================================================================
# ** [XP] Loading Bar
#------------------------------------------------------------------------------
# Author: Wecoc - No credits required
#==============================================================================

class Dir
  def self.folders(folder)
    all_files = Dir.open(folder).entries
    all_files.delete(".") ; all_files.delete("..")
    result_files = []
    for file in all_files
      if FileTest.exist?(folder + "/" + file)
        ftype = File.ftype(folder + "/" + file) rescue nil
        result_files.push(file) if ftype == "directory"
      end
    end
    return result_files
  end

  def self.files(folder, ext=nil)
    all_files = Dir.open(folder).entries
    result_files = []
    for file in all_files
      if FileTest.exist?(folder + "/" + file)
        ftype = File.ftype(folder + "/" + file) rescue nil
        result_files.push(file) if ftype == "file"
      end
    end
    return result_files if ext == nil
    return result_files.select {|d| d.ext?(ext)}
  end
end

module LoadingScreen
  
  GPPSA = Win32API.new('kernel32', 'GetPrivateProfileStringA', 'PPPPLP', 'L')
  dll = "\0" * 255
  GPPSA.call('Game', 'Library', '', dll, 255, '.\\Game.ini')
  dll.delete!("\0")
  RGSSGetRTPPath = Win32API.new(dll, 'RGSSGetRTPPath', 'L', 'L')
  RGSSGetPathWithRTP = Win32API.new(dll, 'RGSSGetPathWithRTP', 'L', 'P')
  
  def self.get_rtp_path(rtp = 1)
    result = RGSSGetPathWithRTP.call(RGSSGetRTPPath.call(rtp))
    return result.gsub(File::ALT_SEPARATOR, File::SEPARATOR)
  end
  
  def self.get_file_number
    n = 0
    data_folders = []
    data_folders.push(Dir.getwd + "/Graphics/")
    for i in 1..3
      rtp_path = self.get_rtp_path(i)
      data_folders.push(rtp_path + "/Graphics/") if rtp_path != ''
    end
    for f in data_folders
      for folder in Dir.folders(f)
        inside_folder = f + folder + "/"
        for file in Dir.files(inside_folder)
          n += 1
        end
      end
    end
    return n
  end

  LOAD_DATA_BACK = ""
  
  def self.create_sprites
    @sprite = Sprite.new
    @sprite.z = 9999
    @sprite.bitmap = Bitmap.new(640, 4)
    @sprite.bitmap.fill_rect(@sprite.bitmap.rect, Color.new(0, 255, 0))
    @background = Sprite.new
    @background.bitmap = RPG::Cache.title(LOAD_DATA_BACK) rescue nil
  end
  
  def self.load_file_data
    RPG::Cache.clear
    file_number = self.get_file_number
    n = 0
    data_folders = []
    data_folders.push(Dir.getwd + "/Graphics/")
    for i in 1..3
      rtp_path = self.get_rtp_path(i)
      data_folders.push(rtp_path + "/Graphics/") if rtp_path != ''
    end
    for f in data_folders
      for folder in Dir.folders(f)
        inside_folder = f + folder + "/"
        for file in Dir.files(inside_folder)
          RPG::Cache.load_bitmap(inside_folder, file)
          n += 1
          if !@sprite.nil?
            w = @sprite.bitmap.width
            h = @sprite.bitmap.height
            nw = w * (n.to_f / file_number)
            color = Color.new(0, 255, 0)
            @sprite.bitmap.clear
            @sprite.bitmap.fill_rect(0, 0, nw.floor, h, color)
            Graphics.update if n % 2 == 0
          end
        end
      end
    end
  end
  
  def self.dispose_sprites
    @sprite.dispose
    @background.dispose
    @sprite = nil
    @background = nil
  end
end

LoadingScreen.create_sprites
LoadingScreen.load_file_data
LoadingScreen.dispose_sprites

Lo hice en pocos minutos y no me hizo sudar demasiado la frente, así que no pido créditos.
Además reusé algunas cosas que ya tenía creadas para WecTools.

PD A: A mí me tarda unos 7 segundos al completarse en un proyecto vacío.
PD B: Solo carga de antemano los gráficos principales. Posiblemente se podría llegar a hacer lo mismo con otras cosas; si cargara los audio de antemano sería un puntazo, quizá se solucionaría el problema de los OGG, pero es algo mucho más difícil de hacer si es que es posible y personalmente no quiero dedicarle tanto esfuerzo a ésto.


Última edición por Wecoc el 2018-01-29, 23:19, editado 2 veces
avatar
Wecoc
Administrador
Administrador



Créditos 12340

Gracias : 579

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Loading Bar

Mensaje por Producciones The Golden el 2017-07-19, 01:58

Super interesante el que en verdad sirva a diferencia de muchos otros! y reduce en parte el lag, en mi proyecto abierto de The Binding of Alexis (que con tilesets, sonidos, animaciones ya se va pareciendo a TBoI X3) tenía un sistema de corazones que carga de una sola hasta 20 imágenes en simultaneo en un solo evento común y... generaba un montón de lag XD así que lo dividí en tres eventos comunes y desapareció, y ahora los uní devuelta y con tu script el lag es pasable; también hay un sistema de colocado de bombas a lo Bomberman que no da lag en sí, pero como consecuencia al "colocar" una bomba esta aparece en un esquina y luego se teletransporta a donde está el jugador, mientras que con tu script aparece directamente donde el jugador, como debe ser!
Definitivamente es un puntazo para cualquier proyecto, +1 sin dudarlo (ah, no lo utilizaré, y si lo hiciera te daría créditos ;) ).
Eso fue todo... hasta pronto!  Warrior

PD A: Me  carga en 10 segundos XD.
PD B: ¿Sería muy distinto el sistema de cargado para los audios?
avatar
Producciones The Golden
Veterano
Veterano

0/3

Créditos 656

Gracias : 71

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Loading Bar

Mensaje por Eron el 2017-07-19, 08:12

Por el modo como funciona el formato ogg lo de las músicas estoy casi seguro que no es posible. Aún así sigue siendo muy interesante el planteamiento del script =)

Lo miré por encima y por lo visto no solo se puede hacer con barra, cualquier posibilidad gráfica vale; se puede poner un logo de cargado de esos que salen "Loading. Loading.. Loading...", texto del porcentaje o una de esas rueditas que giran, es cuestión de controlar el frame del sprite según el valor n, ¿cierto? =D

Oh y también se puede dejar sin nada si solo usas LoadingScreen.load_file_data, tarda un poco más de lo normal en cargar el proyecto pero no tanto como si usas la opción de mostrar barra, así que no molesta, y se me ocurre aprovechar una de esas escenas de logo antes de título para ese cometido.

También se me ocurrió un añadido que se podría hacerle, a ver qué te parece. A ver, como el script sirve para bajar el lag pero es no necesario para que el programa corra como siempre, quizá estaría bien asignar una tecla de escape por si en un determinado juego/PC la barra es tediosamente lenta. Abortar el método si presionas ESC debería ser sencillo.
avatar
Eron
Principiante
Principiante

0/3

Créditos 3599

Gracias : 60

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Loading Bar

Mensaje por Ledai el 2017-07-20, 16:08

Es un script muy MUY interesante a la hora de agilizar el proceso de un proyecto. Y Lo que más me atrae del tema es que sea tan funcional; es una pena que los audios no se puedan añadir a la carga, pues sería el nova-más!!

Solo me gustaría saber cómo configurar un poco los gráficos de la barra; los colores y etc... (o incluso saber si se podría poner con un llamar script en una escena hecha por enguine antes de la pantalla de título; aunque eso sería opcional) Con una mini guía de las líneas a editar en el script sería suficiente para orientarse y no romper nada.

Una idea colosal! Este script tiene pinta de ofrecer grandes cosas con el tiempo!!!

Ed: Bueno, me he atrevido a trastear con las medidas a ciegas, y ha salido esto aprovechando la imagen de transición entre escenas:

La verdad es que con un poco de practica pueden llegar a hacerse cosas muy chulaaaas!!!!!
avatar
Ledai
Aventurero
Aventurero

0/3

Créditos 4835

Gracias : 195

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Loading Bar

Mensaje por Wecoc el 2017-07-20, 22:51

Bueno, puedo explicaros cómo hacer algunas cosas.

Primero de todo, comentar que se usan 3 llamadas de script, una que crea los sprites de fondo y barra, otra que hace todo el proceso en loop, y la última que borra esos sprites. Como ya ha dicho Eron el primero y el último son opcionales, en ese caso entonces el juego solo tardaría un poco más a cargarse y ya está.

Por defecto estan justo al final de todo del script, las últimas líneas, pero en vez de ahí se pueden poner en otra parte. Por ejemplo si se quiere que salga la barra tras pulsar Nueva partida se pueden poner en el update de Scene_Title directamente.

Imagen:

Como ya se mencionó si se usa un script de mostrar logo antes de título se puede usar para cargar ahí las bitmap, con o sin barra.
Otra opción posiblemente más adecuada en ciertos casos es la de crearse una escena específica Scene_Loading, de modo que se use de puente al iniciar o cargar partida, antes de ir a Scene_Map. Por ahora no abarcaré esa posibilidad, pero sepáis que es una opción.

Posición y tamaño de la barra

Eso se define dentro del método create_sprites.

Hay una línea en la que pone ésto:
@sprite.bitmap = Bitmap.new(640, 4)

El 640 hace referencia al ancho y el 4 al alto de la barra.
Luego justo antes de esa línea se puede asignar la posición de la barra con:
@sprite.x = X
@sprite.y = Y

Por ejemplo, con @sprite.y = 480 - 4 saldría similar a ahora pero justo debajo del todo.

Color de la barra

El color de la barra se define dentro de load_file_data.
Hay una línea en la que pone:
color = Color.new(0, 255, 0)
Ahí se cambia por el color que se quiera. Los valores RGB pueden depender del estado actual de la barra.
En el siguiente ejemplo la barra pasa de roja a verde según se carga.

Imagen:

Mostrar porcentaje
Justo después del fill_rect del color que se acaba de indicar, se puede añadir un texto con el porcentaje actual

Imagen:

Alternativamente, si se montan las dimensiones del sprite de otro modo y se quita el fill_rect y lo del color, se puede hacer que muestre solo el porcentaje, sin barra.
Yo he hecho otra versión en la que muestra el valor real de bitmap cargadas respecto al total.

Imagen:

Definir las propiedades de la font fuera del ciclo en vez de dentro del ciclo puede agilizar un poco el proceso, solo lo he puesto así para que se entienda un poco más.

Imagen como barra

Hay muchas formas de usar una imagen como barra mediante script, yo mismo hice una hace tiempo pero podéis usar scripts de barras para batallas, o HUD de referencia sin problemas. El modo más simple es teniendo una imagen única para la barra y pasándola a nuestra bitmap mediante el método blt, o si no stretch_blt si se quiere que empiece muy estrecha y se vaya estirando.

Yo he hecho ésta de ejemplo:


Se carga al principio del todo de los bucles, y luego a cada iteración se llama al método, en éste caso blt.
Aquí hay montones de posibilidades.

Imagen:

Ciclos

En vez de una barra puede interesar un ciclo, por ejemplo un texto que diga "Cargando" y los puntos suspensivos vayan cambiando como lo que dijo Eron.
Por desgracia ese proceso es el más lento con diferencia puesto que requiere un Graphics.update en cada iteración sin excepción.
Aún así es factible así que muestro cómo sería.

En ese caso hay que definir una nueva variable que controle el frame.

Imagen:

En vez de texto creo que lo más interesante de éste tipo de ciclos es crearse una imagen con múltiples frames. Yo he hecho ésta de ejemplo, con una rejilla de 48x48, disculpen su cutrería:


Y queda así:

Imagen:

Eso serían todas las modificaciones que se me ocurren.
El script en algunos juegos puede ser muy útil y en otros solo una molestia, depende de cada caso, así que si lo usáis intentad hacerlo de modo que moleste lo menos posible.
avatar
Wecoc
Administrador
Administrador



Créditos 12340

Gracias : 579

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Loading Bar

Mensaje por orochii el 2017-11-12, 17:58

No sé cómo arreglar el error ese de los encriptados, así que hice un matamarcianos chafa xD. No pido créditos (?).

Código:
#==============================================================================
# ** [XP] Loading Bar
#------------------------------------------------------------------------------
# Author: Wecoc - No credits required
#==============================================================================

class Dir
  def self.folders(folder)
    all_files = Dir.open(folder).entries
    all_files.delete(".") ; all_files.delete("..")
    result_files = []
    for file in all_files
      if FileTest.exist?(folder + "/" + file)
        ftype = File.ftype(folder + "/" + file) rescue nil
        result_files.push(file) if ftype == "directory"
      end
    end
    return result_files
  end

  def self.files(folder, ext=nil)
    all_files = Dir.open(folder).entries
    result_files = []
    for file in all_files
      if FileTest.exist?(folder + "/" + file)
        ftype = File.ftype(folder + "/" + file) rescue nil
        result_files.push(file) if ftype == "file"
      end
    end
    return result_files if ext == nil
    return result_files.select {|d| d.ext?(ext)}
  end
end

module LoadingScreen
  
  GPPSA = Win32API.new('kernel32', 'GetPrivateProfileStringA', 'PPPPLP', 'L')
  dll = "\0" * 255
  GPPSA.call('Game', 'Library', '', dll, 255, '.\\Game.ini')
  dll.delete!("\0")
  RGSSGetRTPPath = Win32API.new(dll, 'RGSSGetRTPPath', 'L', 'L')
  RGSSGetPathWithRTP = Win32API.new(dll, 'RGSSGetPathWithRTP', 'L', 'P')
  
  def self.get_rtp_path(rtp = 1)
    result = RGSSGetPathWithRTP.call(RGSSGetRTPPath.call(rtp))
    return result.gsub(File::ALT_SEPARATOR, File::SEPARATOR)
  end
  
  def self.get_file_number
    n = 0
    data_folders = []
    data_folders.push(Dir.getwd + "/Graphics/")
    for i in 1..3
      rtp_path = self.get_rtp_path(i)
      data_folders.push(rtp_path + "/Graphics/") if rtp_path != ''
    end
    for f in data_folders
      for folder in Dir.folders(f)
        inside_folder = f + folder + "/"
        for file in Dir.files(inside_folder)
          n += 1
        end
      end
    end
    return n
  end

  LOAD_DATA_BACK = ""
  
  def self.create_sprites
    @sprite = Sprite.new
    @sprite.y = 476
    @sprite.z = 9999
    @sprite.bitmap = Bitmap.new(640, 4)
    @sprite.bitmap.fill_rect(@sprite.bitmap.rect, Color.new(0, 255, 0))
    @background = Sprite.new
    @background.bitmap = RPG::Cache.title(LOAD_DATA_BACK) rescue nil
    @sprite_player = Sprite.new
    @sprite_player.bitmap = RPG::Cache.picture("loadingAnim/spaceInv")
    @sprite_player.src_rect = Rect.new(0,0,16,16)
    @sprite_player.x = 320
    @sprite_player.y = 240
    @sprite_player.ox = @sprite_player.oy = 8
    @sprite_player.zoom_x = @sprite_player.zoom_y = 4
    @bullet_sprites = []
    @enemy_sprites = []
  end
  
  def self.load_file_data
    RPG::Cache.clear
    file_number = self.get_file_number
    n = 0
    data_folders = []
    data_folders.push(Dir.getwd + "/Graphics/")
    for i in 1..3
      rtp_path = self.get_rtp_path(i)
      data_folders.push(rtp_path + "/Graphics/") if rtp_path != ''
    end
    for f in data_folders
      for folder in Dir.folders(f)
        inside_folder = f + folder + "/"
        for file in Dir.files(inside_folder)
          update_ship
          update_bullets
          update_enemies
          RPG::Cache.load_bitmap(inside_folder, file)
          n += 1
          if !@sprite.nil?
            w = @sprite.bitmap.width
            h = @sprite.bitmap.height
            nw = w * (n.to_f / file_number)
            color = Color.new(0, 255, 0)
            @sprite.bitmap.clear
            @sprite.bitmap.fill_rect(0, 0, nw.floor, h, color)
            Graphics.update
            Input.update
          end
        end
      end
    end
  end
  
  def self.update_ship
    mx = my = 0
    case Input.dir8
    when 1
      mx=-1; my=1
    when 2
      mx=0; my=1
    when 3
      mx=1; my=1
    when 4
      mx=-1; my=0
    when 6
      mx=1; my=0
    when 7
      mx=-1; my=-1
    when 8
      mx=0; my=-1
    when 9
      mx=1; my=-1
    end
    
    spawn_bullet if Input.trigger?(Input::C)
    
    @sprite_player.x += mx*4
    @sprite_player.y += my*4
    @sprite_player.update
  end
  
  def self.spawn_bullet
    bullet = Sprite.new
    bullet.bitmap = @sprite_player.bitmap
    bullet.src_rect = Rect.new(0,16,8,8)
    bullet.ox = bullet.oy = 4
    bullet.zoom_x = bullet.zoom_y = 4
    bullet.x = @sprite_player.x
    bullet.y = @sprite_player.y
    @bullet_sprites.push(bullet)
  end
  
  def self.spawn_enemy
    rand_x = rand(160)
    rand_y = rand(32)
    
    enemy = Sprite.new
    enemy.bitmap = @sprite_player.bitmap
    enemy.src_rect = Rect.new(16,0,16,16)
    enemy.ox = enemy.oy = 4
    enemy.zoom_x = enemy.zoom_y = 4
    enemy.x = rand_x * 4
    enemy.y = rand_y * 4
    
    @enemy_sprites.push(enemy)
  end
  
  def self.update_bullets
    destroy_ = []
    for bullet in @bullet_sprites
      bullet.y -= 8
      destroy_.push(bullet) if bullet.y < 0
      bullet.update
    end
    despawn(destroy_, @bullet_sprites) if destroy_.size>0
  end
  
  def self.update_enemies
    destroy_ = []
    for enemy in @enemy_sprites
      destroy__ = []
      for bullet in @bullet_sprites
        dx = (bullet.x - enemy.x).abs
        dy = (bullet.y - enemy.y).abs
        if (dx<32 && dy<32)
          destroy_.push(enemy)
          destroy__.push(bullet)
        end
      end
      despawn(destroy__, @bullet_sprites) if destroy__.size>0
    end
    despawn(destroy_, @enemy_sprites) if destroy_.size>0
    
    spawn_enemy if(Graphics.frame_count%120 == 20)
  end
  
  def self.despawn(sprites, array)
    for s in sprites
      s.dispose
      array.delete(s)
    end
  end
  
  def self.dispose_sprites
    @sprite.dispose
    @background.dispose
    @sprite_player.dispose
    @sprite = nil
    @background = nil
    @sprite_player = nil
    for sprite in (@bullet_sprites + @enemy_sprites)
      sprite.dispose
    end
    @bullet_sprites = nil
    @enemy_sprites = nil
  end
end

LoadingScreen.create_sprites
LoadingScreen.load_file_data
LoadingScreen.dispose_sprites

Aquí la imagen, la ponen en una carpeta Graphics/Pictures/loadingAnim
La imagen debe llamarse spaceInv


Y ahí va una screen


Salut!
avatar
orochii
Reportero

0/3

Créditos 7611

Gracias : 413

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Loading Bar

Mensaje por Hk Diamond el 2017-11-20, 16:54

Hola chicos, vengo porque se me cruzaron los cables con otra idea, se me ocurre "cruzar" este script con el de "MOG - Advanced Load Bar XP (v1.0)" que es una fake loading bar, pero que tiene unas animaciones *pone la mano como los italianos*
quienes conoscan el script de mog sabran de que hablo, para los que no, les digo en la sig imagen, las barras laterales que dicen loading, estan en movimiento, junto con la que carga abajo, el please wait, cargando, el character a la izq tambien esta animado, y la imagen de fondo es al azar de una galeria en el proyecto
estas imagenes se puede cruzar con el loading file y con el save data del juego, que Wecoc menciono que no iba a meterse "por ahora", (¿pero como eso lo dijo en junio y estamos en noviembre?  ¬¬ )

La idea de "cruzar" es juntar las propiedades graficas del mog, con la la utilidad del de wecoc, lo hiciera yo pero no se de scripts

¿ que tan viable es la idea ?, ¿ quien lo quiere hacer?

mog fake load bar:

Aca el codigo.
Código:
#===============================================================================
# +++ MOG - Advanced Load Bar XP (v1.0) +++
#===============================================================================
# By Moghunter
# http://www.atelier-rgss.com  
#===============================================================================
# Apresenta uma barra de carregar entre as cenas de Save e Load.
#
# O propósito deste Script é apresentar alguns artworks de seu  jogo
# enquanto o jogador espera a barra de leitura.
#
#===============================================================================
# Você pode adpatar esse script em alguma outra Scene ou ativar pelo evento.
# Basta usar este código.
#
# $scene = Scene_Load_Bar.new
#===============================================================================
module MOG_LOAD_BAR
   # Tempo para fazer load.(Segundos)
   LOAD_DURATION = 2
   # Ativar o sistema ao carregar o jogo.
   ENABLE_LOAD_BAR_FOR_SCENE_LOAD = true
   # Ativar o sistema ao salvar o jogo.
   ENABLE_LOAD_BAR_FOR_SCENE_SAVE = true  
   # Definição das imagens que ficarão no plano de fundo.
   LOAD_BACKGROUND_PICTURES = [
   "Background_1",
   "Background_2",
   "Background_3",
   "Background_4",
   "Background_5",
   "Background_6"
   #"Background_7",
   #"Background_8",
   #"Background_9",
   #"Background_10",
   # ...
   ]
   # Ativar ordem aleatória ou sequencial.
   PICTURE_RANDOM_SELECTION = true  
   # Posição do geral da Hud.
   LOAD_BAR_POSITION = [90,400]
   # Posição do medidor.
   LOAD_BAR_METER_POSITION = [11,27]
   # Posição do Texto.
   LOAD_BAR_TEXT_POSITION = [ 10, -3]
   # Som ao carregar o arquivo.
   LOAD_SE = ""
   # Velocidade da animação do medidor.
   LOAD_BAR_FLOW_SPEED = 25
   # Definição da Cena que será ativada após salvar via menu.
   # Caso o save seja feito pelo evento, a cena será o Mapa.
   RETURN_TO_SCENE = Scene_Menu.new(4)
   # Ativar a animação de levitação do texto.
   ENABLE_FLOAT_TEXT_ANIMATION = true
   # Apresentar o sprite do personagem.
   ENABLE_CHARACTER_SPRITE = true
   # Velocidade da animação do personagem.
   CHAR_ANIMATION_SPEED = 8
   # Direção do personagem.
   # 0 - Para baixo
   # 1 - Esquerda
   # 2 - Direita
   # 3 - Para cima
   CHARACTER_DIRECTION = 2
   # Posição do personagem na tela.
   CHARACTER_POSITION = [-40 , 55]
   # Ativar barras laterais.
   ENABLE_STRIPE_SPRITE = true
   # Velocidade das barras laterais.
   STRIPE_SPEED = 3
end

#=============================================================================
# ■ Game_Temp
#=============================================================================
class Game_Temp
  attr_accessor :load_bar_pre_index
  attr_accessor :load_char_pre_index
  attr_accessor :save_calling_load_bar
  
 #--------------------------------------------------------------------------
 # ● Initialize
 #--------------------------------------------------------------------------              
 alias load_bar_initialize initialize
 def initialize
     load_bar_initialize
     @load_bar_pre_index = -1
     @load_char_pre_index = -1
     @save_calling_load_bar = false
 end
  
end

#=============================================================================
# ■ Game_System
#=============================================================================
class Game_System
  attr_accessor :load_bar_pre_index
  
 #--------------------------------------------------------------------------
 # ● Initialize
 #--------------------------------------------------------------------------              
 alias load_bar_initialize initialize
 def initialize
     load_bar_initialize
     @load_bar_pre_index = 0
 end
 
 #--------------------------------------------------------------------------
 # ● BGS Stop
 #--------------------------------------------------------------------------            
 def bgs_stop
     Audio.bgs_stop
 end
end

#=============================================================================
# ■ Scene Load Bar
#=============================================================================
class Scene_Load_Bar
 include MOG_LOAD_BAR
  
 #--------------------------------------------------------------------------
 # ● Initialize
 #--------------------------------------------------------------------------            
 def initialize(type = 0)  
     @bar_type = type
     @load_duration_max = 40 * LOAD_DURATION
     @load_duration_max = 40 if @load_duration_max < 40  
     @load_duration = 0
     @pictures = LOAD_BACKGROUND_PICTURES
     create_background
     create_layout  
     create_load_bar
     create_text
     create_character
     create_side_strip
 end
  
 #--------------------------------------------------------------------------
 # ●  Create Character
 #--------------------------------------------------------------------------            
 def create_character
     @max_pary = $game_party.actors.size    
     @dir = CHARACTER_DIRECTION
     @dir = 2 if @dir < 0 or @dir > 3
     @frame_index = 0
     @char_index = rand(@max_pary)
     no_repeat_character
     $game_temp.load_char_pre_index = @char_index    
     @actor = $game_party.actors[@char_index]
     @actor = $game_party.actors[0] if @actor == nil
     @char_animation_speed = CHAR_ANIMATION_SPEED
     @character_image = RPG::Cache.character(@actor.character_name,
     @actor.character_hue)
     @cw = @character_image.width / 4
     @ch = @character_image.height / 4
     @character_bitmap = Bitmap.new(@cw,@ch)    
     @character_src_rect = Rect.new(@cw * @frame_index, @ch * @dir, @cw, @ch)
     @character_bitmap.blt(0,0, @character_image, @character_src_rect)    
     @character = Sprite.new
     @character.bitmap = @character_bitmap  
     @character.ox = @cw / 2
     @character.oy = @ch
     @character.x = LOAD_BAR_POSITION[0] + CHARACTER_POSITION[0]
     @character.y = LOAD_BAR_POSITION[1] + CHARACTER_POSITION[1]
     @character.z = 13
     @character.visible = ENABLE_CHARACTER_SPRITE
 end
 
 #--------------------------------------------------------------------------
 # ● Create Background
 #--------------------------------------------------------------------------          
 def create_background  
     @background = Sprite.new
     if PICTURE_RANDOM_SELECTION
        $game_system.load_bar_pre_index = rand(@pictures.size)
        no_repeat_picture
     end
     image_name = @pictures[$game_system.load_bar_pre_index]    
     image_name = "" if image_name == nil    
     @background.bitmap = RPG::Cache.picture(image_name)
     $game_temp.load_bar_pre_index = $game_system.load_bar_pre_index
     unless PICTURE_RANDOM_SELECTION
        $game_system.load_bar_pre_index += 1
        $game_system.load_bar_pre_index = 0 if $game_system.load_bar_pre_index > @pictures.size - 1
     end  
 end
  
 #--------------------------------------------------------------------------
 # ● No Repeat Charater
 #--------------------------------------------------------------------------            
 def no_repeat_character
     if @char_index == $game_temp.load_char_pre_index
        @char_index += 1
        @char_index = 0 if @char_index > @max_pary
     end  
 end
 
 #--------------------------------------------------------------------------
 # ● No Repeat Picture
 #--------------------------------------------------------------------------            
 def no_repeat_picture
     if $game_system.load_bar_pre_index == $game_temp.load_bar_pre_index
        $game_system.load_bar_pre_index += 1
        $game_system.load_bar_pre_index = 0 if $game_system.load_bar_pre_index > @pictures.size - 1
     end  
 end
 
 #--------------------------------------------------------------------------
 # ● Create Layout
 #--------------------------------------------------------------------------          
 def create_layout  
     @hud = Sprite.new
     @hud.bitmap = RPG::Cache.windowskin("Load_Bar_Layout")
     @hud.x = LOAD_BAR_POSITION[0]
     @hud.y = LOAD_BAR_POSITION[1]
     @hud.z = 10
 end
 
 #--------------------------------------------------------------------------
 # ● Create Layout
 #--------------------------------------------------------------------------          
 def create_side_strip
     if @bar_type == 0
        image_name_1 = "Load_Bar_Stripe1_L"
        image_name_2 = "Load_Bar_Stripe2_L"
     else  
        image_name_1 = "Load_Bar_Stripe1_S"
        image_name_2 = "Load_Bar_Stripe2_S"
     end  
     @stripe1 = Plane.new
     @stripe1.bitmap = RPG::Cache.windowskin(image_name_1)
     @stripe1.z = 1
     @stripe2 = Plane.new
     @stripe2.bitmap = RPG::Cache.windowskin(image_name_2)
     @stripe2.z = 1          
     @stripe1.visible = ENABLE_STRIPE_SPRITE
     @stripe2.visible = ENABLE_STRIPE_SPRITE
 end
 
 #--------------------------------------------------------------------------
 # ● Create Load Bar
 #--------------------------------------------------------------------------            
 def create_load_bar
     @bar_flow = 0
     @bar_image = RPG::Cache.windowskin("Load_Bar_Meter")
     @bar_bitmap = Bitmap.new(@bar_image.width,@bar_image.height)
     @bar_range = @bar_image.width / 3
     @bar_width = @bar_range  * @load_duration / @load_duration_max
     @bar_height = @bar_image.height
     @bar_width_old = @bar_width
     @bar_src_rect = Rect.new(@bar_flow, 0, @bar_width, @bar_height)
     @bar_bitmap.blt(0,0, @bar_image, @bar_src_rect)
     @bar_sprite = Sprite.new
     @bar_sprite.bitmap = @bar_bitmap
     @bar_sprite.z = 11
     @bar_sprite.x = LOAD_BAR_POSITION[0] + LOAD_BAR_METER_POSITION[0]
     @bar_sprite.y = LOAD_BAR_POSITION[1] + LOAD_BAR_METER_POSITION[1]
     update_bar_flow
 end
 
 #--------------------------------------------------------------------------
 # ● Create Text
 #--------------------------------------------------------------------------            
 def create_text
     @text_float_time = 0
     @text_float_y = 0
     @text_image = RPG::Cache.windowskin("Load_Bar_Text")
     @text_bitmap = Bitmap.new(@text_image.width,@text_image.height)
     @text_width = @text_image.width
     @text_height = @text_image.height / 2
     @text_src_rect = Rect.new(0, @text_height * @bar_type, @text_width, @text_height)
     @text_bitmap.blt(0,0, @text_image, @text_src_rect)  
     @text_sprite = Sprite.new
     @text_sprite.bitmap = @text_bitmap    
     @text_fy = LOAD_BAR_POSITION[1] + LOAD_BAR_TEXT_POSITION[1]
     @text_sprite.x = LOAD_BAR_POSITION[0] + LOAD_BAR_TEXT_POSITION[0]
     @text_sprite.y = @text_fy
     @text_sprite.z = 12
 end
 
 #--------------------------------------------------------------------------
 # ● Main
 #--------------------------------------------------------------------------          
 def main
     Graphics.transition
     execute_loop
     execute_dispose
 end  
 
 #--------------------------------------------------------------------------
 # ● Execute Loop
 #--------------------------------------------------------------------------          
 def execute_loop
     loop do
         Graphics.update
         update
         if $scene != self
            break
         end
     end  
  end
 
 #--------------------------------------------------------------------------
 # ● Execute Dispose
 #--------------------------------------------------------------------------            
 def execute_dispose
     @hud.bitmap.dispose
     @hud.dispose
     @stripe1.bitmap.dispose
     @stripe1.dispose    
     @stripe2.bitmap.dispose
     @stripe2.dispose        
     @bar_image.dispose
     @bar_bitmap.dispose
     @bar_sprite.bitmap.dispose
     @bar_sprite.dispose    
     @background.bitmap.dispose
     @background.dispose
     @text_image.dispose
     @text_bitmap.dispose
     @text_sprite.bitmap.dispose
     @text_sprite.dispose
     @character_image.dispose
     @character_bitmap.dispose
     @character.bitmap.dispose
     @character.dispose    
     Graphics.transition
     Graphics.freeze
 end  
 
 #--------------------------------------------------------------------------
 # ● Update
 #--------------------------------------------------------------------------            
 def update
     update_bar_flow
     update_bar_duration
     update_float_text
     update_character_animation
     update_slide_stripe
 end
 
 #--------------------------------------------------------------------------
 # ● Update Slide Stripe
 #--------------------------------------------------------------------------              
 def update_slide_stripe
     @stripe1.oy += STRIPE_SPEED
     @stripe2.ox += STRIPE_SPEED
 end  
  
 #--------------------------------------------------------------------------
 # ● Update Character Animation
 #--------------------------------------------------------------------------            
 def update_character_animation
     @char_animation_speed += 1
     if @char_animation_speed > CHAR_ANIMATION_SPEED
        @char_animation_speed = 0
        @character.bitmap.clear
        @character_src_rect = Rect.new(@cw * @frame_index, @ch * @dir, @cw, @ch)
        @character_bitmap.blt(0,0, @character_image, @character_src_rect)
        @frame_index += 1
        @frame_index = 0 if  @frame_index > 3
     end
 end
  
 #--------------------------------------------------------------------------
 # ● update_float_text
 #--------------------------------------------------------------------------            
 def update_float_text
     return unless ENABLE_FLOAT_TEXT_ANIMATION
     @text_float_time += 1
     case @text_float_time
        when 1..10
           @text_float_y += 1
        when 11..20
           @text_float_y -= 1
        else
          @text_float_y = 0
          @text_float_time = 0
     end
     @text_sprite.y = @text_fy + @text_float_y
 end
 
 #--------------------------------------------------------------------------
 # ● Update Bar Flow
 #--------------------------------------------------------------------------            
 def update_bar_flow
     @bar_sprite.bitmap.clear
     @bar_width = @bar_range  * @load_duration / @load_duration_max
     @bar_width = @bar_range if @load_duration > @load_duration_max
     @bar_src_rect = Rect.new(@bar_flow, 0,@bar_width, @bar_height)
     @bar_bitmap.blt(0,0, @bar_image, @bar_src_rect)
     @bar_flow += LOAD_BAR_FLOW_SPEED
     if @bar_flow >= @bar_image.width - @bar_range
        @bar_flow = 0    
     end
 end  
  
 #--------------------------------------------------------------------------
 # ● Update Bar Duration
 #--------------------------------------------------------------------------              
 def update_bar_duration
     @load_duration += 1
     if @load_duration == @load_duration_max
        Audio.se_play("Audio/SE/" + LOAD_SE,100,100) rescue nil
     elsif @load_duration == @load_duration_max + 10
        if @bar_type == 0 or $game_temp.save_calling_load_bar
           if @bar_type == 0
              $game_system.bgm_play($game_system.playing_bgm)
              $game_system.bgs_play($game_system.playing_bgs)
           end
           $scene = Scene_Map.new
        else  
           $scene = MOG_LOAD_BAR::RETURN_TO_SCENE
        end  
        $game_temp.save_calling_load_bar = false
     end
 end  
 
end

#=============================================================================
# ■ Scene Save
#=============================================================================
class Scene_Save < Scene_File
  
  #--------------------------------------------------------------------------
  # ● on_decision
  #--------------------------------------------------------------------------
  if MOG_LOAD_BAR::ENABLE_LOAD_BAR_FOR_SCENE_SAVE
     alias mog_fake_load_bar_on_decision on_decision
     def on_decision(filename)
         $game_temp.save_calling_load_bar = $game_temp.save_calling
         mog_fake_load_bar_on_decision(filename)
         $scene = Scene_Load_Bar.new(1)
     end
  end
end  

#=============================================================================
# ■ Scene Load
#=============================================================================
class Scene_Load < Scene_File  

  #--------------------------------------------------------------------------
  # ● on_decision
  #--------------------------------------------------------------------------    
  if MOG_LOAD_BAR::ENABLE_LOAD_BAR_FOR_SCENE_LOAD
     alias mog_fake_load_bar_on_decision2 on_decision
     def on_decision(filename)
         mog_fake_load_bar_on_decision2(filename)
         if FileTest.exist?(filename)
            $scene = Scene_Load_Bar.new(0)
            $game_system.bgm_stop  
            $game_system.bgs_stop
         end
     end
  end
end  

$mog_xp_advanced_load_bar = true
avatar
Hk Diamond
Iniciado
Iniciado

0/3

Créditos 14

Gracias : 2

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Loading Bar

Mensaje por Wecoc el 2017-11-21, 17:13

Lo miré pero no entiendo mucho de los sistemas MOG. Creo que sí es viable aunque puede que hubiera que reescribir buena parte...

Igualmente el problema principal de la Loading Bar ahora mismo es ese de que no funciona en proyectos compilados, eso es un problemón y no conozco manera de arreglarlo así que la pregunta es si vale la pena adaptarlo a nada más si de por sí tiene ese problema u_u
avatar
Wecoc
Administrador
Administrador



Créditos 12340

Gracias : 579

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Loading Bar

Mensaje por Hk Diamond el 2017-11-30, 01:23

Las lineas son de la 90 a la 99 y de la 148 a la 151
pero no se como hacer que esten animadas

Spoiler:
Código:
#==========================================================#====================
# ** [XP] Loading Bar
#------------------------------------------------------------------------------
# Author: Wecoc - No credits required
#==============================================================================

class Dir
 def self.folders(folder)
   all_files = Dir.open(folder).entries
   all_files.delete(".") ; all_files.delete("..")
   result_files = []
   for file in all_files
     if FileTest.exist?(folder + "/" + file)
       ftype = File.ftype(folder + "/" + file) rescue nil
       result_files.push(file) if ftype == "directory"
     end
   end
   return result_files
 end

 def self.files(folder, ext=nil)
   all_files = Dir.open(folder).entries
   result_files = []
   for file in all_files
     if FileTest.exist?(folder + "/" + file)
       ftype = File.ftype(folder + "/" + file) rescue nil
       result_files.push(file) if ftype == "file"
     end
   end
   return result_files if ext == nil
   return result_files.select {|d| d.ext?(ext)}
 end
end

module LoadingScreen
 
 GPPSA = Win32API.new('kernel32', 'GetPrivateProfileStringA', 'PPPPLP', 'L')
 dll = "\0" * 255
 GPPSA.call('Game', 'Library', '', dll, 255, '.\\Game.ini')
 dll.delete!("\0")
 RGSSGetRTPPath = Win32API.new(dll, 'RGSSGetRTPPath', 'L', 'L')
 RGSSGetPathWithRTP = Win32API.new(dll, 'RGSSGetPathWithRTP', 'L', 'P')
 
 
 
 def self.get_rtp_path(rtp = 1)
   result = RGSSGetPathWithRTP.call(RGSSGetRTPPath.call(rtp))
   return result.gsub(File::ALT_SEPARATOR, File::SEPARATOR)
 end
 
 def self.get_file_number
   n = 0
   data_folders = []
   data_folders.push(Dir.getwd + "/Graphics/")
   for i in 1..3
     rtp_path = self.get_rtp_path(i)
     data_folders.push(rtp_path + "/Graphics/") if rtp_path != ''
   end
   for f in data_folders
     for folder in Dir.folders(f)
       inside_folder = f + folder + "/"
       for file in Dir.files(inside_folder)
         n += 1
       end
     end
   end
   return n
 end

 LOAD_DATA_BACK = "t1"
 
# aca comienza la cuestion de la barra y los bitmaps

   #
 def self.create_sprites
   @sprite = Sprite.new
   @sprite.z = 9999
   @sprite.y = 400
   @sprite.bitmap = Bitmap.new(640, 100)
   @sprite.bitmap.fill_rect(@sprite.bitmap.rect, Color.new(0, 255, 0))
   @background = Sprite.new
   @background.bitmap = RPG::Cache.title(LOAD_DATA_BACK) rescue nil
   
 
   
 
   #LOADING STRIPES
   
   
    @stripe1 = Plane.new
    @stripe1.bitmap = RPG::Cache.windowskin("Load_Bar_Stripe1_L")
    @stripe1.z = 1
    @stripe2 = Plane.new
    @stripe2.bitmap = RPG::Cache.windowskin("Load_Bar_Stripe2_L")
    @stripe2.z = 1
    @stripe3 = Plane.new
    @stripe3.bitmap = RPG::Cache.windowskin("Load_Bar_Layout")
    #@stripe1.oy += 3
    #@stripe2.ox += 3
         
   
 end

 def self.load_file_data
   RPG::Cache.clear
   file_number = self.get_file_number
   n = 0
   data_folders = []
   data_folders.push(Dir.getwd + "/Graphics/")
   for i in 1..3
     rtp_path = self.get_rtp_path(i)
     data_folders.push(rtp_path + "/Graphics/") if rtp_path != ''
   end
   
   #@text_image = RPG::Cache.windowskin("Load_Bar_Text")
   #bar2 = RPG::Cache.windowskin("Load_Bar_Layout")
   bar = RPG::Cache.windowskin("Load_Bar_Meter")
   for f in data_folders
     for folder in Dir.folders(f)
       inside_folder = f + folder + "/"
       for file in Dir.files(inside_folder)
         RPG::Cache.load_bitmap(inside_folder, file)
         n += 1
         if !@sprite.nil?
           w = @sprite.bitmap.width
           h = @sprite.bitmap.height
           nw = w * (n.to_f / file_number)
           #color = Color.new(0, 255, 0)#(0, 255, 0)
           @sprite.bitmap.clear
           
           rect = Rect.new(0, 0, nw, bar.height)
           @sprite.bitmap.blt(0, 0, bar, rect)
           #@sprite.bitmap.fill_rect(0, 0, nw.floor, h, color)    
                     
           Graphics.update if n % 2 == 0
          end
       end
     end
   end
 end
 
 def self.dispose_sprites
   @sprite.dispose
   @background.dispose
   @sprite = nil
   @background = nil
                     #___________________________________________________
    @stripe1.bitmap.dispose
    @stripe1.dispose    
    @stripe2.bitmap.dispose
    @stripe2.dispose
   
   
                     #___________________________________________________
   
   
 end # end del script main  
end
#LoadingScreen.create_sprites
#LoadingScreen.load_file_data
#LoadingScreen.dispose_sprites
avatar
Hk Diamond
Iniciado
Iniciado

0/3

Créditos 14

Gracias : 2

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Loading Bar

Mensaje por orochii el 2017-11-30, 05:08

Hice esto, es lo más chapuza que he hecho en mi vida xD. Básicamente copié dos líneas que ya tenías por ahí, y las pegué en otra parte. En teoría sirve, no tengo las imágenes y no tengo ganas de buscarlas. ¡Pero debería funcionar xd! (al menos para hacer que se muevan las stripes esas).

Código:
#==========================================================#====================
# ** [XP] Loading Bar
#------------------------------------------------------------------------------
# Author: Wecoc - No credits required
#==============================================================================

class Dir
 def self.folders(folder)
  all_files = Dir.open(folder).entries
  all_files.delete(".") ; all_files.delete("..")
  result_files = []
  for file in all_files
    if FileTest.exist?(folder + "/" + file)
      ftype = File.ftype(folder + "/" + file) rescue nil
      result_files.push(file) if ftype == "directory"
    end
  end
  return result_files
 end

 def self.files(folder, ext=nil)
  all_files = Dir.open(folder).entries
  result_files = []
  for file in all_files
    if FileTest.exist?(folder + "/" + file)
      ftype = File.ftype(folder + "/" + file) rescue nil
      result_files.push(file) if ftype == "file"
    end
  end
  return result_files if ext == nil
  return result_files.select {|d| d.ext?(ext)}
 end
end

module LoadingScreen
 
 GPPSA = Win32API.new('kernel32', 'GetPrivateProfileStringA', 'PPPPLP', 'L')
 dll = "\0" * 255
 GPPSA.call('Game', 'Library', '', dll, 255, '.\\Game.ini')
 dll.delete!("\0")
 RGSSGetRTPPath = Win32API.new(dll, 'RGSSGetRTPPath', 'L', 'L')
 RGSSGetPathWithRTP = Win32API.new(dll, 'RGSSGetPathWithRTP', 'L', 'P')
 
 
 
 def self.get_rtp_path(rtp = 1)
  result = RGSSGetPathWithRTP.call(RGSSGetRTPPath.call(rtp))
  return result.gsub(File::ALT_SEPARATOR, File::SEPARATOR)
 end
 
 def self.get_file_number
  n = 0
  data_folders = []
  data_folders.push(Dir.getwd + "/Graphics/")
  for i in 1..3
    rtp_path = self.get_rtp_path(i)
    data_folders.push(rtp_path + "/Graphics/") if rtp_path != ''
  end
  for f in data_folders
    for folder in Dir.folders(f)
      inside_folder = f + folder + "/"
      for file in Dir.files(inside_folder)
        n += 1
      end
    end
  end
  return n
 end

 LOAD_DATA_BACK = "t1"
 
# aca comienza la cuestion de la barra y los bitmaps

  #
 def self.create_sprites
  @sprite = Sprite.new
  @sprite.z = 9999
  @sprite.y = 400
  @sprite.bitmap = Bitmap.new(640, 100)
  @sprite.bitmap.fill_rect(@sprite.bitmap.rect, Color.new(0, 255, 0))
  @background = Sprite.new
  @background.bitmap = RPG::Cache.title(LOAD_DATA_BACK) rescue nil
 
 
 
 
  #LOADING STRIPES
 
 
    @stripe1 = Plane.new
    @stripe1.bitmap = RPG::Cache.windowskin("Load_Bar_Stripe1_L")
    @stripe1.z = 1
    @stripe2 = Plane.new
    @stripe2.bitmap = RPG::Cache.windowskin("Load_Bar_Stripe2_L")
    @stripe2.z = 1
    @stripe3 = Plane.new
    @stripe3.bitmap = RPG::Cache.windowskin("Load_Bar_Layout")
   
       
 
 end

 def self.load_file_data
  RPG::Cache.clear
  file_number = self.get_file_number
  n = 0
  data_folders = []
  data_folders.push(Dir.getwd + "/Graphics/")
  for i in 1..3
    rtp_path = self.get_rtp_path(i)
    data_folders.push(rtp_path + "/Graphics/") if rtp_path != ''
  end
 
  #@text_image = RPG::Cache.windowskin("Load_Bar_Text")
  #bar2 = RPG::Cache.windowskin("Load_Bar_Layout")
  bar = RPG::Cache.windowskin("Load_Bar_Meter")
  for f in data_folders
    for folder in Dir.folders(f)
      inside_folder = f + folder + "/"
      for file in Dir.files(inside_folder)
        RPG::Cache.load_bitmap(inside_folder, file)
        @stripe1.oy += 3
        @stripe2.ox += 3
        n += 1
        if !@sprite.nil?
          w = @sprite.bitmap.width
          h = @sprite.bitmap.height
          nw = w * (n.to_f / file_number)
          #color = Color.new(0, 255, 0)#(0, 255, 0)
          @sprite.bitmap.clear
         
          rect = Rect.new(0, 0, nw, bar.height)
          @sprite.bitmap.blt(0, 0, bar, rect)
          #@sprite.bitmap.fill_rect(0, 0, nw.floor, h, color)
         
          Graphics.update if n % 2 == 0
          end
      end
    end
  end
 end
 
 def self.dispose_sprites
  @sprite.dispose
  @background.dispose
  @sprite = nil
  @background = nil
                    #___________________________________________________
    @stripe1.bitmap.dispose
    @stripe1.dispose   
    @stripe2.bitmap.dispose
    @stripe2.dispose
   
 
                    #___________________________________________________
 
 
 end # end del script main 
end
#LoadingScreen.create_sprites
#LoadingScreen.load_file_data
#LoadingScreen.dispose_sprites

Salut!
avatar
orochii
Reportero

0/3

Créditos 7611

Gracias : 413

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Loading Bar

Mensaje por Wecoc el 2018-01-29, 03:04

He hecho una Versión Lite del script, podéis verla en el post principal. Pongo las diferencias conforme a la normal.

- En teoría no debería dar problemas en proyectos encriptados Edit: No, sigue sin funcionar en encriptados
- No busca archivos RTP, simplemente ignora esos. No habrá diferencia si el proyecto está independizado.
- En principio va algo más rápido que la versión extendida.

No he podido testearlo debidamente pero con suerte se arreglarán los problemas que dio en algunos casos la otra versión. Esperaré vuestras respuestas sobre ello.

Edito: No funciona en encriptados... Eso es mala notícia pero entonces no veo ningún modo de poder plantear el script en el que funcione con encriptados.
avatar
Wecoc
Administrador
Administrador



Créditos 12340

Gracias : 579

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Loading Bar

Mensaje por Wecoc el 2018-02-04, 02:54

Entre Eron y yo hemos acabado haciendo un script que hace algo parecido a lo de éste topic pero más "sutil". Está preparado para que por fín funcione en proyectos encriptados (ya fue comprobado) gracias a una idea de Eron para afrontarlo, pero su funcionamiento es distinto.

Nota:
En cuanto al script general no parece haber solución a ese problema; no hace fallar el juego pero directamente se salta la función de script si el proyecto está encriptado.

A grandes rasgos viene a ser lo mismo que antes pero sin barra, y funciona como una réplica del Garbage Collector. En las instrucciones del script está explicado mejor xD Recomiendo mirar todos los comentarios, es un script corto y fácil de entender.

Código:
#------------------------------------------------------------------------------
# [XP] Eron's Garbage Collector
#------------------------------------------------------------------------------
# Este script guarda la información de las bitmaps cargadas en el juego de modo
# que al cargar el proyecto la próxima vez, ya se carguen directamente.
#
# De esa forma cuanto más avanzado está el juego más le cuesta cargar el
# contenido en la pantalla de título (unos 3 segundos de media), pero a cambio
# tendrá menos problemas de rendimiento en cargar las bitmaps aunque te vayas de
# la partida, lo que hace disminuir el lag.
#
# Aún así muchas veces apenas se notará la diferencia :|
#------------------------------------------------------------------------------
# Autores: Eron & Wecoc (no requiere créditos)

#==============================================================================
# * Parte 1 - Guardar datos en Data/Cache.rxdata sobre la bitmap siendo cargada
#==============================================================================

module EronGC
  module Cache
    def self.load_bitmap(folder_name, filename, hue=0)
      file = File.open("Data/Cache.rxdata", "rb")
      new_data = [folder_name, filename, hue]
      data = []
      loop do
        current_data = Marshal.load(file) rescue nil
        break if current_data == nil
        if current_data == new_data
          file.close
          return
        end
        data.push(current_data)
      end
      file.close
      file = File.open("Data/Cache.rxdata", "ab")
      Marshal.dump(new_data, file)
      file.close
    end
  end
end

#==============================================================================
# * Parte 2 - Cada vez que se carga una bitmap en el juego, guardar su dirección
#==============================================================================

module RPG
  module Cache
    @cache = {}
    class << self
      alias load_bitmap_safe load_bitmap unless $@
      def load_bitmap(folder_name, filename, hue=0)
        path = folder_name + filename
        if not @cache.include?(path) or @cache[path].disposed?
          if filename != ""
            if !FileTest.exist?("Data/Cache.rxdata")
              file = File.open("Data/Cache.rxdata", "wb") ; file.close
            end
            EronGC::Cache.load_bitmap(folder_name, filename, hue)
          end
        end
        load_bitmap_safe(folder_name, filename, hue=0)
      end
    end
  end
end

#==============================================================================
# * Parte 3 - Cargar datos almacenados al cargar proyecto / Configuración
#==============================================================================

begin
  #----------------------------------------------------------------------------
  # Activar o desactivar script
  # Para que solo funcione cuando NO está en modo Debug: GC_CACHE_ERON = !$DEBUG
  GC_CACHE_ERON = true
  #----------------------------------------------------------------------------
  if GC_CACHE_ERON && FileTest.exist?("Data/Cache.rxdata")
    file = File.open("Data/Cache.rxdata", "rb")
    loop do
      current_data = Marshal.load(file) rescue nil
      break if current_data == nil
      folder_name, filename, hue = *current_data
      RPG::Cache.load_bitmap_safe(folder_name, filename, hue) rescue nil
    end
    file.close
  end
end

#==============================================================================
# * Parte 4 - Opción de refrescarlo (borrar lo guardado hasta el momento)
#==============================================================================

if $DEBUG # Eso hace que solo ocurra en modo Debug, puede quitarse
  module Input
    class << self
      alias cache_eron_upd update
      def update
        cache_eron_upd
        if Input.trigger?(Input::F8) # Ocurre al pulsar F8
          # Puedes añadir aquí un sonido o popup para notificarlo
          file = File.open("Data/Cache.rxdata", "wb")
          Marshal.dump([], file)
          file.close
        end
      end
    end
  end
end # if $DEBUG

Básicamente va como antes pero en vez de "leer" los archivos que hay en cada carpeta, escribe el nombre del archivo cada vez que uno es cargado por primera vez en el juego. Entonces a la larga acabas teniendo lo mismo que antes pero sin tanto paso engorroso... Además se guarda en un archivo Data normal que aunque cambie de ordenador se sigue conservando, así que si antes de comprimir y compartir el juego ya la has testeado como para pasártelo, cualquier jugador tendrá el GC montado para que se le cargue "al máximo" al iniciar partida y ya no dar más problemas de lag más tarde.

Además, se añadió un modo opcional de vaciar ese contenido y volver a 0; solo hay que pulsar F8 en el juego y en modo Debug.
Desconozco si usando este método se podría llegar a replicar la barra de modo que siguiera funcionando en encriptados, pero en todo caso parece complicado. Si alguien quiere hacer pruebas no hay problema, reconozco que eso en concreto no lo he podido probar.

PD.- Doy las gracias a Eron por su ayuda vía mensajería privada.
avatar
Wecoc
Administrador
Administrador



Créditos 12340

Gracias : 579

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Loading Bar

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.