设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2716|回复: 2
打印 上一主题 下一主题

[原创发布] 水波纹

[复制链接]

Lv4.逐梦者

梦石
0
星屑
13560
在线时间
2753 小时
注册时间
2014-10-4
帖子
756

R考场第七期纪念奖

跳转到指定楼层
1
发表于 2015-9-26 12:10:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 SixRC 于 2015-10-2 00:07 编辑

先前我已经放过两次效果图了
最好的效果图是第二次的最后一张
所以很不廉耻地盗用一下昔日的作品


下面是正式的发布
首先 此脚本仅适用于会脚本的人士
不是需要看完我写的脚本才能用
只是需要自己增加一点部分才能投入使用
所以 不要想着插进去就能用了
我会给出基础部件和一个范例
下面是基础部分
RUBY 代码复制
  1. class Bitmap
  2.   CWP = Win32API.new('user32.dll','CallWindowProc','ppiii','i')
  3.   GetAddr="\x8B\x74\x24\x08\x8B\x36\x8B\x76\x08\x8B\x76\x10\x8B\x7C\x24\x04\x89\x37\xC2\x10\x00"
  4.   def addr
  5.     s="\0"*4
  6.     CWP.call(GetAddr,s,object_id*2+16,0,0)
  7.     s.unpack("L")[0]
  8.   end
  9. end
  10. module SixRC
  11.   module_function
  12.   def quan(r)
  13.     r2=r*4
  14.     piece=2*Math::PI/r2
  15.     s=[]
  16.     for i in 0...r2
  17.       s<<(r*Math.cos(piece*i)).round
  18.       s<<(r*Math.sin(piece*i)).round
  19.     end
  20.     s
  21.   end
  22.   def get_quan(r)
  23.     s=[[0,0].pack('l*')]
  24.     r.times{|i|s<<quan(i+1).pack('l*')}
  25.     s
  26.   end
  27. end
  28. class Sprite
  29.   ###############精灵的波纹拓展##############################
  30.   #这里介绍一下工作流程
  31.   #有两个buf 每个buf的尺寸是精灵位图的尺寸
  32.   #这两个buf里存储着那一个点的波动强度
  33.   #每一次先是增加buf里面的波动
  34.   #然后通过运算把buf1里面的更新到buf2 或是反之
  35.   #然后再根据buf中各个点的强度更新位图
  36.   #具体方法下面点明了
  37.   #想使用它只不过需要自己增加判断增加buf的方法
  38.   #申明的是,或许会有bug 以及不完善的地方
  39.   #以及...代码冗余 呵呵 毕竟我是业余的
  40.   #在做的时候也就是在学习
  41.   #何况 我是写一段算一段 写完下段忘了上段(笑)
  42.   #不过 应该不会多 大体能优化的我都优化过了 小细节不要在意
  43.   #效率方面 是没问题的
  44.   #对了 由于这个工作流程
  45.   #增加buf的点数并不是很影响效率 反之 因为每次更新都会更新每个点
  46.   #所以图片大小最影响效率
  47.   #对了 不需要在意点会不会加出界限
  48.   #我在Code2中有判断 超出界限会被反弹
  49.   #最后 图片宽高各需大于3
  50.   #                                     -------By SixRC
  51.   #                                           2015.9.26
  52.   ###########################################################
  53.   CWP_pppii=Win32API.new('user32','CallWindowProc','pppii','v')
  54.   CWP_ppppi=Win32API.new('user32','CallWindowProc','ppppi','v')
  55.   #Wave_Code1用于更新buf
  56.   Wave_Code1="\x55\x8B\xEC\x8B\x75\x08\x8B\x7D\x0C\x8B\x5D\x14\x4B\x4B\x43\x8B\x4D\x10\x49\x49\x41\x8B\xC3\x48\x48\x0F\xAF\x45\x10\x03\xC1\x48\xC1\xE0\x02\x8B\x14\x06\x8B\xC3\x0F\xAF\x45\x10\x03\xC1\x48\xC1\xE0\x02\x03\x14\x06\x8B\xC3\x48\x0F\xAF\x45\x10\x03\xC1\xC1\xE0\x02\x03\x14\x06\x8B\xC3\x48\x0F\xAF\x45\x10\x03\xC1\x48\x48\xC1\xE0\x02\x03\x14\x06\x6B\xD2\x0E\xC1\xEA\x06\x8B\xC3\x48\x0F\xAF\x45\x10\x03\xC1\x48\xC1\xE0\x02\x89\x14\x07\x49\xE2\xA6\x4B\x4B\x83\xFB\x00\x75\x99\xC9\xC2\x10\x00"
  57.   #Wave_Code2用于根据buf更改位图颜色
  58.   #下面两个Wave_Code2是不同的 第一个增加了根据波纹力度适当加深颜色的功能
  59.   #比方 1,1,1 --> 2,2,2 or 3,3,3
  60.   #具体使用哪个自己随意
  61.   #Wave_Code2="\x55\x8B\xEC\x8B\x75\x08\x8B\x7D\x0C\x8B\x5D\x14\x4B\x4B\x43\x8B\x4D\x10\x49\x49\x41\x8B\xC3\x48\x0F\xAF\x45\x10\x03\xC1\xC1\xE0\x02\x8B\x14\x06\x8B\xC3\x48\x0F\xAF\x45\x10\x03\xC1\x48\x48\xC1\xE0\x02\x2B\x14\x06\x33\xC0\x83\xFA\x00\x74\x23\x83\xFA\x00\x7F\x10\x48\x81\xC2\xE8\x03\x00\x00\x83\xFA\x00\x72\xF4\x8B\xD0\xEB\x0E\x40\x81\xEA\xE8\x03\x00\x00\x83\xFA\x00\x7F\xF4\x8B\xD0\x89\x55\x08\x8B\x45\x08\x03\xC1\x3B\x45\x10\x72\x09\x8B\x45\x10\x2B\xC1\x48\x89\x45\x08\x8B\x45\x08\x03\xC1\x83\xF8\x00\x77\x0A\xB8\x01\x00\x00\x00\x2B\xC1\x89\x45\x08\x8B\xC3\x48\x48\x0F\xAF\x45\x10\x03\xC1\x48\xC1\xE0\x02\x8B\x14\x06\x8B\xC3\x0F\xAF\x45\x10\x03\xC1\x48\xC1\xE0\x02\x2B\x14\x06\x83\xFA\x00\x74\x25\x33\xC0\x83\xFA\x00\x7F\x10\x48\x81\xC2\xE8\x03\x00\x00\x83\xFA\x00\x72\xF4\x8B\xD0\xEB\x0E\x40\x81\xEA\xE8\x03\x00\x00\x83\xFA\x00\x7F\xF4\x8B\xD0\x89\x55\x0C\x8B\x45\x0C\x03\xC3\x3B\x45\x14\x72\x09\x8B\x45\x14\x2B\xC3\x48\x89\x45\x0C\x8B\x45\x0C\x03\xC3\x83\xF8\x00\x7F\x0A\xB8\x01\x00\x00\x00\x2B\xC3\x89\x45\x0C\x8B\x45\x14\x2B\xC3\x2B\x45\x0C\x0F\xAF\x45\x10\x03\xC1\x48\x03\x45\x08\xC1\xE0\x02\x8B\x57\x04\x8B\x14\x02\x89\x55\x08\x8B\xC3\x48\x0F\xAF\x45\x10\x03\xC1\x48\xC1\xE0\x02\x8B\x04\x06\x33\xD2\x83\xF8\x00\x74\x0C\xFE\xC2\x2D\xB8\x0B\x00\x00\x83\xF8\x00\x7F\xF4\x8A\x45\x08\x8A\xF0\x02\xC2\x3A\xC6\x73\x05\xB0\xFF\x88\x45\x08\x8A\x45\x09\x8A\xF0\x02\xC2\x3A\xC6\x73\x05\xB0\xFF\x88\x45\x09\x8A\x45\x0A\x8A\xF0\x02\xC2\x3A\xC6\x73\x05\xB0\xFF\x88\x45\x0A\x8B\x45\x14\x2B\xC3\x0F\xAF\x45\x10\x03\xC1\x48\xC1\xE0\x02\x8B\x17\x03\xD0\x8B\x45\x08\x89\x02\x49\x49\x83\xF9\x00\x0F\x85\x83\xFE\xFF\xFF\x4B\x4B\x83\xFB\x00\x0F\x85\x72\xFE\xFF\xFF\xC9\xC2\x10\x00"
  62.   Wave_Code2="\x55\x8B\xEC\x8B\x75\x08\x8B\x7D\x0C\x8B\x5D\x14\x4B\x4B\x43\x8B\x4D\x10\x49\x49\x41\x8B\xC3\x48\x0F\xAF\x45\x10\x03\xC1\xC1\xE0\x02\x8B\x14\x06\x8B\xC3\x48\x0F\xAF\x45\x10\x03\xC1\x48\x48\xC1\xE0\x02\x2B\x14\x06\x33\xC0\x83\xFA\x00\x74\x23\x83\xFA\x00\x7F\x10\x48\x81\xC2\xE8\x03\x00\x00\x83\xFA\x00\x72\xF4\x8B\xD0\xEB\x0E\x40\x81\xEA\xE8\x03\x00\x00\x83\xFA\x00\x7F\xF4\x8B\xD0\x89\x55\x08\x8B\x45\x08\x03\xC1\x3B\x45\x10\x72\x09\x8B\x45\x10\x2B\xC1\x48\x89\x45\x08\x8B\x45\x08\x03\xC1\x83\xF8\x00\x77\x0A\xB8\x01\x00\x00\x00\x2B\xC1\x89\x45\x08\x8B\xC3\x48\x48\x0F\xAF\x45\x10\x03\xC1\x48\xC1\xE0\x02\x8B\x14\x06\x8B\xC3\x0F\xAF\x45\x10\x03\xC1\x48\xC1\xE0\x02\x2B\x14\x06\x83\xFA\x00\x74\x25\x33\xC0\x83\xFA\x00\x7F\x10\x48\x81\xC2\xE8\x03\x00\x00\x83\xFA\x00\x72\xF4\x8B\xD0\xEB\x0E\x40\x81\xEA\xE8\x03\x00\x00\x83\xFA\x00\x7F\xF4\x8B\xD0\x89\x55\x0C\x8B\x45\x0C\x03\xC3\x3B\x45\x14\x72\x09\x8B\x45\x14\x2B\xC3\x48\x89\x45\x0C\x8B\x45\x0C\x03\xC3\x83\xF8\x00\x7F\x0A\xB8\x01\x00\x00\x00\x2B\xC3\x89\x45\x0C\x8B\x45\x14\x2B\xC3\x2B\x45\x0C\x0F\xAF\x45\x10\x03\xC1\x48\x03\x45\x08\xC1\xE0\x02\x8B\x57\x04\x8B\x14\x02\x89\x55\x08\x8B\xC3\x48\x0F\xAF\x45\x10\x03\xC1\x48\xC1\xE0\x02\x8B\x04\x06\x8B\x45\x14\x2B\xC3\x0F\xAF\x45\x10\x03\xC1\x48\xC1\xE0\x02\x8B\x17\x03\xD0\x8B\x45\x08\x89\x02\x49\x49\x83\xF9\x00\x0F\x85\xC6\xFE\xFF\xFF\x4B\x4B\x83\xFB\x00\x0F\x85\xB5\xFE\xFF\xFF\xC9\xC2\x10\x00"
  63.   #Wave_Code3用于添加波动点
  64.   Wave_Code3="\x55\x8B\xEC\x8B\x75\x10\x33\xFF\x8B\x5D\x0C\xFF\x33\xFF\x73\x04\xFF\x73\x08\xFF\x73\x0C\x8B\x45\xFC\x83\xC0\x02\x50\x8B\x4B\x10\x8B\x1C\x37\x83\xC7\x04\x8B\x45\xF4\x03\xC3\xEB\x28\x8B\xD0\x8B\x1C\x37\x83\xC7\x04\x8B\x45\xF0\x03\xC3\xEB\x36\x0F\xAF\x45\xEC\x03\xC2\xC1\xE0\x02\x8B\x55\x08\x8B\x1C\x10\x03\x5D\x14\x89\x1C\x10\xE2\xCD\xEB\x3A\x83\xF8\x00\x7F\x09\xBB\x02\x00\x00\x00\x2B\xD8\x8B\xC3\x8B\x5D\xFC\x3B\xC3\x7E\xC3\xD1\xE3\x2B\xD8\x8B\xC3\xEB\xE3\x83\xF8\x00\x7F\x09\xBB\x02\x00\x00\x00\x2B\xD8\x8B\xC3\x8B\x5D\xF8\x3B\xC3\x7E\xB5\xD1\xE3\x2B\xD8\x8B\xC3\xEB\xE3\xC9\xC2\x10\x00"
  65.   #获取圆圈
  66.   Wave_Quan=SixRC.get_quan(100)
  67.   ################波纹初始化##################################
  68.   #每一个波纹使用前必须调用此方法#############################
  69.   def wave_init
  70.     return unless bit=self.bitmap
  71.     return if (@wave_width=bit.width)<4
  72.     return if (@wave_height=bit.height)<4
  73.     @wave_buf1="\0"*4*@wave_height*@wave_width
  74.     @wave_buf2=@wave_buf1
  75.     @wave_addr=bit.addr
  76.     @wave_bit2=Bitmap.new(@wave_width,@wave_height)
  77.     @wave_bit2.stretch_blt(Rect.new(0,0,@wave_width,@wave_height),bit,Rect.new(0,0,@wave_width,@wave_height))
  78.     @wave_addr2=@wave_bit2.addr
  79.     @wave_jishu=1
  80.     @wave_adad=[@wave_addr,@wave_addr2].pack("LL")
  81.   end
  82.   ###############buf增加#####################################
  83.   def wave_add(n,size,strength,x,y) #(哪一个buf,尺寸,强度,x,y)
  84.     CWP_ppppi.call(Wave_Code3,@wave_buf1,[@wave_width-2,@wave_height-2,x,y,size==0?1:4*size].pack('l*'),Wave_Quan[size],strength) if n==1
  85.     CWP_ppppi.call(Wave_Code3,@wave_buf2,[@wave_width-2,@wave_height-2,x,y,size==0?1:4*size].pack('l*'),Wave_Quan[size],strength) if n==2
  86.   end
  87.   ###############波纹更新#####################################
  88.   #这个更新包括了buf和位图的更新##############################
  89.   def wave_update
  90.     if @wave_jishu==1
  91.       CWP_pppii.call(Wave_Code1,@wave_buf1,@wave_buf2,@wave_width,@wave_height)
  92.       CWP_pppii.call(Wave_Code2,@wave_buf2,@wave_adad,@wave_width,@wave_height)
  93.       @wave_jishu=2
  94.     else
  95.       CWP_pppii.call(Wave_Code1,@wave_buf2,@wave_buf1,@wave_width,@wave_height)
  96.       CWP_pppii.call(Wave_Code2,@wave_buf1,@wave_adad,@wave_width,@wave_height)
  97.       @wave_jishu=1
  98.     end
  99.   end
  100.   ################尾置########################################
  101. end


  这里介绍一下工作流程
  有两个buf 每个buf的尺寸是精灵位图的尺寸
  这两个buf里存储着那一个点的波动强度
  每一次先是增加buf里面的波动
  然后通过运算把buf1里面的更新到buf2 或是反之
  然后再根据buf中各个点的强度更新位图
  具体方法下面点明了
  想使用它只不过需要自己增加判断增加buf的方法
  申明的是,或许会有bug 以及不完善的地方
  以及...代码冗余 呵呵 毕竟我是业余的
  在做的时候也就是在学习
  何况 我是写一段算一段 写完下段忘了上段(笑)
  不过 应该不会多 大体能优化的我都优化过了 小细节不要在意
  效率方面 是没问题的
  对了 由于这个工作流程
  增加buf的点数并不是很影响效率 反之 因为每次更新都会更新每个点
  所以图片大小最影响效率
  对了 不需要在意点会不会加出界限
  我在Code2中有判断 超出界限会被反弹
  最后 图片宽高各需大于3



下面是一个范例
添加buf的方式是判断鼠标位置 若在区域内就添加
所以滑动鼠标即可看到波纹
具体的使用方式全在此体现
我在基础之上的改动有标明
水波纹范例.7z (106.58 KB, 下载次数: 253)

最后嘛 随便聊两句
鉴于是水波纹 蓝色的背景是最好看的
别的都没有那种感觉
反正我这样觉得
恩 似乎也没啥好说的了

评分

参与人数 3星屑 +130 +5 收起 理由
fux2 + 5 精品文章
牛肉面 + 100 强大
路路 + 30 精品文章

查看全部评分

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
41076
在线时间
7566 小时
注册时间
2009-7-6
帖子
13498

开拓者贵宾

2
发表于 2015-9-28 02:44:32 | 只看该作者
相当不错,除了命名有点诡异。
我觉得quan那个生成圈的方法才应该脱离ruby,太慢了
RGDirect - DirectX驱动的RGSS,点我了解.
RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
13560
在线时间
2753 小时
注册时间
2014-10-4
帖子
756

R考场第七期纪念奖

3
 楼主| 发表于 2015-9-30 18:41:37 | 只看该作者
fux2 发表于 2015-9-28 02:44
相当不错,除了命名有点诡异。
我觉得quan那个生成圈的方法才应该脱离ruby,太慢了 ...

那个问题我想过
当初的解决方法是先生成一个quan的文件
用的时候加载一下就好了
不过由于现在这样子发布方便 就没有采取原来的做法 自己做的话 肯定不会这样
反正 自己用着舒服就好 大概
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-9-20 11:39

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表