Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
 New Particle Engine by Arevulopapo
#1
New Particle Engine
by Arevulopapo
Posted by PK8, sorries!

Introduction
Quoting from Anaryu's particles topic because it just fits the description.
Anaryu Wrote:You've seen these effects all over, in sprite or 3D games, from console to MMOs like World of Warcraft, a Particle Engine is just a fancy term for taking a series of pictures and making them change size, fade out, and move around many times over to make it look like a flame or a bolt of lightning

Script
Code:
#===============================================================================
# New Particle Engine
#   by arevulopapo
#   Nov 15th 2007
#
# This script lets you create particle effects in your game.
# Particles are integrated into "Spriteset_Map,
# so the can be displayed over/under an event.
# Effects are called from "Script" command like this:
# $scene.effect(EVENT_ID, EFFECT, LOCK, X, Y)
# EVENT_ID  - ID of an event the particles will flow from.
#             (-1) for player, (1) and above for events.
# EFFECT    - name of the effect to call. Names are defined in the Spriteset_Map.
# LOCK      - alignment of the particles. 'event' to align particles
#             with event's map position, 'screen' to align with event's screen position.
#             For static events, like fireplaces, teleports, etc. 'event' alignment is recommended.
#             For moving events use 'screen' mode.
# X, Y      - number of pixels that will be added to the event's position
#             to determine the starting point of particles.
#             That's your most powerful weapon;) See the demo for examples.
#===============================================================================
class Scene_Map
  
  def effect(event=1, effect='', lock='event', x=0, y=0)
    @spriteset.add_effect(event, effect, lock, x, y)
  end
  
end
#===============================================================================
#
#===============================================================================
class Spriteset_Map
  
  attr_reader :particles
  
  alias particle_ssm_init initialize
  alias particle_ssm_update update
  alias particle_ssm_dispose dispose
  #-----------------------------------------------------------------------------
  def initialize
    @particles = []
    particle_ssm_init
  end
  #-----------------------------------------------------------------------------
  def dispose
    @particles.each{ |d| d.dispose }
    particle_ssm_dispose
  end
  #-----------------------------------------------------------------------------
  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
  #-----------------------------------------------------------------------------
  def add_effect(event=1, effect='', lock='event', x=0, y=0)
    
    case event
    when -1
      object = $game_player
    else
      object = $game_map.events[event]
    end
    
    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 end
      end
    end
  #-----------------------------------------------------------------------------
  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 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
#===============================================================================
#
#===============================================================================
class Particle_Screen < Sprite
  
  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)
    super(viewport)
    self.bitmap = RPG::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
  
  def update
    @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
      self.z = @object.screen_z - 32
    end
  end
  
end

class Particle_Event < Sprite
  
  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)
    super(viewport)
    self.bitmap = RPG::Cache.picture('Particles/' + sprite)
    self.x = object.x*32 + 16 - $game_map.display_x / 4 + x
    self.y = object.y*32 + 32 - $game_map.display_y / 4 + 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
  
  def update
    @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 / 4
    self.y = @origin[1] + @coords[1] - $game_map.display_y / 4 - 16
    if self.y > (@object.screen_y - 16)
      self.z = @object.screen_z + 32
    else
      self.z = @object.screen_z - 32
    end
  end
  
end

Instructions
Instructions on how to use are in the script. If you're looking to create your own particle effects, refer to line 74 and below to see how these effects are made.

Compatibility
This script aliases the following:
  • Spriteset_Map's initialize
  • Spriteset_Map's update
  • Spriteset_Map's dispose

Other
The particle graphics should be put into the Graphics/Pictures/Particles/ directory.

Downloads
Download these sample particles for this script. Note, they must be placed within the Graphics/Pictures/Particles/ directory.

.zip   Particles.zip (Size: 136.69 KB / Downloads: 183)
Reply }


Messages In This Thread
New Particle Engine by Arevulopapo - by arevulopapo - 06-21-2009, 05:41 AM
RE: New Particle Engine by Arevulopapo - by Ahzoh - 07-29-2013, 12:21 AM
RE: New Particle Engine by Arevulopapo - by Ahzoh - 07-29-2013, 04:40 AM
RE: New Particle Engine by Arevulopapo - by Ahzoh - 07-29-2013, 05:04 AM
New Particle Engine by Arevulopapo - by Bolt - 11-12-2009, 01:07 PM
New Particle Engine by Arevulopapo - by EJlol - 11-13-2009, 12:30 AM

Possibly Related Threads…
Thread Author Replies Views Last Post
   Terra Blocks: Terraria Styled Block Engine DerVVulfman 0 97 04-21-2024, 11:02 PM
Last Post: DerVVulfman
   MGC ISO Engine MGC 26 74,372 01-25-2017, 02:47 PM
Last Post: JayRay
   Code Mora : Morality Engine BeJeremiah 0 5,050 07-23-2016, 01:25 PM
Last Post: BeJeremiah
   Soul Engine Ace – Altitude Changer SoulPour777 2 5,945 02-28-2014, 10:04 AM
Last Post: SoulPour777
   XAS hero VS engine urbios urbios 3 8,091 05-13-2013, 07:01 PM
Last Post: KDC
   Victor Engine - Cooperation Skills Victor Sant 2 7,955 02-14-2013, 04:44 PM
Last Post: Ace
   Victor Engine - Toggle Target Victor Sant 0 4,717 01-25-2013, 07:37 AM
Last Post: Victor Sant
   Victor Engine - Leap Attack Victor Sant 0 4,752 12-30-2012, 08:42 PM
Last Post: Victor Sant
   Victor Engine - Counter Options Victor Sant 0 4,550 12-24-2012, 09:48 PM
Last Post: Victor Sant
   Victor Engine - Active Time Battle Victor Sant 0 4,943 12-16-2012, 08:17 PM
Last Post: Victor Sant



Users browsing this thread: