Envision, Create, Share

Welcome to HBGames, a leading amateur game development forum and Discord server. All are welcome, and amongst our ranks you will find experts in their field from all aspects of video game design and development.

help with some paricle engine math fucntions

so i am using arevulopapo's particle engine and i wanted to make a better snow effect however im not very good at working with the math fuctions, so i was hoping some one would help me make a forula to look like falling snow. here is the script(not in its orginal form ive added some effects, nothing special tho)
Code:
#===============================================================================

# New Particle Engine

#   by arevulopapo with updates by plague180

#   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)

    when 'plague_cells'

      sprite='particle_purple'

      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)  

    when 'plague_spirt'

      sprite='water'

      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)

    when 'plague_sign'

      sprite='sign04'

      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)    

    when 'plague_exp'

      sprite='explosion'

      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 'plague_smoke'

      sprite='explosionsmoke'

      add_particles(object, x, y, sprite, [0.1*(-25+rand(50))/10, 0], [0,0.13], [128,3], lock, 1)  

    when 'plague_effect'

      sprite='portal'

      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 'plague_sparks'

      sprite='particle_blue'

      add_particles(object, x, y, sprite, [2.5*(-35+rand(75))/10, -4], [0,-0.5], [255,20], lock, 1) 

    when 'plague_snow'

      sprite='particle_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)  

      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
 

Thank you for viewing

HBGames is a leading amateur video game development forum and Discord server open to all ability levels. Feel free to have a nosey around!

Discord

Join our growing and active Discord server to discuss all aspects of game making in a relaxed environment. Join Us

Content

  • Our Games
  • Games in Development
  • Emoji by Twemoji.
    Top