查看: 3550|回复: 4

[通用发布] 行走图碎散效果及目前所有拓展整合(补 更新d)

[复制链接]
梦石
0
星屑
2427
在线时间
87 小时
注册时间
2018-1-3
回帖
10
发表于 2018-2-27 03:54:59 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 路路 于 2019-9-2 14:44 编辑

更新已统一至 https://rpg.blue/thread-476711-1-1.html
[fold=旧内容]


如果记得以前发布的仿刀剑神域敌人倒下效果,介个发布就是同类拓展qaq
之前有很多人提出要行走图(地图上事件、主角)这种效果,于是就补发了此物
可以用于传送、剧情上的一些效果。

由于我的账号数据(原路路、菜鸟)都已经没了,以前的发布帖也GG了。。这也许是最后一个发布帖
附件 实际应用包含:菜单效果、行走图效果、战斗效果、地图名效果。以上为可直接使用的拓展(只要某种效果删除对应脚本即可)
附件 部分示例是各种测试、调用。以上为用法思路 不可直接使用

使用方法请参考范例(VA)和注释说明,理论上XP VX通用 但需要移植。如果有思路也可拓展出自己想要的效果在不同的地方



更新2018.3.3:
1.增加一个XP显示地图名的附件(意外找到233)
2.地图名效果用了新的移动类型
3.行走图效果修复清除位图资源问题(没特别需求 事件主角clear最好设为false)
4. 实际应用附件更新部分事件示范
5.支持脚本更新至1.8 新增10种基础移动类型
<:DD-往下><:UU-往上><:LL-往左><:RR-往右>
<:XX-横向><:YY-纵向><:SO-固定>
<:TEN-十字><:L_LEAN-左斜向><:R_LEAN-右斜向>



Unravel_Bitmap 实际应用_d.rar (1.46 MB, 下载次数: 175)
Unravel_Bitmap 部分示例_d.rar (1.56 MB, 下载次数: 142)
地图名效果(RM XP).rar (303.93 KB, 下载次数: 96)

QQ截图20180227025946.png
QQ截图20180227025526.png
QQ截图20180227025842.png
QQ截图20180227025439.jpg



[pre lang="ruby" file="Unravel_Bitmap1.8"]#————————————————————————————————————————
# ●Unravel_Bitmap By.Lyaci
#   *位图消逝 v1.8
#————————————————————————————————————————
#   *使用说明
#    1 - m_bitmap = Bitmap.new(...)
#    2 - Unravel_Bitmap.new(sx,sy,m_bitmap,x,y,w,h,n,r,co,type,rc,clear,viewport)
#      - > sx,sy:精灵顶点 m_bitmap:源位图对象 x,y,w,h:定位源位图坐标宽高
#      - > n:精灵数量 d:消逝点直径、边长 co:透明度增加最小值
#      - > type:移动类型<:RU-右上><:RD-右下><:LU-左上><:LD-左下>
#      - > clear:清除源位图效果<true-开><false-关> viewport:显示视口
#   -Ver:1.0 Date:2014.9.20
#   *1.1版本更新如下
#    - > n:设为<大于0>为设定精灵数量
#      - 设为<0>为铺满自动计算数量 设为<-1>为网格式铺满减半自动计算数量
#    - > rc:<:C-圆形样式><:S-正方形样式><:T-三角形样式> *new v1.6
#    - > init_proc:精灵操作代码块
#      - Unravel_Bitmap.new(...){|sprite|sprite.angle = 0...}
#    - > 实例控制功能
#      - get_all_sprite 取得所有存在精灵 | get_viewport 取得视口
#      - begin 开始 | stop 停止
#   -Ver:1.1 Date:2014.9.21
#   *1.2版本向下支持至RGSS1
#   -Ver:1.2 Date:2014.9.21
#   *1.3版本更新VAF12问题
#   -Ver:1.3 Date:2014.9.23
#————————————————————————————————————————
#   -Ver:1.6 Date:2014.12.3
#   *1.6版本更新如下
#   -结构及部分算法优化
#   - 参数rc更改为符号 :C :S :T 说明更新如上
#   -增加三角形样式 对应rc符号 :T
#   -增加移动操作代码块
#    - > Unravel_Bitmap#move_effe
#      -move_effe {|sprite,index|...} <sprite-精灵><index-编号,可省略>
#      -重新定义的话会覆盖之前的move_effe
#    -对两个代码块的区别说明
#     -init_proc 为初始精灵操作块(执行一次)
#     -move_effe 为移动过程操作块(总是执行)
#   -增加过界自释放方法,多用于一些不进行透明减算的实例
#    - > Unravel_Bitmap#auto_dispose
#      - auto_dispose(sprite,index) 建议放入move_effe块中使用
#   -增加更改移动类型方法
#     - > Unravel_Bitmap#move_type
#       - move_type(type) <type-为欲更改的类型>
#   -增加移动类型
#     - > type:移动类型<:LR-两侧><:LRUD-四周扩散>
#   -增加移动速度增幅类方法
#    - > Unravel_Bitmap.make_speed
#      - make_speed(xp,yp,op) <xp yp op-对应新的增幅数,省略恢复默认>
#      - 默认为 100,100,550,越大运动越快
#   -增加透明采样精度类方法
#    - > Unravel_Bitmap.make_otake
#      - make_otake(unlog) <unlog:true-关闭精确采样><unlog:false-开启精确采样>
#      - 该功能对有透明性质的位图有明显效果,关闭会提升效率,默认值关闭
#   *1.6b版本增加设定采样精度值类方法 Unravel_Bitmap.make_otake_value(value)
#   *1.7a版本重新向下支持RMXP RMVX -date:20150813
#————————————————————————————————————————
#   -Ver:1.8 Date:2018.3.2
#   *1.8版本更新如下
#   -增加移动类型
#     - > type:移动类型<:DD-往下><:UU-往上><:LL-往左><:RR-往右>
#       - <:XX-横向><:YY-纵向><:SO-固定>
#       - <:TEN-十字><:L_LEAN-左斜向><:R_LEAN-右斜向>
#————————————————————————————————————————
class Unravel_Bitmap
  #————————————————————————————————————————
  #*Move type Algorithm: "x|y|opacity"
  #————————————————————————————————————————
  DEF_MOVE_TYPE = {:RU => "+--",:LU => "---",:RD => "++-",:LD => "-+-"}
  DEF_MOVE_TYPE[:LR] = "+--" ; DEF_MOVE_TYPE[:LRUD] = "+--"
  DEF_MOVE_TYPE[:DD] = "#+-" ; DEF_MOVE_TYPE[:UU] = "#--"
  DEF_MOVE_TYPE[:LL] = "-#-" ; DEF_MOVE_TYPE[:RR] = "+#-"
  DEF_MOVE_TYPE[:XX] = "-#-" ; DEF_MOVE_TYPE[:YY] = "#--"
  DEF_MOVE_TYPE[:SO] = "##-" ; DEF_MOVE_TYPE[:TEN] = "++-"
  DEF_MOVE_TYPE[:L_LEAN] = "++-" ; DEF_MOVE_TYPE[:R_LEAN] = "-+-"
  #————————————————————————————————————————
  #*New Unravel_Bitmap
  #————————————————————————————————————————
  def initialize(sx,sy,m_bitmap,x,y,w,h,n,d=4,co=0.5,type=:RU,rc=:C,
    clear=true,viewport=nil,&init_proc)
    @sprite_datas = []; @viewport = viewport;jn = number = n;oo = 255
    all_clear = (clear && jn < 1) ? true : false
    clear = all_clear ? false : clear
    type_rand = false
    case rc #in rc type
    when :C
      vrc = make_proc {|ex,ey,d,b|m_bitmap.rc_circle(ex,ey,d,0,true,1.0,b,clear) }
    when :S
      vrc = make_proc {|ex,ey,d,b|m_bitmap.rc_square(ex,ey,d,d,b,clear) }
    when :T
      vrc = make_proc {|ex,ey,d,b|m_bitmap.rc_triangle(ex,ey,d,1.0,2.0,b,clear) }
    end
    case number #in rcs
    when -1
      n = (w*h/d**2.0/2).ceil;lw = (w/d.to_f/2).ceil;lh = (n/(h/d.to_f)).ceil
      rcs = lambda {|i|@xo=x+sx+i%lw*d*2+(i/lw%2*d);@yo=y+sy+i/lh*d }
    when 0
      n = (w*h/d**2.0).ceil;lw = (w/d.to_f).ceil;lh = (n/(h/d.to_f)).ceil
      rcs = lambda {|i|@xo=x+sx+i%lw*d;@yo=y+sy+i/lh*d }
    else
      rcs = lambda {|i|@xo=x+sx+rand(w);@yo=y+sy+rand(h) }
    end
    case type #in move type
    when :LR
      type_rand = true
      mvp = lambda {|a,b,i| a = -a if 0.eql?(i%2);return a,b }
    when :LRUD , :XX , :YY
      type_rand = true
      mvp = lambda {|a,b,i| a = -a if 0.eql?(i%2)
      b = -b if 0.eql?((i-1)%3);return a,b }
    when :TEN
      type_rand = true
      mvp = lambda {|a,b,i|
      ten = [-a,a,0,0,0,0,-b,b]
      idx = i%4
      return ten[idx],ten[idx+4] }
    when :L_LEAN , :R_LEAN
      type_rand = true
      mvp = lambda {|a,b,i| a,b = -a,-b if 0.eql?(i%2);return a,b }
    end
    d2 = d/2;number = n ; number.times{|i|rcs.call(i)
    next if @@otake && m_bitmap.get_pixel(@xo-sx+d2,@yo-sy+d2).alpha < @@otake_value
    rx = rand(@@speed_x) / 100.0;ry = rand(@@speed_y) / 100.0
    ro = co + rand(@@speed_o) / 100.0
    rx,ry = mvp.call(rx,ry,i) if type_rand
    sprite = Sprite.new(viewport)
    @sprite_datas << [sprite,@xo,@yo,oo,rx,ry,ro]
    sprite.x = @xo;sprite.y = @yo;sprite.z = 5000
    sprite.bitmap = Bitmap.new(d,d)
    vrc.call(@xo-sx,@yo-sy,d,sprite.bitmap)
    init_proc.call(sprite) if init_proc }
    m_bitmap.clear_rect(x,y,w,h) if all_clear
    move_type(type)
    self.begin
  end
  #————————————————————————————————————————
  #*Class method move speed
  #————————————————————————————————————————
  class << self
    def make_speed(xp=100,yp=100,op=550)
      @@speed_x,@@speed_y,@@speed_o = xp,yp,op
    end
    def make_otake(unlog=true)
      @@otake = unlog
    end
    def make_otake_value(value=1)
      @@otake_value = value
    end
  end
  #————————————————————————————————————————
  #*Set move type & effect
  #————————————————————————————————————————
  def move_type(type)
    @operation = DEF_MOVE_TYPE[type]
    make_move(@operation)
  end
  def move_effe(&move_proc)
    @move_effe_proc = move_proc
    make_move(@operation)
  end
  #————————————————————————————————————————
  #*Make method
  #————————————————————————————————————————
  def make_move(operation)
    instance_eval %<
    def move_update(sprite,sprite_data,index)
      sprite.x = sprite_data[1] #{operation[0,1]}= sprite_data[4]
      sprite.y = sprite_data[2] #{operation[1,1]}= sprite_data[5]
      sprite.opacity = sprite_data[3] #{operation[2,1]}= sprite_data[6]
      #{%<@move_effe_proc.call(sprite,index)> if @move_effe_proc}
    end >
  end
  def make_proc(&block)
    return block
  end
  #————————————————————————————————————————
  #*All sprite
  #————————————————————————————————————————
  def get_all_sprite
    @sprite_datas.collect {|sprite_data|sprite_data[0]}
  end
  #————————————————————————————————————————
  #*Viewport
  #————————————————————————————————————————
  def get_viewport
    @viewport
  end
  #————————————————————————————————————————
  #*Control
  #————————————————————————————————————————
  def stop
    Graphics.unvb_ins_all.delete(self)
  end
  def begin
    return if Graphics.unvb_ins_all.include?(self)
    Graphics.unvb_ins_all << self
  end
  #————————————————————————————————————————
  #*Update
  #————————————————————————————————————————
  def update
    @sprite_datas.each_with_index {|sprite_data,index|
    sprite = sprite_data[0]
    move_update(sprite,sprite_data,index)
    unless sprite_data[3] > 0
      unless sprite.disposed?
        sprite.dispose;sprite.bitmap.dispose
        @sprite_datas.delete_at(index)
      end
    end }
    stop if @sprite_datas.empty?
  end
  #————————————————————————————————————————
  #*Dispose
  #————————————————————————————————————————
  def dispose
    @sprite_datas.each {|sprite_data|
    sprite = sprite_data[0]
    sprite.dispose;sprite.bitmap.dispose }
    @viewport.dispose if @viewport
  end
  def auto_dispose(sprite,index)
    x = sprite.x.between?(0,WIN_W)
    y = sprite.y.between?(0,WIN_H)
    unless (x & y)
      sprite.dispose;sprite.bitmap.dispose
      @sprite_datas.delete_at(index)
    end
  end
  #————————————————————————————————————————
  #*Client rect & init move speed
  #————————————————————————————————————————
  WIN_W = defined?(Graphics.width) ? Graphics.width : 640    #窗口宽
  WIN_H = defined?(Graphics.height) ? Graphics.height : 480  #窗口高
  Unravel_Bitmap.make_speed
  Unravel_Bitmap.make_otake
  Unravel_Bitmap.make_otake_value
end
#————————————————————————————————————————
#*Graphics
#————————————————————————————————————————
module Graphics
  @unvb_ins_all = []
  class << self
  #————————————————————————————————————————
  #*Alias
  #————————————————————————————————————————
    alias_method(:unvb_update,:update) unless method_defined?(:unvb_update)
    alias_method(:unvb_freeze,:freeze) unless method_defined?(:unvb_freeze)
    def update
      @unvb_ins_all.each {|unvb_ins|unvb_ins.update};unvb_update
    end
    def freeze
      all_ub_dispose;unvb_freeze
    end
    def all_ub_dispose
      @unvb_ins_all.each{|unvb_ins|unvb_ins.dispose}
      @unvb_ins_all.clear
    end
  #————————————————————————————————————————
  #*All Unravel_Bitmap instance
  #————————————————————————————————————————
    attr_accessor :unvb_ins_all
  end
end
class Bitmap
  #————————————————————————————————————————
  #*Def clear_rect
  #————————————————————————————————————————
  unless method_defined?(:clear_rect)
    OC0 = Color.new(0,0,0,0)
    def clear_rect(x,y,width,height)
      fill_rect(x, y, width, height, OC0)
    end
  end
  #————————————————————————————————————————
  #*RC bitmap
  #————————————————————————————————————————
  #x:位图x y:位图y d:直径 e:椭圆长轴半径增长 f:长轴逆转 l:取率
  def rc_circle(x,y,d,e=0,f=true,l=1.0,bitmap=self,rc_clear=true)
    t = nil;d2 = d*2;d3 = d/2
    d2.times {|i| xo = (Math.sin(Math::PI/d2*i)*(d3+e)).round
    yo = (Math.cos(Math::PI/d2*i)*(d3)).round;t == yo ? next : t = yo;c = xo*2*l
    f ? (xb,yb,w,h = x+xo-c+d3,y+yo+d3,c,1) : (xb,yb,w,h = y+yo+d3,x+xo-c+d3,1,c)  
    bitmap.blt(xb-x,yb-y,self,Rect.new(xb,yb,w,h))
    clear_rect(xb,yb,w,h) if rc_clear }
  end
  #x:位图x y:位图y w:取宽 h:取高
  def rc_square(x,y,w,h,bitmap=self,rc_clear=true)
    bitmap.blt(0,0,self,Rect.new(x,y,w,h))
    clear_rect(x,y,w,h) if rc_clear
  end
  #x:位图x y:位图y d:底 l:取率 slope:取斜率 1.0为直角
  def rc_triangle(x,y,d,l=1.0,slope=2.0,bitmap=self,rc_clear=true)
    w = 0;d.times {|i| xo = (d/slope-w/slope).truncate;xb = x+xo ; yb = y+i
    bitmap.blt(xo,i,self,Rect.new(xb,yb,w,1))
    clear_rect(xb,yb,w,1) if rc_clear;w += l }
  end
end
#————————————————————————————————————————
#*RMVA SceneManager in F12
#————————————————————————————————————————
module SceneManager
  class << self
    if method_defined?(:run)
      alias :unvb_run :run;def run;Graphics.unvb_ins_all = [];unvb_run;end
    end
  end
end[/pre]
[/fold]

评分

参与人数 4赞 +4 收起 理由
龙影风 + 1 塞糖
Nil2018 + 1 精品文章
鑫晴 + 1 精品文章
king + 1 酷

查看全部评分

杯犬

梦石
1
星屑
5425
在线时间
1274 小时
注册时间
2016-10-28
回帖
581

开拓者

发表于 2018-2-27 12:17:30 | 显示全部楼层
哇超棒的。之前用碎裂效果还得显示个图片,现在用行走图就好了吗!
用脑子来养鱼的杯子。
回复

使用道具 举报

老黄鸡

梦石
4
星屑
45692
在线时间
7947 小时
注册时间
2009-7-6
回帖
13335

MZ评测员RM创作大赛01组委会开拓者贵宾

发表于 2018-2-27 17:07:59 | 显示全部楼层
哇,效果非常棒,没想到纯脚本也能达到这么不错的效率。
RGDirect - DirectX驱动的RGSS,点我了解.
(排满,暂停)RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复

使用道具 举报

梦石
0
星屑
9292
在线时间
2504 小时
注册时间
2011-5-20
回帖
14521

开拓者

发表于 2018-2-27 17:24:03 | 显示全部楼层
最後一個···心累了要隱退了嗎?
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复

使用道具 举报

梦石
0
星屑
2814
在线时间
616 小时
注册时间
2018-1-17
回帖
1230
发表于 2018-2-27 19:25:37 | 显示全部楼层
看起来是个好人 DD
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部