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

Nuestros miembros han publicado un total de 85827 mensajes en 12223 argumentos.

[XP] Wecoc's Particle System Core v1.2

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] Wecoc's Particle System Core v1.2

Mensaje por Wecoc el 2017-07-23, 03:45

Éste script es una base para hacer sistemas Particle Engine. Sé que eso está muy visto pero está montado de modo que sea fácil hacer cierto tipo de cosas que con los scripts normales sobre eso te vuelves majareta. Éste es mucho más sencillo y personalizable.

En realidad debo confesar que con el script actual aún no se puede hacer nada parecido a un Particle Engine puesto que ésto es solo el Core (aquí es donde la gente se ríe de mí) pero el script tiene dos partes; la primera (Particle_Base) es el core pelado y la segunda (a partir de la clase Weather hasta el final) ya es un uso práctico del mismo.

La parte Weather lo que hace es sobreescribir el sistema de climas para que funcione con Particle_Base, porque al fin y al cabo el sistema de climas y un sistema de partículas son básicamente lo mismo. Si ya usáis un sistema de climas personalizado será incompatible, en ese caso os podéis cargar toda esa segunda parte y seguir usando solo la de Particle_Base tranquilamente.

Antes de que os vayáis decepcionados digo las mejoras de esa reescritura de Weather:
- Algo menos de lag para los climas
- Climas personalizados ilimitados, muy personalizables

Vaya, tampoco suena tan mal.

Para crear un nuevo tipo de clima hay que definirlo al final del todo del script, yo hice uno llamado :sword de ejemplo.
De hecho esa última parte que llamé "Weather Expansion" es la única que se puede retocar.

Luego para llamarlo desde cualquier evento solo tenéis que usar la llamada:
$game_screen.weather(:name, power, duration)
Los parámetros power y duration serían lo mismo que defines cuando usas el comando de clima normal.
Importante no dejarse los dos puntos antes del nombre.

Por ejemplo:
$game_screen.weather(:sword, 5, 5)

Pronto subiré otro script para poder realmente aplicarlo a partículas, no será complicado tampoco, ya veréis como mola.
También pronto daré más detalles de cómo hacer un clima personalizado, y posiblemente os pase algunos ya hechos.
El nivel requerido de script para crearlos es bajo... no nulo, pero bajo xD

No requiere créditos.

Código:
#==============================================================================
# ** [XP] Wecoc's Particle System Core v1.2
#------------------------------------------------------------------------------
#  Author: Wecoc (no credits required)
#==============================================================================

#==============================================================================
# * Particle_Base
#==============================================================================

class Particle_Base
  attr_reader :viewport
  attr_reader :bitmap
  attr_reader :n
  attr_reader :sprites
  attr_reader :effect_frame
  attr_reader :frames
  attr_reader :count
  attr_reader :ox
  attr_reader :oy
  attr_reader :max
  attr_reader :type
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(viewport, n)
    @viewport = viewport
    @n = n
    @sprites = []
    @frames = []
    @count = []
    @ox = 0
    @oy = 0
    @max = 0
    @effect_frame = 0
    @fade_out = false
    @type = :null
    refresh
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    for sprite in @sprites
      sprite.dispose
    end
    @sprites.clear
    @frames.clear
    @effect_frame = 0
    get_particle_bitmap
    for i in 0...@n
      sprite = Sprite.new(@viewport)
      sprite.z = 1000
      sprite.visible = false
      sprite.opacity = 0
      if !@bitmap.nil?
        sprite.bitmap = @bitmap.clone
        sprite.ox = sprite.bitmap.width / 2
        sprite.oy = sprite.bitmap.height / 2
      else
        sprite.bitmap = nil
        sprite.ox = 0
        sprite.oy = 0
      end
      @sprites.push(sprite)
      @frames.push(0)
    end
  end
  #--------------------------------------------------------------------------
  # * Get particle bitmap
  #--------------------------------------------------------------------------
  def get_particle_bitmap
    case @type
    when :null
      @bitmap = nil
    end
  end
  #--------------------------------------------------------------------------
  # * Set OX
  #--------------------------------------------------------------------------
  def ox=(ox)
    return if @ox == ox
    dx = ox - @ox
    @ox = ox
    for sprite in @sprites
      sprite.x -= dx
    end
  end
  #--------------------------------------------------------------------------
  # * Set OY
  #--------------------------------------------------------------------------
  def oy=(oy)
    return if @oy == oy
    dy = oy - @oy
    @oy = oy
    for sprite in @sprites
      sprite.y -= dy
    end
  end
  #--------------------------------------------------------------------------
  # * Set max sprites
  #--------------------------------------------------------------------------
  def max=(max)
    return if @max == max
    @max = [[max, 0].max, @sprites.size].min
    for i in 0...@sprites.size
      sprite = @sprites[i]
      if sprite != nil
        sprite.visible = (i <= @max)
        if sprite.visible == false
          @frames[i] = 0
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Clear
  #--------------------------------------------------------------------------
  def clear
    @type = :null
    refresh
  end
  #--------------------------------------------------------------------------
  # * Set particle type
  #--------------------------------------------------------------------------
  def type=(type)
    return if @type == type
    @fade_out = (type == :null)
    return if @fade_out
    @type = type
    @count = []
    refresh
    for i in 0...@sprites.size
      sprite = @sprites[i]
      if sprite != nil
        sprite.visible = (i <= @max)
        if !@bitmap.nil?
          sprite.bitmap = @bitmap.clone
          sprite.ox = sprite.bitmap.width / 2
          sprite.oy = sprite.bitmap.height / 2
        else
          sprite.bitmap = nil
          sprite.ox = 0
          sprite.oy = 0
        end
        if sprite.visible == false
          @frames[i] = 0
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Set number of sprites
  #--------------------------------------------------------------------------
  def n=(n)
    @n = n
    refresh
  end
  #--------------------------------------------------------------------------
  # * Dispose
  #--------------------------------------------------------------------------
  def dispose
    for sprite in @sprites
      sprite.dispose
    end
  end
  #--------------------------------------------------------------------------
  # * Update
  #--------------------------------------------------------------------------
  def update
    return if @type == :null
    @effect_frame += 1
    for i in 0...@sprites.size
      sprite = @sprites[i]
      if !sprite.nil? && !sprite.disposed? && sprite.visible == true
        update_sprite(sprite, i)
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Update sprite
  #--------------------------------------------------------------------------
  def update_sprite(sprite, i)
    sprite.update
    @frames[i] += 1
  end
  #--------------------------------------------------------------------------
  # * Reset sprite
  #--------------------------------------------------------------------------
  def reset_sprite(sprite, i)
    @frames[i] = 0
    if @fade_out
      sprite.visible = false
      fade_out_end = true
      for s in @sprites
        if s.visible
          fade_out_end = false
          break
        end
      end
      if fade_out_end
        @fade_out = false
        @type = :null
        for s in @sprites
          s.bitmap = nil
        end
      end
    end
  end
end

#==============================================================================
# * Particle
#==============================================================================

class Particle < Particle_Base
end

#==============================================================================
# * Weather
#==============================================================================

class Weather < Particle_Base
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(viewport)
    create_weather_bitmaps
    super(viewport, 40)
  end
  #--------------------------------------------------------------------------
  # * Create weather bitmaps
  #--------------------------------------------------------------------------
  def create_weather_bitmaps
    color1 = Color.new(255, 255, 255, 255)
    color2 = Color.new(255, 255, 255, 128)
    @rain_bitmap = Bitmap.new(7, 56)
    for i in 0..6
      @rain_bitmap.fill_rect(6-i, i*8, 1, 8, color1)
    end
    @storm_bitmap = Bitmap.new(34, 64)
    for i in 0..31
      @storm_bitmap.fill_rect(33-i, i*2, 1, 2, color2)
      @storm_bitmap.fill_rect(32-i, i*2, 1, 2, color1)
      @storm_bitmap.fill_rect(31-i, i*2, 1, 2, color2)
    end
    @snow_bitmap = Bitmap.new(6, 6)
    @snow_bitmap.fill_rect(0, 1, 6, 4, color2)
    @snow_bitmap.fill_rect(1, 0, 4, 6, color2)
    @snow_bitmap.fill_rect(1, 2, 4, 2, color1)
    @snow_bitmap.fill_rect(2, 1, 2, 4, color1)
  end
  #--------------------------------------------------------------------------
  # * Dispose
  #--------------------------------------------------------------------------
  def dispose
    super
    @rain_bitmap.dispose
    @storm_bitmap.dispose
    @snow_bitmap.dispose
  end
  #--------------------------------------------------------------------------
  # * Get particle bitmap
  #--------------------------------------------------------------------------
  def get_particle_bitmap
    super
    case @type
    when :rain
      @bitmap = @rain_bitmap.clone
    when :storm
      @bitmap = @storm_bitmap.clone
    when :snow
      @bitmap = @snow_bitmap.clone
    end
  end
  #--------------------------------------------------------------------------
  # * Update sprite
  #--------------------------------------------------------------------------
  def update_sprite(sprite, i)
    super(sprite, i)
    case @type
    when :rain
      sprite.x -= 2
      sprite.y += 16
      sprite.opacity -= 8
    when :storm
      sprite.x -= 8
      sprite.y += 16
      sprite.opacity -= 12
    when :snow
      sprite.x -= 2
      sprite.y += 8
      sprite.opacity -= 8
    end
    x = sprite.x
    y = sprite.y
    case @type
    when :rain, :storm, :snow
      if sprite.opacity < 64 or x < -50 or x > 750 or y < -300 or y > 500
        reset_sprite(sprite, i)
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Reset sprite
  #--------------------------------------------------------------------------
  def reset_sprite(sprite, i)
    super(sprite, i)
    case @type
    when :rain, :storm, :snow
      sprite.x = rand(800) - 50
      sprite.y = rand(800) - 200
      sprite.opacity = 255
    end
  end
end

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

class RPG::Weather < Weather
  def initialize(viewport)  super(viewport)  end
  def dispose()            super()          end
  def ox=(ox)              super(ox)        end
  def oy=(oy)              super(oy)        end
  def max=(max)            super(max)      end
  def update()              super()          end
  def type=(type)
    result = case type
      when 0 then :null
      when 1 then :rain
      when 2 then :storm
      when 3 then :snow
    end
    result = type if result.nil?
    super(result)
  end
end

#==============================================================================
# * Game_Screen
#==============================================================================

class Game_Screen
  def clear_weather
    spriteset = $scene.instance_eval("@spriteset") rescue nil
    if !spriteset.nil?
      weather = spriteset.instance_eval("@weather")
      weather.clear
    end
    @weather_type = 0
  end
end

#==============================================================================
# ** Weather Expansion
#==============================================================================

class Weather < Particle_Base
  #--------------------------------------------------------------------------
  # * Get particle bitmap
  #--------------------------------------------------------------------------
  alias weather_exp_get_particle get_particle_bitmap unless $@
  def get_particle_bitmap
    weather_exp_get_particle
    case @type
    when :sword # Example: Swords
      @bitmap = RPG::Cache.icon("001-Weapon01")
    end
  end
  #--------------------------------------------------------------------------
  # * Update sprite
  #--------------------------------------------------------------------------
  alias weather_exp_update_sprite update_sprite unless $@
  def update_sprite(sprite, i)
    weather_exp_update_sprite(sprite, i)
    case @type
    when :sword # Example: Swords
      sprite.x -= 4
      sprite.y -= 4
      sprite.zoom_x += 0.1
      sprite.zoom_y += 0.1
      sprite.opacity -= 8
    end
    x = sprite.x
    y = sprite.y
    case @type
    when :sword # Example: Swords
      if sprite.opacity < 64 or x < -50 or x > 750 or y < -300 or y > 500
        reset_sprite(sprite, i)
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Reset sprite
  #--------------------------------------------------------------------------
  alias weather_exp_reset_sprite reset_sprite unless $@
  def reset_sprite(sprite, i)
    weather_exp_reset_sprite(sprite, i)
    case @type
    when :sword # Example: Swords
      sprite.x = rand(800) - 50
      sprite.y = rand(800) - 200
      sprite.zoom_x = 1.0
      sprite.zoom_y = 1.0
      sprite.opacity = 255
    end
  end
end


Sé que el ejemplo es algo ridículo xD Pero ya veis que a parte de la bitmap (y no se aprecia en la imagen pero las espadas suben hacia arriba-izquierda) también se pueden añadir otros efectos, por ejemplo zoom.

Uno de los scripts más avanzados que hay para crear climas personalizados es el Weather Creator. Se podría llegar a ampliar el de éste topic con un script a parte para llegar a algo parecido a lo que ofrece ese pero no creo que sea necesario, ya explicaré algunos trucos para lograr algo similar a los resultados que da ese script.


Última edición por Wecoc el 2017-07-27, 19:06, editado 6 veces
avatar
Wecoc
Administrador
Administrador



Créditos 12083

Gracias : 519

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Wecoc's Particle System Core v1.2

Mensaje por Ledai el 2017-07-23, 20:23

Oh!! interesante, actualmente uso uno que hiciste hace tiempo que mejora un poco los climas estándar y tenía en mente crear algún clima extra en ese mismo script para poder usarlo ya que no me causaba bug combinado con el de memorizar clima; Pero si este con el tiempo goza de algún tutorial para crearlo y alguna otra cosa extra; y puedo llegar a usarlo con el de memorize tal vez me planté cambiarme a este... aunque por ahora me mejor me quedaré como estoy. XDD

De todos modos tiene pinta de ser otro gran aporte para la comunidad!!
avatar
Ledai
Aventurero
Aventurero

0/3

Créditos 2965

Gracias : 174

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Wecoc's Particle System Core v1.2

Mensaje por Wecoc el 2017-07-23, 22:19

Ledai: Sí, creo que es compatible con el de memorizar clima, y si no lo es sería fácil adaptarlo. No sé a qué script mío de Weather te refieres porque hice varios, pero según cual sea posiblemente se puedan recrear sus efectos con éste.

___________________________________________________________

Explico cómo crear un clima básico

Como dije para crear un clima hay que hacerlo en la parte final del script, aunque crear otro script a parte también es viable.

1. Cargado de bitmap

Se crea dentro de get_particle_bitmap.

Hay dos modos de hacerlo: Cargando una imagen del proyecto, o bien creando una imagen vacía y aplicándole los colores pixel a pixel tal como se crean las gotas por defecto.

Recomiendo la primera, puesto que es más rápida para el programa y como son imágenes pequeñas no supone un problema para el peso del juego. Normalmente las imágenes se cargaran de la carpeta Pictures, pero puede haber excepciones.

Spoiler:

2. Efecto del sprite

El efecto de cada sprite se define en update_sprite. Normalmente es el mismo para cada sprite y para cada frame, aunque pueden hacerse casos más complejos.

Spoiler:

Normalmente los cambios son en x, y, opacity. Aún así se puede aplicar cualquier cambio disponible en Sprite, como zoom, ángulo... (ver Sprite en la ayuda del maker para más detalles)

Como puede verse ese método se define con una variable extra a parte del sprite, llamada i.
Eso es la id del sprite, de modo que se puede hacer que según ésta el efecto sea distinto, lo que permite climas más complejos. No solo eso sinó que usando @frames[ i ] (los espacios no hacen falta, los añado para no causar conflicto con el BBCode del post) se obtiene el frame actual de ese sprite, de modo que se pueden hacer efectos encadenados.
Cuando suba otros ejemplos se verá claro a lo que me refiero.

Uno no está limitado solo a efectos al sprite en sí, sino que pueden valer efectos de pantalla, como si se tratara de una animación de batalla.
Por ejemplo si se crea un nuevo clima de meteorito se puede hacer que cuando éste choca al suelo se reproduzca un sonido, haya un flash o se sacuda la pantalla.

3. Condición de reseteado

Los parámetros que se tienen que cumplir para que el sprite vuelva a iniciar el loop se definen al final de update_sprite.
Normalmente siempre son lo mismo: opacidad menor que 64 y coordenadas fuera de los márgenes de pantalla.
Por eso, normalmente es cuestión de añadir nuestro tipo dentro del case principal ya definido.

Spoiler:

Si no, es cuestión de crear otro 'when' con el nuestro y poner ahí nuestras condiciones.
Algo también habitual puede ser usar @frames[ i ] de modo que se resetee si lleva ciertos frames en el mismo bucle, sería el modo de tener más controlados los bucles.

4. Reset del sprite

Resetear el sprite se hace en el método reset_sprite.
Lo que hace es dibujar de nuevo el sprite cuando éste terminó su ciclo, es decir se reinicia de nuevo.
En general éste puede aparecer en cualquier parte de la ventana y lo hace con opacidad máxima.
Se puede añadir variedad entre los sprites usando rand, por ejemplo:
sprite.opacity = rand(255) # Opacidad al azar de 0 a 255
Otro ejemplo:
zoom = 1.0 + 1.0 * rand(2) # Zoom al azar; 1.0 o 2.0
sprite.zoom_x = zoom
sprite.zoom_y = zoom


Otros efectos del sprite que se hayan modificado en el bucle también deberán ser reseteados, como el zoom, el ángulo, etc.

Spoiler:
___________________________________________________________

Climas de Ccoa

Los climas del Ccoa's Weather Script son muy usados y son sencillos así que se pueden recrear/personalizar fácilmente con éste script.
Los he definido como nuevos ejemplos del script. Se requieren algunas imágenes que enlazo a continuación.

Código:
#==============================================================================
# ** Weather Expansion (Ccoa's Weather Script adaptation)
#------------------------------------------------------------------------------
# Custom Weather Types:
#   :rain_drops
#   :falling_ice
#   :hail
#   :falling_leaves_aut
#   :blowing_leaves_aut
#   :swirling_leaves_aut
#   :falling_leaves
#   :sakura_petals
#   :rose_petals
#   :feathers
#   :sparkles
#   :butterflies
#==============================================================================

class Weather < Particle_Base
  #--------------------------------------------------------------------------
  # * Get particle bitmap
  #--------------------------------------------------------------------------
  alias ccoa_weather_exp_get_particle get_particle_bitmap unless $@
  def get_particle_bitmap
    ccoa_weather_exp_get_particle
    case @type
    # ff0's Weather Creator : Rain Drops
    when :rain_drops
      @bitmap = @rain_bitmap
    # ff0's Weather Creator : Falling Ice
    when :falling_ice
      @bitmap = RPG::Cache.picture("falling_ice")
    # Ccoa's Weather Script : Hail
    when :hail
      @bitmap = RPG::Cache.picture("hail")
    # Ccoa's Weather Script : Autumn Leaves
    when :falling_leaves_aut, :blowing_leaves_aut, :swirling_leaves_aut
      @bitmap = RPG::Cache.picture("leaves_aut")
    # Ccoa's Weather Script : Green Leaves
    when :falling_leaves
      @bitmap = RPG::Cache.picture("leaves")
    # Ccoa's Weather Script : Sakura Petals
    when :sakura_petals
      @bitmap = RPG::Cache.picture("sakura_petal")
    # Ccoa's Weather Script : Rose Petals
    when :rose_petals
      @bitmap = RPG::Cache.picture("rose_petal")
    # Ccoa's Weather Script : Feathers
    when :feathers
      @bitmap = RPG::Cache.picture("feather")
    # Ccoa's Weather Script : Sparkles
    when :sparkles
      @bitmap = RPG::Cache.picture("sparkles")
    # ff0's Weather Creator : Butterflies
    when :butterflies
      @bitmap = RPG::Cache.character("169-Small11", 0)
    end
  end
  #--------------------------------------------------------------------------
  # * Set type
  #--------------------------------------------------------------------------
  alias ccoa_weather_exp_type type= unless $@
  def type=(type)
    return if @type == type
    ccoa_weather_exp_type(type)
    return if @fade_out
    # Set new parameters for complex iterations
    case @type
    when :falling_leaves_aut, :blowing_leaves_aut, :swirling_leaves_aut
      for i in 0...@sprites.size
        @count.push(rand(4))
      end
    when :falling_leaves
      for i in 0...@sprites.size
        @count.push(rand(13))
      end
    when :sakura_petals
      for i in 0...@sprites.size
        @count.push(25)
      end
    when :rose_petals
      for i in 0...@sprites.size
        @count.push(rand(2))
      end
    when :feathers, :sparkles
      for i in 0...@sprites.size
        @count.push(0)
      end
    when :butterflies
      @direction = []
      for i in 0...@sprites.size
        @count.push(0)
        @direction.push([2,4,6,8][rand(4)])
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Update sprite
  #--------------------------------------------------------------------------
  alias ccoa_weather_exp_update_sprite update_sprite unless $@
  def update_sprite(sprite, i)
    ccoa_weather_exp_update_sprite(sprite, i)
    # Change bitmap dynamically
    case @type
    when :falling_leaves_aut, :blowing_leaves_aut, :swirling_leaves_aut
      if @frames[i] % 10 == 0
        @count[i] = (@count[i] + 1) % 4
        sprite.bitmap = Bitmap.new(8, 8)
        sprite.ox = sprite.bitmap.width / 2
        sprite.oy = sprite.bitmap.height / 2
        sprite.bitmap.blt(0, 0, @bitmap, Rect.new(8 * @count[i], 0, 8, 8))
      end
    when :falling_leaves
      if @frames[i] % 4 == 0
        @count[i] = (@count[i] + 1) % 13
        sprite.bitmap = Bitmap.new(8, 8)
        sprite.ox = sprite.bitmap.width / 2
        sprite.oy = sprite.bitmap.height / 2
        sprite.bitmap.blt(0, 0, @bitmap, Rect.new(8 * @count[i], 0, 8, 8))
      end
    when :rose_petals
      if @frames[i] % 4 == 0 && rand(4) == 0
        @count[i] = (@count[i] + 1) % 2
        sprite.bitmap = Bitmap.new(4, 4)
        sprite.ox = sprite.bitmap.width / 2
        sprite.oy = sprite.bitmap.height / 2
        sprite.bitmap.blt(0, 0, @bitmap, Rect.new(4 * @count[i], 0, 4, 4))
      end
    when :feathers
      if @frames[i] % 15 == 0
        @count[i] = (@count[i] + 1) % 4
        sprite.bitmap = Bitmap.new(4, 4)
        sprite.ox = sprite.bitmap.width / 2
        sprite.oy = sprite.bitmap.height / 2
        sprite.bitmap.blt(0, 0, @bitmap, Rect.new(4 * @count[i], 0, 4, 4))
      end
    when :sparkles
      if @frames[i] % 15 == 0
        @count[i] = (@count[i] + 1) % 8
        sprite.bitmap = Bitmap.new(8, 8)
        sprite.ox = sprite.bitmap.width / 2
        sprite.oy = sprite.bitmap.height / 2
        sprite.bitmap.blt(0, 0, @bitmap, Rect.new(8 * @count[i], 0, 8, 8))
      end
    when :butterflies
      if @frames[i] % 8 == 0
        if @frames[i] % 32 == 0 && rand(4) == 0
          @direction[i] = [2,4,6,8][rand(4)]
        end
        @count[i] = (@count[i] + 1) % 4
        width = @bitmap.width / 4
        height = @bitmap.height / 4
        count = @count[i]
        direction = (@direction[i] / 2) - 1
        sprite.bitmap = Bitmap.new(width, height)
        sprite.ox = sprite.bitmap.width / 2
        sprite.oy = sprite.bitmap.height / 2
        rect = Rect.new(count * width, direction * height, width, height)
        sprite.bitmap.blt(0, 0, @bitmap, rect)
      end
    end
    # Sprite effects
    case @type
    when :rain_drops
      if i < @max / 2
        sprite.x -= 2
        sprite.y += 16
        sprite.opacity -= 8
      else
        sprite.opacity -= 12
      end
    when :falling_ice
      sprite.x -= 1
      sprite.y += 1
      sprite.opacity -= 6
    when :hail
      sprite.x -= 1
      sprite.y += 18
      sprite.opacity -= 15
    when :falling_leaves_aut
      sprite.x -= 1
      sprite.y += 1
    when :blowing_leaves_aut
      sprite.x -= 10
      sprite.y += (rand(4) - 2)
    when :swirling_leaves_aut
      frame = @frames[i]
      case frame
      when 1..10
        sprite.x -= 3
        sprite.y -= 1
      when 11..16
        sprite.x -= 1
        sprite.y -= 2
      when 17..20
        sprite.y -= 3
      when 21..30
        sprite.y -= 2
        sprite.x += 1
      when 31..36
        sprite.y -= 1
        sprite.x += 3
      when 37..40
        sprite.x += 3
      when 41..46
        sprite.y += 1
        sprite.x += 3
      when 47..58
        sprite.y += 2
        sprite.x += 1
      when 59..64
        sprite.y += 3
      when 65..70
        sprite.x -= 1
        sprite.y += 2
      when 71..81
        sprite.x -= 3
        sprite.y += 1
      when 82..87
        sprite.x -= 3
      end
    when :falling_leaves
      count = @count[i]
      sprite.y += 1
      case count
      when 0..3
        sprite.x += 1
      when 8..12
        sprite.x -= 1
      end
    when :sakura_petals
      frame = @frames[i] % 100
      if frame % 2 == 0
        sprite.y += 1
        if frame > @count[i]
          sprite.x -= 1
        else
          sprite.x += 1
        end
      end
    when :rose_petals
      frame = @frames[i] % 50
      if frame % 2 == 0
        sprite.y += 1
        if frame > 25
          sprite.x -= 1
        else
          sprite.x += 1
        end
      end
    when :feathers
      if rand(100) == 0
        sprite.x -= 1
      end
      if rand(100) == 0
        sprite.y -= 1
      end
      frame = @frames[i] % 100
      if frame < 50
        if rand(2) == 0
          sprite.x -= 1
        else
          sprite.y -= 1
        end
        else
        if rand(2) == 0
          sprite.x += 1
        else
          sprite.y += 1
        end
      end
    when :sparkles
      sprite.y += 1
      sprite.opacity -= rand(2)
    when :butterflies
      case @direction[i]
      when 2
        sprite.y += 1
      when 4
        sprite.x -= 1
      when 6
        sprite.x += 1
      when 8
        sprite.y -= 1
      end
    end
    # Reset conditions
    x = sprite.x
    y = sprite.y
    case @type
    when :rain_drops, :falling_ice, :butterflies
      if sprite.opacity < 64 or x < -50 or x > 750 or y < -300 or y > 500
        reset_sprite(sprite, i)
      end
    when :hail, :falling_leaves_aut, :blowing_leaves_aut, :falling_leaves
      if sprite.opacity < 64 or x < -50 or x > 750 or y < -300 or y > 500
        reset_sprite(sprite, i)
      end
    when :sakura_petals, :rose_petals, :feathers, :sparkles
      if sprite.opacity < 64 or x < -50 or x > 750 or y < -300 or y > 500
        reset_sprite(sprite, i)
      end
    when :swirling_leaves_aut
      if sprite.opacity < 64 or frame >= 88
        reset_sprite(sprite, i)
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Reset sprite
  #--------------------------------------------------------------------------
  alias ccoa_weather_exp_reset_sprite reset_sprite unless $@
  def reset_sprite(sprite, i)
    ccoa_weather_exp_reset_sprite(sprite, i)
    # Reset properties
    case @type
    when :rain_drops
      sprite.x = rand(800) - 50
      sprite.y = rand(800) - 200
      sprite.opacity = 255
      if i < (@max / 2)
        sprite.bitmap = @rain_bitmap.clone
      else
        sprite.bitmap = RPG::Cache.picture("drop")
      end
    when :falling_ice
      sprite.x = rand(800) - 50
      sprite.y = rand(800) - 200
      sprite.opacity = 255
      sprite.bitmap = Bitmap.new(8, 8)
      sprite.bitmap.blt(0, 0, @bitmap, Rect.new(8 * (i % 5), 0, 8, 8))
    when :hail, :rose_petals
      sprite.x = rand(800) - 50
      sprite.y = rand(800) - 200
      sprite.opacity = 255
    when :falling_leaves_aut, :blowing_leaves_aut, :falling_leaves
      sprite.x = rand(800) - 50
      sprite.y = rand(800) - 200
      sprite.bitmap = Bitmap.new(8, 8)
      sprite.bitmap.blt(0, 0, @bitmap, Rect.new(8 * @count[i], 0, 8, 8))
      sprite.opacity = 255
    when :swirling_leaves_aut
      sprite.x = rand(800) - 50
      sprite.y = rand(800) - 200
      sprite.bitmap = Bitmap.new(8, 8)
      sprite.bitmap.blt(0, 0, @bitmap, Rect.new(8 * @count[i], 0, 8, 8))
      sprite.opacity = 255
      @frames[i] = rand(88)
    when :sakura_petals
      sprite.x = rand(800) - 50
      sprite.y = rand(800) - 200
      sprite.opacity = rand(255)
      @count[i] = 25 + rand(25)
    when :feathers
      sprite.x = rand(800) - 50
      sprite.y = rand(800) - 200
      sprite.bitmap = Bitmap.new(4, 4)
      sprite.bitmap.blt(0, 0, @bitmap, Rect.new(4 * @count[i], 0, 4, 4))
      sprite.opacity = 255
    when :sparkles
      sprite.x = rand(800) - 50
      sprite.y = rand(400) - 200
      sprite.bitmap = Bitmap.new(8, 8)
      sprite.bitmap.blt(0, 0, @bitmap, Rect.new(8 * @count[i], 0, 8, 8))
      sprite.blend_type = 1
      sprite.opacity = 255
      @count[i] = rand(8)
    when :butterflies
      sprite.x = rand(800) - 50
      sprite.y = rand(800) - 200
      sprite.opacity = 255
      width = @bitmap.width / 4
      height = @bitmap.height / 4
      direction = (@direction[i] / 2) - 1
      sprite.bitmap = Bitmap.new(width, height)
      rect = Rect.new(0, direction * height, width, height)
      sprite.bitmap.blt(0, 0, @bitmap, rect)
    end
  end
end

Imágenes usadas:
https://s13.postimg.org/tzc5wng2v/drop.png
https://s13.postimg.org/5k3xvlh5z/falling_ice.png
https://s13.postimg.org/de4jgzoyv/feather.png
https://s13.postimg.org/mafbkxfl3/hail.png
https://s13.postimg.org/4yeyzhm3r/leaves.png
https://s13.postimg.org/qar2awvfr/leaves_aut.png
https://s13.postimg.org/wn67kqyhz/rose_petal.png
https://s13.postimg.org/i6iy6690n/sakura_petal.png
https://s13.postimg.org/q0jjrkgtj/sparkles.png

Os animo a hacer otros tipos de clima y subirlos, hay muchas posibilidades.

Edit: Detecté un pequeño bug con el ejemplo :butterflies, ya lo he arreglado.


Última edición por Wecoc el 2017-07-27, 14:54, editado 1 vez
avatar
Wecoc
Administrador
Administrador



Créditos 12083

Gracias : 519

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Wecoc's Particle System Core v1.2

Mensaje por Wecoc el 2017-07-24, 20:40

Notifico que me han avisado de dos fallos del script relacionados con el scroll de pantalla. En los próximos días trabajaré para arreglarlos y ya subiré una nueva versión.
Hubiera sido demasiado raro que yo subiera un script sin bugs, por eso puse algunos a propósito.

Cito el mensaje:

¡Hola Wecocodrilo, cuanto tiempo! Hice unas pruebas y he detectado dos problemas en tu sistema Particle Weather. Ámbos se pueden arreglar pero no sé cuanto costará.

El primero es que el modo que usaste de igualar la ox y la oy de los sprites a los de la clase no es compatible con los cambios de zoom ni de ángulo, ya que pasan cosas raras. Las ox y oy del sprite deberían estar siempre centradas según el tamaño de su bitmap, para que zoom y ángulo vayan bien. Entonces en vez de cambiar el ox y oy según la ox y oy de la clase supongo que deberías hacer cambios en la x, y. Con suerte creo que solo tendrás que cambiar los métodos de asignación de ox y oy.

El segundo es que al principio las cosas se crean al igual que se van creando luego. Imagina unas partículas que siempre salen de una esquina fuera de la pantalla, pero a lo largo del efecto estan corriendo por toda la pantalla. Estaría bien tener la opción de hacer que al asignar ese clima ya empezaran por toda la pantalla, al margen de donde se creen a lo largo del efecto. No sé exactamente como se haría para distinguir entre un caso y el otro en reset_sprite, quizá crear una nueva variable que controle el tiempo que hace que dura ese clima concreto y luego hacer esa diferencia si esa vale 0.

A parte de eso el sistema está muy bien, hacía tiempo que esperaba algo así.
¡Suerte!

En principio solo afectará a la base así que podéis seguir creando otros climas, y en el peor de los casos os diré qué cambiar para que vayan bien. Solo tened en cuenta que de momento si los climas tienen cambios de zoom y ángulo, al ir por el mapa se verán cosas raras.

PD.- Reportar bugs es mejor hacerlo en el topic. Si otros encontráis otros bugs notificádmelo.
PD2.- ...............no me llaméis Wecocodrilo porfa xD
___________________________________________________________

Ya que estoy os explico una curiosidad; si cambiáis el clima a Ninguno con el comando Opciones de Clima, eso equivale a ésto:
$game_screen.weather(:null, 5, 0)

Nota:
Los dos números en realidad en ese caso concreto no se usan para nada y podrían ser cualquiera, pero 5 (poder) y 0 (duración) son los que se usan por defecto al asignar un clima.

La curiosidad es que eso no borra el clima actual al instante, sinó que espera a que cada partícula llegue a final de su último ciclo.
Eso solo pasa si el nuevo clima es Ninguno y cambiaste el clima de ese modo, no ocurre al cambiar a otro mapa que no tenga clima, por ejemplo.
En algunos casos excepcionales puede interesar que el clima se quite al instante, en ese caso hay que usar:
$game_screen.clear_weather
avatar
Wecoc
Administrador
Administrador



Créditos 12083

Gracias : 519

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Wecoc's Particle System Core v1.2

Mensaje por Wecoc el 2017-07-27, 13:58

¡Ya está disponible la versión 1.2!

Se han arreglado los dos fallos que se comentaron.
Hay una nueva variable contador llamada @effect_frame que se resetea cuando cambias de clima y va subiendo cada frame; se puede usar @effect_frame == 1 en el reset_sprite para que al crear el clima los sprites se creen de modo distinto que mientras el clima va funcionando, siguiendo la sugerencia del MP.

Nota:
Por cierto, me preguntaron qué es el parámetro duration, creía que se entendía porque va como en el maker por defecto pero lo explico por si acaso; duration 0 significa que al crear el clima éste se crea de golpe, el número de sprites ya es el número máximo de sprites de ese clima, que depende del parámetro power. Si duration vale más de 0 se crea con 0 sprites y éstos se van añadiendo hasta llegar al máximo. El tiempo que tarda en llegar a ese máximo es el valor 'duration' en frames. En otras palabras, hace que el clima aparezca suavemente en vez de hacerlo de golpe. Esa propiedad no es del clima en sí sinó de Game_Screen.

Espero que ahora todo funcione bien.
avatar
Wecoc
Administrador
Administrador



Créditos 12083

Gracias : 519

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Wecoc's Particle System Core v1.2

Mensaje por Eron el 2017-07-28, 09:24

Éste script me parece una mejora muy recomendable para los proyectos =)
Como prometí en la chatbox, te he hecho unos ejemplos de partículas, algunos más difíciles que otros.

Weather Particle Eron.zip

Entre otros incluye bolas que suben con efecto parecido a fuegos fatuos, copos de nieve, hojas que caen (parecidas al de ccoa pero con gráficos de mejor calidad), burbujitas, meteoritos chungos y los más interesantes son uno de nubes y uno de niebla de pantano. Usé recursos sacados de internet, libres de uso. El script también es libre de uso.

Ojalá os gusten =))
avatar
Eron
Principiante
Principiante

0/3

Créditos 3593

Gracias : 56

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Wecoc's Particle System Core v1.2

Mensaje por Wecoc el 2017-07-28, 19:36

Gracias por los nuevos climas, eso sin duda ayudará a otros a ver como hacer otros climas personalizados para sus proyectos.
+1 como una catedral :DD

El de nubes es el que más me gusta, es ideal para usar en un worldmap. Me sorprende su asignación de coordenadas, junto al de niebla son muy distintas a lo habitual y no solo eso sino que también aparece y desaparece de modo muy inventivo en relación a mis ejemplos. Se nota que le pusiste mucho esfuerzo en esos dos. En los demás también hay alguna forma nueva de asignar las coordenadas, como el de burbujas que va como por bloques, dudo que se me hubiera ocurrido algo así xD

Otra cosa, idea sacada del MAWS: ahora que hay definida la variable @effect_frame se puede usar dentro de update para hacer efectos random a lo largo de cierto clima, por ejemplo una tormenta eléctrica. Ya se puede ver en el ejemplo de Eron de meteoritos, en el que hay flash de luz y sonido, en ese caso al impactar el meteorito y no al azar pero es parecido. A mí me gusta más hacer ese tipo de efectos que van más a parte con un evento común, pero sepáis que es posible integrarlos en el script sin más.

Cuando pueda haré la parte de partículas.
avatar
Wecoc
Administrador
Administrador



Créditos 12083

Gracias : 519

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Wecoc's Particle System Core v1.2

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.