Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

[RMXP] Motor de partículas

Ver el tema anterior Ver el tema siguiente Ir abajo

[RMXP] Motor de partículas

Mensaje por Ribbu el 2009-08-17, 01:46

Descripción:

Este script permite crear efectos de partículas en tu juego que se integrarán en "Spriteset_Map", para poder ser mostradas sobre o bajo un evento.

Screen:



Demo:

Descargar Demo (MegaUpload)
Descargar Demo (RapidShare)

Script:

Código:
#===============================================================================
# Nuevo Motor de Partículas
#  por arevulopapo
#  15 de Nov de 2007
#
# Este script permite crear efectos de partículas en tu juego.
# Las partículas se integran en "Spriteset_Map,
# para poder ser mostradas sobre/bajo un evento.
# Los efectos son usados desde "Llamar script" de esta forma:
# $scene.effect(ID_EVENTO, EFECTO, LOCK, X, Y)
# ID_EVENTO  - ID del evento en el que se moverán las partículas
#            (-1) para el personaje, (1) y superior para los eventos.
# EFECTO    - Nombre del efecto a llamar. Los nombres se definen en Spriteset_Map.
# LOCK      - Alineación de las partículas. 'event' para alinear partículas
#            con la posición del evento en el mapa, y 'screen' para alinear con la
#            posición del evento en pantalla.
#            Para eventos estáticos, como fireplaces, teletransportes, etc. se
#            recomienda la alineación'event'.
#            Para eventos en movimiento usa el modo 'screen'.
# X, Y      - Número de Píxeles que se añadirán a la posición del evento
#            para determinar el punto inicial de partículas.
#            esa es tu arma más poderosa;) Mira el demo para los ejemplos..
#===============================================================================
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)
    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

Instrucciones:

Los efectos se usan desde "Llamar script" de esta forma:

$scene.effect(ID_EVENTO, EFECTO, LOCK, X, Y)

ID_EVENTO - ID del evento en el que se moverán las partículas
(-1) para el personaje, (1) y superior para los eventos.

EFECTO - Nombre del efecto a llamar. Los nombres se definen en Spriteset_Map.

LOCK - Alineación de las partículas. 'event' para alinear partículas
con la posición del evento en el mapa, y 'screen' para alinear con la
posición del evento en pantalla.
Para eventos estáticos, como fireplaces, teletransportes, etc. se
recomienda la alineación'event'.
Para eventos en movimiento usa el modo 'screen'.

X, Y - Número de Píxeles que se añadirán a la posición del evento
para determinar el punto inicial de partículas.

Créditos:

Script creado por Arevulopapo.


Última edición por Ribbu el 2009-09-03, 05:26, editado 1 vez

_________________
¡DESCARGA ARRYN!
avatar
Ribbu
Administrador
Administrador



Créditos 10083

Gracias : 88

Volver arriba Ir abajo

Re: [RMXP] Motor de partículas

Mensaje por -GNS- el 2009-08-17, 03:05

Oh gracias men buen aporte,pero no le entendi muy bien a las instrucciones Sweat jeje
sale pues de todos modos gracias
sale pues me voy
saludos chau lol!

-GNS-
Baneado

3/3

Créditos 230

Gracias : -2

Volver arriba Ir abajo

Re: [RMXP] Motor de partículas

Mensaje por J&L el 2009-08-17, 13:57

Impresionante.

Me apresuro a probarlo.
avatar
J&L
Soñador
Soñador

0/3

Créditos 332

Gracias : 6

Volver arriba Ir abajo

[RMXP] Motor de Partículas

Mensaje por bestia_caos el 2014-04-23, 19:11

No encuentro los nombres en Spriteset_Map...
Alguien puede decirme cuáles son???
 Sweat Snif 
Podeis enseñarme a poner el código? Esque no sé por qué me da error... :(
avatar
bestia_caos
Iniciado
Iniciado

0/3

Créditos 2

Gracias : 2

Volver arriba Ir abajo

Re: [RMXP] Motor de partículas

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.