O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

Arevulopapo's Particle Engine

Iniciado por Doiza, 05/01/2016 às 18:36

05/01/2016 às 18:36 Última edição: 01/12/2019 às 20:44 por Doiza
Arevulopapo's Particle Engine


[box class=titlebg]
O que faz
[/box]
Este script adiciona efeitos de partículas no seu jogo, deixando-o mais bonito e/ou realista.
É possível fazer as partículas seguirem um evento, serem desativadas no meio do jogo, e até mesmo adicioná-las a veículos!

[box class=titlebg]
Instruções
[/box]
As partículas são configuráveis começando em case effect (linha 117).

Todas as imagens utilizadas nas partículas devem estar em Graphics/Pictures/Particles.

Caso queria mudar a pasta, adicione esse trecho no início do script:

module Cache
  def self.particles(filename)
      load_bitmap("Graphics/Particles/", filename)
  end
end


E substitua estas linhas (são 2, aperte Ctrl + F para achar no script):

self.bitmap = Cache.picture('Particles/' + sprite)/


Colocando Cache.[nome do módulo que você definiu la em cima] no lugar de Cache.picture.
Como por exemplo:

self.bitmap = Cache.particles('Particles/' + sprite)


[box class=titlebg]
Screenshots
[/box]


[box class=titlebg]
Script
[/box]

=begin

 Particle Engine
 por arevulopapo
 conversão por PK8
 Criado: 11/15/2007
 Modificado: 5/9/2012 - 5/12/2012
 Convertido: 5/10/2012 (VX), 5/12/2012 (Ace)
 ──────────────────────────────────────────────────────────────────────────────
 ■ Introdução
   Este script lhe permite criar efeitos de partícula em seu jogo. Partículas
   são integradas na classe Spriteset_Map, então elas podem ser mostradas 
   em cima ou embaixo de um evento.
 ──────────────────────────────────────────────────────────────────────────────
 ■ Methods Aliased
   Spriteset_Map.initialize
   Spriteset_Map.update
   Spriteset_Map.dispose
 ──────────────────────────────────────────────────────────────────────────────
 ■ Agradecimentos
   mobychan por me ajudar e me direcionar pras página de Dicas do RPG Maker
   VX Ace da Archeia, que dizia como eventos em Processo Paralelo precisavam
   ser postos num Ciclo de modo que eles continuem sendo animados enquanto 
   outros eventos estão sendo interagidos com.
 ──────────────────────────────────────────────────────────────────────────────
 ■ Uso
   Efeitos são chamados do comando "Chamar Script" assim:

     particle_effect(EVENT_ID, EFFECT, LOCK, X, Y)
       EVENT_ID  - ID do evento de onde as partículas vão surgir.
                    -7/"follower3" para Seguidor 3 (continua para outros seguidores até 16)
                    -6/"follower2" para Seguidor 2
                    -5/"follower1" para Seguidor 1
                    -4/"airship" para Aeronave.
                    -3/"ship" para Navio.
                    -2/"boat" para Barco.
                    -1/"player" para Jogador.
                     1 e acima para Eventos.
                     * Use @event_id para "Este evento".
                     * Use um array para especificar múltiplas IDs.
       EFFECT    - nome do efeito para chamar. Nomes são definidos na classe 
                   Spriteset_Map. (
                     * Use uma array para especificar múltiplos efeitos.
       LOCK      - alinhamento das particulas. 'event' para alinhar partículas
                   com a posição do evento no mapa, 'screen' para linhar com
                   a posição do evento na tela.
                   Para eventos estáticos, como fogueiras, teleportes, etc, 
                   alinhamento 'event' é recomendado.
                   Para eventos que se mexem, use o modo 'screen'.
       X, Y      - número de pixels que vão ser adicionados a posição do
                   evento para determinar o ponto de início das partículas.
                   Esta é sua arma mais poderosa. Veja a demo para exemplos.
                    * Use uma array para especificar múltiplas coordenadas X/Y.
 ──────────────────────────────────────────────────────────────────────────────
 ■ Modificações de Conversão
   o Adicionados atalhos nas chamadas de script. Você pode agora usar arrays
     em EVENT_ID, EFFECT, X e Y para definir mais eventos, efeitos, e 
     coordenadas.

   o Usuários agora podem definir partículas a veículos através de definir
     EVENT_ID para "boat" (barco), ship (navio), e "airship" (aeronave).
                   
=end

#==============================================================================
# ** Spriteset_Map
#------------------------------------------------------------------------------
#  This class brings together map screen sprites, tilemaps, etc. It's used
# within the Scene_Map class.
#==============================================================================

class Spriteset_Map
  #--------------------------------------------------------------------------
  # * Add Effect
  #--------------------------------------------------------------------------
  def add_effect(event=1, effect='', lock='event', x=0, y=0)
    # Case: Event
    # Caso 16 seguidores não sejam suficientes, é só copiar a primeira linha
    # e aumentar os números .
    # (se bem que o primeiro é negativo então né-- ah ce entendeu)
  
    event = event.downcase.gsub(/\s+/, "") if event.is_a?(String)
    case event
  # Exemplo: 
  # when -21, "follower17"; object = $game_player.followers[16]
    when -20, "follower16"; object = $game_player.followers[15]
    when -19, "follower15"; object = $game_player.followers[14]
    when -18, "follower14"; object = $game_player.followers[13]
    when -17, "follower13"; object = $game_player.followers[12]
    when -16, "follower12"; object = $game_player.followers[11]
    when -15, "follower11"; object = $game_player.followers[10]
    when -14, "follower10"; object = $game_player.followers[9]
    when -13, "follower9";  object = $game_player.followers[8]
    when -12, "follower8";  object = $game_player.followers[7]
    when -11, "follower7";  object = $game_player.followers[6]
    when -10, "follower6";  object = $game_player.followers[5]
    when -9,  "follower5";  object = $game_player.followers[4]
    when -8,  "follower4";  object = $game_player.followers[3]
    when -7,  "follower3";  object = $game_player.followers[2]
    when -6,  "follower2";  object = $game_player.followers[1]
    when -5,  "follower1";  object = $game_player.followers[0]
    when -4,  "airship";    object = $game_map.airship
    when -3,  "ship";       object = $game_map.ship
    when -2,  "boat";       object = $game_map.boat
    when -1,  "player";     object = $game_player
    else
      if event.is_a?(Integer); object = $game_map.events[event]
      else; object = event
      end
    end
    object = nil if object.is_a?(Game_Follower) and $game_player.vehicle != nil
    
    #------------------------------------------------------------------------
    # Configuration
    #------------------------------------------------------------------------
    case effect
    # (sprite, acceleration[x,y], gravity[x,y], opacity[base,loss], blending)
    when 'blue'
      sprite='star_blue'
      add_particles(object, x, y, sprite, [1.00*(-15+rand(30))/10, 1.00*(-15+rand(30))/10], [0,0], [160,5+rand(15)], lock, 1)
    when 'red'
      sprite='star_red'
      add_particles(object, x, y, sprite, [1.00*(-15+rand(30))/10, 1.00*(-15+rand(30))/10], [0,0], [160,5+rand(15)], lock, 1)
    when 'green'
      sprite='star_green'
      add_particles(object, x, y, sprite, [1.00*(-15+rand(30))/10, 1.00*(-15+rand(30))/10], [0,0], [160,5+rand(15)], lock, 1)
    when 'yellow'
      sprite='star_yellow'
      add_particles(object, x, y, sprite, [1.00*(-15+rand(30))/10, 1.00*(-15+rand(30))/10], [0,0], [160,5+rand(15)], lock, 1)
    when 'smash'
      sprite='smash'
      add_particles(object, x, y, sprite, [1.00*(-15+rand(30))/10, 1.00*(-15+rand(30))/10], [0,0], [160,5+rand(15)], lock, 1)
    when 'fire'
      sprite='particle_yellow'
      add_particles(object, x, y, sprite, [(rand(7)-3)*0.2, 0], [0,0.15], [255,8+rand(5)], lock, 1)
    when 'fire2'
      sprite='particle_orange'
      add_particles(object, x, y, sprite, [(rand(7)-3)*0.2, 0], [0,0.15], [255,8+rand(5)], lock, 1)
    when 'sparks'
      sprite='particle_red'
      add_particles(object, x, y, sprite, [0.5*(-25+rand(50))/10, -4], [0,-0.5], [255,20], lock, 1)
    when 'smoke'
      sprite='smoke'
      add_particles(object, x, y, sprite, [0.1*(-25+rand(50))/10, 0], [0,0.13], [128,3], lock, 1)
    when 'cells'
      sprite='particle_red'
      dx = 1.00*(-100 + rand(200))/100
      dy = 1.00*(-100 + rand(200))/100
      add_particles(object, x, y, sprite, [5*dx, 5*dy], [0.3*dx,0.3*dy],
      [255,10], lock, 1)
      #sines
    when 'black'
      sprite='star_sine'
      add_particles(object, x, y, sprite, [(rand(7)-3)*0.2, 0], [0,0.15],
      [255,8+rand(5)], lock, 1)
      #sines
    when 'portal'
      sprite='portal'
      add_particles(object, x, y, sprite, [0,0.2], [0,0.1], [255,1+rand(10)], lock, 1)
    end
  end
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_reader :particles
  #--------------------------------------------------------------------------
  # * Alias Listings
  #--------------------------------------------------------------------------
  alias :particle_ssm_init :initialize
  alias :particle_ssm_update :update
  alias :particle_ssm_dispose :dispose
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    @particles = []
    particle_ssm_init
  end
  #--------------------------------------------------------------------------
  # * Dispose
  #--------------------------------------------------------------------------
  def dispose
    @particles.each{ |d| d.dispose }
    particle_ssm_dispose
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    @particles.each_with_index{ |p,i|
      @particles[i].update
      if p.opacity == 0
        p.dispose
        @particles.delete_at(i)
      end
      }
    particle_ssm_update
  end
  #--------------------------------------------------------------------------
  # * Add Particles
  #--------------------------------------------------------------------------
  def add_particles(object = $game_player, x = 0, y = 0, sprite = '',
    acc = [0,0], grav = [0,0], opacity = [255,0], lock = 'event', blend = 0)
    if !object.is_a?(NilClass)
      if lock == 'event'
        @particles << Particle_Event.new(@viewport1, object, x, y, sprite, acc,
          grav, opacity, blend)
      elsif lock == 'screen'
        @particles << Particle_Screen.new(@viewport1, object, x, y, sprite, acc,
          grav, opacity, blend)
      end
    end
  end
end

#===============================================================================​
# ** Particle_Screen
#===============================================================================​

class Particle_Screen < Sprite
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(viewport = Viewport.new(0,0,800,600), object = $game_player,
    x = 0, y = 0, sprite = '', acc = [0,0], grav = [0,0], opacity = [255,3],
    blend = 0)
    if !object.is_a?(NilClass)
      super(viewport)
      self.bitmap = Cache.picture('Particles/' + sprite)
      self.x = object.screen_x + x
      self.y = object.screen_y - 16 + y
      self.ox = self.oy = self.bitmap.width/2
      self.blend_type = blend
      self.opacity = opacity[0]
      @object = object
      @origin = [self.x, self.y]
      @acceleration = acc
      @gravity = grav
      @coords = [0.00, 0.00]
      @opacity = opacity[1]
      update
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    if !@object.is_a?(NilClass)
      @acceleration[0] -= @gravity[0] if @gravity[0] != 0
      @acceleration[1] -= @gravity[1] if @gravity[1] != 0
      @coords[0] += @acceleration[0]
      @coords[1] += @acceleration[1]
      self.opacity -= @opacity
      self.x = @origin[0] + @coords[0]
      self.y = @origin[1] + @coords[1]
      if self.y > (@object.screen_y - 16)
        self.z = @object.screen_z + 32
      else
        if @object == $game_map.airship; self.z = @object.screen_z + 120
        elsif @object.is_a?(Game_Follower); self.z = @object.screen_z + 1
        else
          self.z = @object.screen_z - 32
        end
      end
    end
  end
end

#===============================================================================​
# ** Particle_Event
#===============================================================================​

class Particle_Event < Sprite
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(viewport = Viewport.new(0,0,800,600), object = $game_player,
    x = 0, y = 0, sprite = '', acc = [0,0], grav = [0,0], opacity = [255,3],
    blend = 0)
    if !object.is_a?(NilClass)
      super(viewport)
      self.bitmap = Cache.picture('Particles/' + sprite)
      self.x = object.x*32 + 16 - $game_map.display_x * 32 + x
      self.y = object.y*32 + 32 - $game_map.display_y * 32 + y
      self.ox = self.oy = self.bitmap.width/2
      self.blend_type = blend
      self.opacity = opacity[0]
      @object = object
      @origin = [object.x*32 + x + 16, object.y*32 + y + 32]
      @acceleration = acc
      @gravity = grav
      @coords = [0.00, 0.00]
      @opacity = opacity[1]
      update
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    if !@object.is_a?(NilClass)
      @acceleration[0] -= @gravity[0] if @gravity[0] != 0
      @acceleration[1] -= @gravity[1] if @gravity[1] != 0
      @coords[0] += @acceleration[0]
      @coords[1] += @acceleration[1]
      self.opacity -= @opacity
      self.x = @origin[0] + @coords[0] - $game_map.display_x * 32
      self.y = @origin[1] + @coords[1] - $game_map.display_y * 32 - 16
      if self.y > (@object.screen_y - 16)
        self.z = @object.screen_z + 40
      else
        self.z = @object.screen_z - 40
      end
    end
  end
end

#==============================================================================
# ** Scene_Map
#------------------------------------------------------------------------------
#  This class performs the map screen processing.
#==============================================================================

class Scene_Map < Scene_Base
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_reader :spriteset
end

#==============================================================================
# ** Game_Interpreter
#------------------------------------------------------------------------------
#  An interpreter for executing event commands. This class is used within the
# Game_Map, Game_Troop, and Game_Event classes.
#==============================================================================

class Game_Interpreter
  #--------------------------------------------------------------------------
  # * Add effect
  #--------------------------------------------------------------------------
  def particle_effect(event=@event_id, effect='', lock='event', x=0, y=0)
    event, effect, x, y = Array(event), Array(effect), Array(x), Array(y)
    event.each{ |event_i| effect.each{ |effect_i| x.each{ |x_i| y.each{ |y_i|
      SceneManager.scene.spriteset.add_effect(event_i, effect_i, lock, x_i, y_i)
    } } } }
  end
end


[box class=titlebg]
Demo
[/box]

Clique aqui (em inglês)

[box class=titlebg]
Condições de Uso
[/box]
Não especificadas pelo autor
[box class=titlebg]
Agradecimentos
[/box]
Arevulopapo — criação do script (originalmente no RMXP)
PK8 — Adaptação para o RMVX e RMVXA

Fonte


Bem, eu iria traduzir esse script e explicar um pouco a utilização, mas eu mesma ainda estou me batendo um pouco pra entender. Então apenas disponibilizei :T.T:
Edit 30/11/2019: adicionada tradução
Você adora as enormes árvores do XP? Você odeia as cores "datadas" delas? Que tal dar uma olhada no meu Remaster?

Partículas são muito úteis quando você quer reproduzir efeitos.
Obrigado por compartilhar o/

Muito bom este script de partículas, obrigado por compartilhar este belo material!

Haae, a pouco tempo eu havia visto este script pro VX e fiquei me perguntando se havia ele para o nosso querido ACE, muito obrigado Doiza por compartilhar, você me deu uma grande ajuda só de posta-lo aqui!  :XD: