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: 184)
Reply }
#2
This sounds awesome.. Can we have a screenshot?
Reply }
#3
The real question is, does this work in RMXP or RMVX?

If RMXP, I'm all over it ^_^
Reply }
#4
It's dated 2007, and has the prefix reading RMXP in our forum.

Enjoy, Bolt. Winking
Reply }
#5
just 2 days... and then there will be a new particle system :)
Reply }
#6
I thought that it was a 2009 version!
oh well...
Reply }
#7
so..how do you use it? the script doesn't exactly show me where to put stuff. or I missed it
"Turning iron ore into iron swords is a hard process, for one must first dig out the rock, and melt it to refine it, then one must pour that metal into a mould, let it cool a bit, and pound on it while it cools even further. Games are no different." - Ahzoh

Universal Declaration of Human Rights in Vrkhazhian
ʾEšol ḵavud ʾelẕakud lav ʾezʾaẕud zwazaršeru ya lit žalneru lav lit t͛enud. Ṗal sa-ražheru lav raržižu paplam lav ṗal widsaṟam bemaḵu šuku lit ʾeyṭu waẏnilaẇ.
All human beings are born free and equal in dignity and rights. They are endowed with reason and conscience and should act towards one another in a spirit of brotherhood.
Reply }
#8
Code:
# Effects are called from "Script" command like this:
# $scene.effect(EVENT_ID, EFFECT, LOCK, X, Y)
And it mentions having to look at the spriteset map for a list of 'effects'

For example
$scene.effect(12, 'blue', 'event', 15, 8)
would place the blue particle effect (as listed in the Spriteset Map), around event 12. the effect is tied to the event ('event') rather than the spriteset itself (there are differences in how it behaves), and initially puts it over the event (again event 12) about 15 pixels off horizontally and 8 vertically.
Up is down, left is right and sideways is straight ahead. - Cord "Circle of Iron", 1978 (written by Bruce Lee and James Coburn... really...)

[Image: QrnbKlx.jpg]
[Image: sGz1ErF.png]    [Image: liM4ikn.png]    [Image: fdzKgZA.png]    [Image: sj0H81z.png]
[Image: QL7oRau.png]    [Image: uSqjY09.png]    [Image: GAA3qE9.png]    [Image: 2Hmnx1G.png]    [Image: BwtNdKw.png%5B]
  Above are clickable links
Reply }
#9
i knew that part, i just didn't know where put that information(found where)

so where would i put this "$scene.effect" in the script? at the bottom?
"Turning iron ore into iron swords is a hard process, for one must first dig out the rock, and melt it to refine it, then one must pour that metal into a mould, let it cool a bit, and pound on it while it cools even further. Games are no different." - Ahzoh

Universal Declaration of Human Rights in Vrkhazhian
ʾEšol ḵavud ʾelẕakud lav ʾezʾaẕud zwazaršeru ya lit žalneru lav lit t͛enud. Ṗal sa-ražheru lav raržižu paplam lav ṗal widsaṟam bemaḵu šuku lit ʾeyṭu waẏnilaẇ.
All human beings are born free and equal in dignity and rights. They are endowed with reason and conscience and should act towards one another in a spirit of brotherhood.
Reply }
#10
Oh.... it's called a script call.

When you make an event on the map, set the trigger to 'parallel process' (NOT 'autorun') and go to the right window in the screen to create a command. The 'third' page tab has a command called 'Script call' (bottom right).

From there, you enter your RGSS script command... namely that. Winking
Up is down, left is right and sideways is straight ahead. - Cord "Circle of Iron", 1978 (written by Bruce Lee and James Coburn... really...)

[Image: QrnbKlx.jpg]
[Image: sGz1ErF.png]    [Image: liM4ikn.png]    [Image: fdzKgZA.png]    [Image: sj0H81z.png]
[Image: QL7oRau.png]    [Image: uSqjY09.png]    [Image: GAA3qE9.png]    [Image: 2Hmnx1G.png]    [Image: BwtNdKw.png%5B]
  Above are clickable links
Reply }


Possibly Related Threads…
Thread Author Replies Views Last Post
   Terra Blocks: Terraria Styled Block Engine DerVVulfman 0 817 04-21-2024, 11:02 PM
Last Post: DerVVulfman
   MGC ISO Engine MGC 25 80,142 01-25-2017, 02:47 PM
Last Post: JayRay
   Code Mora : Morality Engine BeJeremiah 0 5,670 07-23-2016, 01:25 PM
Last Post: BeJeremiah
   XAS hero VS engine urbios urbios 3 9,063 05-13-2013, 07:01 PM
Last Post: KDC
   Ghost Interface Engine decibel 0 5,569 03-08-2008, 05:35 AM
Last Post: decibel
  RMXP to RMVX Engine System DerVVulfman 0 5,881 03-05-2008, 06:26 PM
Last Post: DerVVulfman
   Destruction Engine Rataime 0 4,699 03-02-2008, 08:00 AM
Last Post: Rataime
   Passive Effects Engine Trickster 0 5,111 03-02-2008, 06:24 AM
Last Post: Trickster



Users browsing this thread: 1 Guest(s)