class Bitmap
CWP = Win32API.new('user32.dll','CallWindowProc','ppiii','i')
GetAddr="\x8B\x74\x24\x08\x8B\x36\x8B\x76\x08\x8B\x76\x10\x8B\x7C\x24\x04\x89\x37\xC2\x10\x00"
def addr
s="\0"*4
CWP.call(GetAddr,s,object_id*2+16,0,0)
s.unpack("L")[0]
end
end
module SixRC
module_function
def quan(r)
r2=r*4
piece=2*Math::PI/r2
s=[]
for i in 0...r2
s<<(r*Math.cos(piece*i)).round
s<<(r*Math.sin(piece*i)).round
end
s
end
def get_quan(r)
s=[[0,0].pack('l*')]
r.times{|i|s<<quan(i+1).pack('l*')}
s
end
end
class Sprite
###############精灵的波纹拓展##############################
#这里介绍一下工作流程
#有两个buf 每个buf的尺寸是精灵位图的尺寸
#这两个buf里存储着那一个点的波动强度
#每一次先是增加buf里面的波动
#然后通过运算把buf1里面的更新到buf2 或是反之
#然后再根据buf中各个点的强度更新位图
#具体方法下面点明了
#想使用它只不过需要自己增加判断增加buf的方法
#申明的是,或许会有bug 以及不完善的地方
#以及...代码冗余 呵呵 毕竟我是业余的
#在做的时候也就是在学习
#何况 我是写一段算一段 写完下段忘了上段(笑)
#不过 应该不会多 大体能优化的我都优化过了 小细节不要在意
#效率方面 是没问题的
#对了 由于这个工作流程
#增加buf的点数并不是很影响效率 反之 因为每次更新都会更新每个点
#所以图片大小最影响效率
#对了 不需要在意点会不会加出界限
#我在Code2中有判断 超出界限会被反弹
#最后 图片宽高各需大于3
# -------By SixRC
# 2015.9.26
###########################################################
CWP_pppii=Win32API.new('user32','CallWindowProc','pppii','v')
CWP_ppppi=Win32API.new('user32','CallWindowProc','ppppi','v')
#Wave_Code1用于更新buf
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"
#Wave_Code2用于根据buf更改位图颜色
#下面两个Wave_Code2是不同的 第一个增加了根据波纹力度适当加深颜色的功能
#比方 1,1,1 --> 2,2,2 or 3,3,3
#具体使用哪个自己随意
#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"
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"
#Wave_Code3用于添加波动点
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"
#获取圆圈
Wave_Quan=SixRC.get_quan(100)
################波纹初始化##################################
#每一个波纹使用前必须调用此方法#############################
def wave_init
return unless bit=self.bitmap
return if (@wave_width=bit.width)<4
return if (@wave_height=bit.height)<4
@wave_buf1="\0"*4*@wave_height*@wave_width
@wave_buf2=@wave_buf1
@wave_addr=bit.addr
@wave_bit2=Bitmap.new(@wave_width,@wave_height)
@wave_bit2.stretch_blt(Rect.new(0,0,@wave_width,@wave_height),bit,Rect.new(0,0,@wave_width,@wave_height))
@wave_addr2=@wave_bit2.addr
@wave_jishu=1
@wave_adad=[@wave_addr,@wave_addr2].pack("LL")
end
###############buf增加#####################################
def wave_add(n,size,strength,x,y) #(哪一个buf,尺寸,强度,x,y)
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
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
end
###############波纹更新#####################################
#这个更新包括了buf和位图的更新##############################
def wave_update
if @wave_jishu==1
CWP_pppii.call(Wave_Code1,@wave_buf1,@wave_buf2,@wave_width,@wave_height)
CWP_pppii.call(Wave_Code2,@wave_buf2,@wave_adad,@wave_width,@wave_height)
@wave_jishu=2
else
CWP_pppii.call(Wave_Code1,@wave_buf2,@wave_buf1,@wave_width,@wave_height)
CWP_pppii.call(Wave_Code2,@wave_buf1,@wave_adad,@wave_width,@wave_height)
@wave_jishu=1
end
end
################尾置########################################
end