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 84768 mensajes en 12064 argumentos.

[XP] Basic Weather Core 1.0

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] Basic Weather Core 1.0

Mensaje por Wecoc el 2017-01-22, 16:52

Éste script es una ampliación del sistema de climas del RPG maker XP.

Con el RPG::Weather normal puedes modificar lo siguiente:

- Color y forma de las gotas
- Dirección y velocidad de las gotas
- Velocidad de desaparición de las gotas


Éste sistema ampliado no solo divide mucho los métodos de modo que sea más fácil controlarlos desde otros scripts, además se amplía suficientemente la base como para poder modificar lo siguiente:

- Definir número máximo de sprites a la vez (está a 100, recomiendo no cambiarlo)
- Definir distintas opciones de bitmap para las gotas (gotas de distinto tamaño) que se cargaran al azar.
- Cargar bitmap de gotas desde la carpeta Pictures
- Dibujar círculos al suelo cuando choca la gota (drops)
- Cargar bitmap de drops desde la carpeta Pictures
- Definir el blend de las gotas que caen y los drops según el tipo de clima (puse Fusionado para lluvia y tormenta y Normal para nieve)


Además modifiqué un poco el modo en el que se dibujan las gotas y nieve así como el modo en el que caen por defecto, por uno que creo que es un poco más realista; son más sutiles y la nieve cae de modo más azaroso en vez de completamente lineal.
Podéis cambiarlo a vuestro antojo.

Mirad ésta imagen para ver las diferencias entre el viejo (izquierda) y el nuevo (derecha)
https://s30.postimg.org/h6vfzzb41/rain_script.png
Igualmente lo mejor es probarlo uno mismo xD

Finalmente puse la opción de llamar desde evento a un clima usando: set_weather(type, power, duration)
Así también es relativamente fácil definir nuevos tipos de clima y cargarlos al proyecto.

Las drops se cargan a la carpeta Pictures y son totalmente opcionales, se les define el nombre al principio del script.
Cada tipo de clima puede tener unas distintas. Constan de una bitmap con frames de 16 x 16. Los frames se colocan en una misma fila y su número es ilimitado.
Yo para el ejemplo creé ésta:



Código:

Código:
#==============================================================================
# ** [XP] Basic Weather Core 1.0
#------------------------------------------------------------------------------
# By: Wecoc (no credits required)
#==============================================================================

#==============================================================================
# ** RPG::Weather
#==============================================================================

class RPG::Weather
  
  MAX_SPRITES = 100   # Max number of sprites
  MAX_DROPS   = 100   # Max number of drops
  
  RAIN_DROP  = "drop_rain"      # Rain  drop picture name
  STORM_DROP = "drop_rain"      # Storm drop picture name
  SNOW_DROP  = ""               # Snow  drop picture name
  
  attr_reader :rain_bitmaps, :storm_bitmaps, :snow_bitmaps
  attr_reader :rain_drops, :storm_drops, :snow_drops
  #--------------------------------------------------------------------------
  # * Initialize
  #--------------------------------------------------------------------------
  def initialize(viewport=nil)
    @type = 0
    @max = 0
    @ox = 0
    @oy = 0
    @viewport = viewport
    get_rain_bitmaps
    get_storm_bitmaps
    get_snow_bitmaps
    get_rain_drops
    get_storm_drops
    get_snow_drops
    get_sprites
    get_drop_sprites
  end
  #--------------------------------------------------------------------------
  # * Get Rain Bitmaps
  #--------------------------------------------------------------------------
  def get_rain_bitmaps
    color1 = Color.new(80, 115, 130, 64)
    @rain_bitmaps = []
    for i in 2..4
      n = 4 * i
      bitmap = Bitmap.new(n, n * 3)
      for iy in 0...n
        bitmap.fill_rect(n - iy, iy * 3, 1, 3, color1)
      end
      @rain_bitmaps.push(bitmap)
    end
  end
  #--------------------------------------------------------------------------
  # * Get Storm Bitmaps
  #--------------------------------------------------------------------------
  def get_storm_bitmaps
    color1 = Color.new(80, 115, 130, 96)
    color2 = Color.new(80, 115, 130, 32)
    @storm_bitmaps = []
    for i in 1..4
      n = (4 * i) + 4
      bitmap = Bitmap.new(n, n * 3)
      for iy in 0...n
        bitmap.fill_rect((n - 1) - iy, iy * 3, 1, 3, color2)
        bitmap.fill_rect((n + 0) - iy, iy * 3, 1, 3, color1)
        bitmap.fill_rect((n + 1) - iy, iy * 3, 1, 3, color2)
      end
      @storm_bitmaps.push(bitmap)
    end
  end
  #--------------------------------------------------------------------------
  # * Get Snow Bitmaps
  #--------------------------------------------------------------------------
  def get_snow_bitmaps
    color1 = Color.new(255, 255, 255, 255)
    color2 = Color.new(255, 255, 255, 128)
    @snow_bitmaps = []
    for i in 4..7
      bitmap = Bitmap.new(i, i)
      bitmap.fill_rect(0, 1, i, i - 2, color2)
      bitmap.fill_rect(1, 0, i - 2, i, color2)
      bitmap.fill_rect(1, 2, i - 2, i - 4, color1)
      bitmap.fill_rect(2, 1, i - 4, i - 2, color1)
      @snow_bitmaps.push(bitmap)
    end
  end
  #--------------------------------------------------------------------------
  # * Get Rain Drops
  #--------------------------------------------------------------------------
  def get_rain_drops
    @rain_drops = []
    return if RAIN_DROP == ""
    drop_bitmap = RPG::Cache.picture(RAIN_DROP) rescue nil
    return if drop_bitmap == nil
    for i in 0...(drop_bitmap.width / 16)
      bitmap = Bitmap.new(16, 16)
      bitmap.blt(0, 0, drop_bitmap, Rect.new(i * 16, 0, 16, 16))
      @rain_drops.push(bitmap)
    end
  end
  #--------------------------------------------------------------------------
  # * Get Storm Drops
  #--------------------------------------------------------------------------
  def get_storm_drops
    @storm_drops = []
    return if STORM_DROP == ""
    drop_bitmap = RPG::Cache.picture(STORM_DROP) rescue nil
    return if drop_bitmap == nil
    for i in 0...(drop_bitmap.width / 16)
      bitmap = Bitmap.new(16, 16)
      bitmap.blt(0, 0, drop_bitmap, Rect.new(i * 16, 0, 16, 16))
      @storm_drops.push(bitmap)
    end
  end
  #--------------------------------------------------------------------------
  # * Get Snow Drops
  #--------------------------------------------------------------------------
  def get_snow_drops
    @snow_drops = []
    return if SNOW_DROP == ""
    drop_bitmap = RPG::Cache.picture(SNOW_DROP) rescue nil
    return if drop_bitmap == nil
    for i in 0...(drop_bitmap.width / 16)
      bitmap = Bitmap.new(16, 16)
      bitmap.blt(0, 0, drop_bitmap, Rect.new(i * 16, 0, 16, 16))
      @snow_drops.push(bitmap)
    end
  end
  #--------------------------------------------------------------------------
  # * Get Sprites
  #--------------------------------------------------------------------------
  def get_sprites
    @sprites = []
    for i in 1..MAX_SPRITES
      sprite = Sprite.new(@viewport)
      sprite.z = 1000
      sprite.visible = false
      sprite.opacity = 0
      @sprites.push(sprite)
    end
  end
  #--------------------------------------------------------------------------
  # * Get Drop Sprites
  #--------------------------------------------------------------------------
  def get_drop_sprites
    @drop_sprites = []
    for i in 1..MAX_DROPS
      sprite = Sprite.new(@viewport)
      sprite.z = 0
      sprite.visible = false
      sprite.opacity = 0
      @drop_sprites.push(sprite)
    end
  end
  #--------------------------------------------------------------------------
  # * Dispose
  #--------------------------------------------------------------------------
  def dispose
    # Dispose Sprites
    @sprites.each      {|sprite| sprite.dispose}
    @drop_sprites.each {|sprite| sprite.dispose}
    # Dispose Bitmaps
    @rain_bitmaps.each  {|bitmap| bitmap.dispose}
    @storm_bitmaps.each {|bitmap| bitmap.dispose}
    @snow_bitmaps.each  {|bitmap| bitmap.dispose}
    @rain_drops.each    {|bitmap| bitmap.dispose}
    @storm_drops.each   {|bitmap| bitmap.dispose}
    @snow_drops.each    {|bitmap| bitmap.dispose}
  end
  #--------------------------------------------------------------------------
  # * Set Weather Type (1: Rain, 2: Storm, 3: Snow)
  #--------------------------------------------------------------------------
  def type=(type)
    return if @type == type
    @type = type
    for i in 1..MAX_SPRITES
      sprite = @sprites[i]
      if sprite != nil
        case @type
        when 1 # Rain
          sprite.bitmap = @rain_bitmaps[rand(@rain_bitmaps.size)]
          sprite.blend_type = 1
        when 2 # Storm
          sprite.bitmap = @storm_bitmaps[rand(@storm_bitmaps.size)]
          sprite.blend_type = 1
        when 3 # Snow
          sprite.bitmap = @snow_bitmaps[rand(@snow_bitmaps.size)]
          sprite.blend_type = 0
        end
        sprite.visible = (i <= @max)
      end
    end
    for i in 1..MAX_DROPS
      sprite = @drop_sprites[i]
      if sprite != nil
        sprite.bitmap = nil
        case @type
        when 1 # Rain
          sprite.blend_type = 1
        when 2 # Storm
          sprite.blend_type = 1
        when 3 # Snow
          sprite.blend_type = 0
        end
        sprite.visible = (i <= @max)
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Set Max
  #--------------------------------------------------------------------------
  def max=(max)
    return if @max == max
    @max = [[max * 2, 0].max, MAX_SPRITES].min
    for i in 1..MAX_SPRITES
      sprite = @sprites[i]
      if sprite != nil
        sprite.visible = (i <= @max)
      end
    end
    for i in 1..MAX_DROPS
      sprite = @drop_sprites[i]
      if sprite != nil
        sprite.bitmap = nil
        sprite.visible = (i <= @max)
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Set OX (map position)
  #--------------------------------------------------------------------------
  def ox=(ox)
    return if @ox == ox
    @ox = ox
    for sprite in @sprites
      sprite.ox = @ox
    end
    for sprite in @drop_sprites
      sprite.ox = @ox
    end
  end
  #--------------------------------------------------------------------------
  # * Set OY (map position)
  #--------------------------------------------------------------------------
  def oy=(oy)
    return if @oy == oy
    @oy = oy
    for sprite in @sprites
      sprite.oy = @oy
    end
    for sprite in @drop_sprites
      sprite.oy = @oy
    end
  end
  #--------------------------------------------------------------------------
  # * Update
  #--------------------------------------------------------------------------
  def update
    return if @type == 0
    for i in 1..@max
      sprite = @sprites[i]
      break if sprite == nil
      case @type
      when 1 # Rain
        update_rain(sprite)
      when 2 # Storm
        update_storm(sprite)
      when 3 # Snow
        update_snow(sprite)
      end
      x = sprite.x - @ox
      y = sprite.y - @oy
      if sprite.opacity < 32 or x < -50 or x > 750 or y < -300 or y > 500
        set_sprite_position(sprite)
      end
    end
    for i in 1..@max
      sprite = @drop_sprites[i]
      break if sprite == nil
      case @type
      when 1 # Rain
        update_drop_rain(sprite)
      when 2 # Storm
        update_drop_storm(sprite)
      when 3 # Snow
        update_drop_snow(sprite)
      end
      if sprite.opacity < 32
        set_drop_position(sprite)
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Set Rain Movement
  #--------------------------------------------------------------------------
  def update_rain(sprite)
    sprite.x -= 2
    sprite.y += 8
    sprite.opacity -= 8
  end
  #--------------------------------------------------------------------------
  # * Set Storm Movement
  #--------------------------------------------------------------------------
  def update_storm(sprite)
    sprite.x -= 4
    sprite.y += 16
    sprite.opacity -= 12
  end
  #--------------------------------------------------------------------------
  # * Set Snow Movement
  #--------------------------------------------------------------------------
  def update_snow(sprite)
    sprite.x -= 1 + rand(2) - rand(2)
    sprite.y += 4 + rand(2) - rand(2)
    sprite.opacity -= 2 + rand(2) - rand(2)
  end
  #--------------------------------------------------------------------------
  # * Set Rain Drop Bitmap
  #--------------------------------------------------------------------------
  def update_drop_rain(sprite)
    return if @rain_drops.size == 0
    n = 255.0 / @rain_drops.size
    n = ((255 - sprite.opacity) / n).floor
    sprite.bitmap = @rain_drops[n]
    sprite.opacity -= 8
  end
  #--------------------------------------------------------------------------
  # * Set Storm Drop Bitmap
  #--------------------------------------------------------------------------
  def update_drop_storm(sprite)
    return if @storm_drops.size == 0
    n = 255.0 / @storm_drops.size
    n = ((255 - sprite.opacity) / n).floor
    sprite.bitmap = @storm_drops[n]
    sprite.opacity -= 12
  end
  #--------------------------------------------------------------------------
  # * Set Snow Drop Bitmap
  #--------------------------------------------------------------------------
  def update_drop_snow(sprite)
    return if @snow_drops.size == 0
    n = 255.0 / @snow_drops.size
    n = ((255 - sprite.opacity) / n).floor
    sprite.bitmap = @snow_drops[n]
    sprite.opacity -= 4
  end  
  #--------------------------------------------------------------------------
  # * Set Sprite Start Position
  #--------------------------------------------------------------------------
  def set_sprite_position(sprite)
    sprite.x = rand(800) - 50 + @ox
    sprite.y = rand(800) - 200 + @oy
    sprite.opacity = 128 + rand(128)
  end
  #--------------------------------------------------------------------------
  # * Set Drop Start Position
  #--------------------------------------------------------------------------
  def set_drop_position(sprite)
    sprite.x = rand(800) - 50 + @ox
    sprite.y = rand(800) - 200 + @oy
    sprite.opacity = 128 + rand(128)
  end
end

#==============================================================================
# ** Interpreter
#==============================================================================

class Interpreter
  #--------------------------------------------------------------------------
  # * Set Weather
  #--------------------------------------------------------------------------
  def set_weather(type, power, duration)
    $game_screen.weather(type, power, duration)
    return true
  end
end

Os pongo de regalo un script añadido que usa Basic Weather Core.
Éste script permite hacer que los círculos de las gotas solo se muestren encima de determinados terrenos.

Código:
#==============================================================================
# ** [XP] Terrain Drops
#------------------------------------------------------------------------------
# Autor: Wecoc (no pido créditos)
# Éste script requiere el script Basic Weather Core
#==============================================================================

class RPG::Weather
  
  MAX_DROPS = 30          # Máximo de gotas en el mapa
  
  RAIN_DROP_IDS  = [1]    # Terrenos en los que aparecen gotas de lluvia
  STORM_DROP_IDS = [1]    # Terrenos en los que aparecen gotas de tormenta
  SNOW_DROP_IDS  = []     # Terrenos en los que aparecen gotas de nieve
  
  def set_drop_position(sprite)
    dx = rand(800) - 50
    dy = rand(800) - 200
    sprite.x = dx + @ox
    sprite.y = dy + @oy
    tx = ((sprite.x + 16) / 32)
    ty = ((sprite.y + 16) / 32)
    if tx > 0 and ty > 0
      terrain = $game_map.terrain_tag(tx, ty)
      case @type
      when 1 # Rain
        if RAIN_DROP_IDS.include?(terrain)
          sprite.opacity = 128 + rand(128)
        else
          sprite.opacity = 0
        end
      when 2 # Storm
        if STORM_DROP_IDS.include?(terrain)
          sprite.opacity = 128 + rand(128)
        else
          sprite.opacity = 0
        end
      when 3 # Snow
        if STORM_DROP_IDS.include?(terrain)
          sprite.opacity = 128 + rand(128)
        else
          sprite.opacity = 0
        end
      end
    end
  end
end
avatar
Wecoc
Administrador
Administrador



Créditos 9217

Gracias : 493

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Basic Weather Core 1.0

Mensaje por Ledai el 2017-01-22, 19:04



¡¡Es hermoso!!
Definitivamente me lo quedo inmediatamente!!!
Acabo de probarlo y va perfectamente. En serio tienes que tener algún aparato en casa para leer la mente de los usuarios del XP porque esto no es normal... XDD

Solo una ultima cuestión ¿Este Script no tiene porqué causar mas Lag que el sistema Default supongo?

Este script lo considero hermoso.
GRACIAS nuevamente.

Edt: He visto que mencionas que sería posible crear un "Nuevo tipo de clima", tal vez trate de improvisar para ver si logro aprender un poco de script de paso, duplicando alguno que ya está hecho y editando el resto... ya veré si me sale algo, aunque creo que no.
avatar
Ledai
Aventurero
Aventurero

0/3

Créditos 2354

Gracias : 170

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Basic Weather Core 1.0

Mensaje por Wecoc el 2017-01-22, 19:54

¿Este Script no tiene porqué causar mas Lag que el sistema Default supongo?

Usa más recursos (más sprites) porque por defecto se usan muy pocos (40, y yo puse 100) pero no debería afectar demasiado al lag, ya lo miré y a mí me va como siempre. Si tuvieras lag al usarlo puedes buscar donde pone MAX_SPRITES = 100 y MAX_DROPS = 100 y bajar ese número. Y en casos aún más drásticos si ya tenías lag por otros motivos y no puedes permitirte ni un sprite de más, podría cambiarse el método max= para una misma frecuencia de clima significara significativamente menos sprites. Se ve más realista con más gotas pero en fin.

He visto que mencionas que sería posible crear un "Nuevo tipo de clima"

Hay que cambiar muchos métodos, ampliarlos para soportar ese nuevo clima (con un nuevo índice de @type), copiando los viejos y cambiándolos a tu manera como has dicho, y luego llamarlo con un set_weather desde el evento.
Así que tiene su ciencia... pero poder se pueden poner tantos climas como se quiera xD La estructura del script creo que no es nada difícil de comprender en éste caso.
avatar
Wecoc
Administrador
Administrador



Créditos 9217

Gracias : 493

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Basic Weather Core 1.0

Mensaje por Ledai el 2017-01-23, 17:36

He logrado crear un nuevo tipo de clima usando el comando de llamada que pusiste, (Creado previamente el clima tipo 4)  y he ido copiando y editando cada parte usando el nombre del nuevo tipo de clima y hasta el momento he logrado hacer que unos cubos azules con un punto asciendan por la pantalla... (NO sé ni como lo he hecho) Pero sinceramente, lo que más me cuesta comprender es el modo de dibujar la forma que quieres.



Ahora lo que me queda es asignarle a este tipo de clima una Drop, pero eso todavía tengo que analizar cómo se hace esa parte XD

La estructura del script creo que no es nada difícil de comprender en éste caso.

Estoy totalmente de acuerdo en este caso ya que hasta yo he podido trastearlo un poco (?)
avatar
Ledai
Aventurero
Aventurero

0/3

Créditos 2354

Gracias : 170

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Basic Weather Core 1.0

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.