Project1

标题: 粒子工厂到底怎么用 [打印本页]

作者: tydhc    时间: 2010-10-21 13:53
提示: 作者被禁止或删除 内容自动屏蔽
作者: miracl    时间: 2010-10-21 13:56
呃,我觉得,LZ应该把脚本发上来,大家才好解决吧……
作者: 匿名    时间: 2010-10-21 14:57
粒子的本质是虾米?
一堆SPRITE按照设定到处跑而已

粒子的运动规律是虾米?
设定几个属性然后让它们按照这些属性进行运动

运动的本质是虾米?
相对时间内发生的位移而已,也就是每帧UPDATE的时候改XY而已,改多少就是所谓的“速度”
作者: tydhc    时间: 2010-10-23 14:07
提示: 作者被禁止或删除 内容自动屏蔽
作者: orochi2k    时间: 2010-10-23 17:25
本帖最后由 orochi2k 于 2010-10-23 17:34 编辑
LS为什么要匿名嘛,给了我很大启发的,我试着自己编编看吧
tydhc 发表于 2010-10-23 14:07

因为偶是R界华丽的黑幕(大雾)
呃……不过鉴于版主说匿名不方便评分,于是偶囧一下……

可以参考偶的石器中的某段上古时期的源码
  1. #粒子单个
  2. class  Particle
  3.   attr_accessor :bt
  4.   attr_accessor :vx #横位移分量
  5.   attr_accessor :vy #纵位移分量
  6.   attr_accessor :ax #横加速度分量
  7.   attr_accessor :ay #纵
  8.   attr_accessor :aax #加加速度- -0 呃……从前有棵高树,上面挂了很多人……
  9.   attr_accessor :aay #无聊的解析几何啊啊啊啊- -0
  10.   attr_accessor :lifetime #生命周期
  11.   def initialize
  12.      @bt = RPG::Sprite.new
  13.      @vx = 0
  14.      @vy = 0
  15.      @ax = 0
  16.      @ay = 0
  17.      @aax = 0
  18.      @aay = 0
  19.      @lifetime = 0
  20.   end
  21.   def dispose
  22.     if @bt == nil
  23.       return
  24.     end
  25.     @bt.dispose
  26.     @bt = nil
  27.     #GC.start
  28.   end  
  29.   ################################
  30.   def setlife(t)
  31.      @lifetime = t
  32.   end
  33.   def setv( vx = nil , vy = nil )
  34.     if vx != nil
  35.       @vx = vx
  36.     end
  37.     if vy != nil
  38.       @vy = vy
  39.     end   
  40.   end  
  41.   def seta( ax = nil , ay = nil)
  42.      if ax != nil
  43.        @ax = ax
  44.      end  
  45.      if ay != nil
  46.         @ay = ay  
  47.      end
  48.    end  
  49.    ###############################
  50.    def update
  51.      if @bt == nil
  52.        return
  53.      end
  54.      if @lifetime <= 0
  55.        @bt.bitmap.dispose
  56.        @bt.dispose
  57.      end
  58.      if  @bt.disposed?
  59.        @bt = nil
  60.        return
  61.      end
  62.      @ax += @aax
  63.      @ay += @aay
  64.      @vx += @ax
  65.      @vy += @ay
  66.      @bt.x += @vx
  67.      @bt.y += @vy
  68.      @lifetime -= 1
  69.      @bt.update
  70.    end  
  71.    ##################################
  72. end
复制代码
下面是如何将单个的粒子变成一坨华丽的粒子炮(大雾)

  1. ###########喷射1号###################################################
  2. class Particle_Fire
  3.   def initialize(grtt,time,x,y)
  4.     @time = time
  5.     @particles = []
  6.     @grtt = grtt
  7.     @temp = 0
  8.     @x = x
  9.     @y = y
  10.   end
  11.   def update
  12.     if @temp >= @grtt
  13.       return
  14.     end  
  15.     for i in @temp..(@temp + @grtt/@time)
  16.       @particles[i] = Particle.new
  17.       @particles[i].bt.x = @x
  18.       @particles[i].bt.y = @y
  19.       @particles[i].bt.z = 99999
  20.       @particles[i].bt.zoom_x = 0.4
  21.       @particles[i].bt.zoom_y = 0.4
  22.       @particles[i].bt.bitmap = RPG::Cache.picture("particles")  #这个是粒子的贴图文件
  23.       @particles[i].bt.src_rect.set( 0 , 0 , 32 , 32)
  24.       @particles[i].bt.flash(Color.new(240+rand(15),100+rand(120),100+rand(120),255),20)
  25.       @particles[i].setlife(20)
  26.       @particles[i].setv((-200+rand(400)) * 0.05,(-300+rand(100)) * 0.05)
  27.     end  
  28.     @temp += @grtt/@time
  29.     updatefire
  30.   end
  31.   def updatefire
  32.     for i in 0..@temp
  33.       if @particles[i].is_a?(Particle)
  34.        @particles[i].update
  35.        end
  36.     end  
  37.   end  
  38.   def dispose
  39.     for i in 0..@temp
  40.       if @particles[i].is_a?(Particle)
  41.        @particles[i].dispose
  42.        end
  43.     end  
  44.   end  
  45. end  

  46. ##############################################################################
复制代码
大致看完上面的代码,你就能写粒子系统了
剩下就是考虑在哪里插进去,以及垃圾回收之类的东西

粒子的华丽度一般和运动公式的诡异度有关(参考UPDATE那堆,如果粒子自身属性的坐标分量运动无法满足需求其实直接可以在粒子库的那坨东西里直接强制确定粒子的X,Y 从而做出正弦函数什么的东西)

这只是个教学用轻量级版本0.0




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1