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 85780 mensajes en 12216 argumentos.

[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
#------------------------------------------------------------------------------
# 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.
avatar
Wecoc
Administrador
Administrador



Créditos 9370

Gracias : 517

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 637

Gracias : 60

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 1995

Gracias : 56

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 2814

Gracias : 174

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 9370

Gracias : 517

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 6798

Gracias : 356

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.