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

Project1

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

窗体万花筒--让RM的表现方式跨入崭新的境界。

 关闭 [复制链接]

Lv1.梦旅人

月下可怜人

梦石
0
星屑
50
在线时间
10 小时
注册时间
2005-11-23
帖子
4085

第1届短篇游戏比赛亚军

跳转到指定楼层
1
发表于 2007-3-27 03:32:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
脚本内容详解:

功能:任意改变窗体的形状,@name = '百变窗体'处换成自己的工程名。

注意:1、全屏模式下会恢复正常,可配合夏娜的禁止ALT+ENTER使用。

基础窗体形状(四种):
1、矩形窗体,调用方式:A_Wds.rectwds(X坐标,Y坐标,宽,高)
2、圆角矩形窗体,调用方式:A_Wds.roundwds(X坐标,Y坐标,宽,高,圆角椭圆的宽,
                                          圆角椭圆的高)
3、圆形窗体,调用方式:A_Wds.circlewds(X坐标,Y坐标,宽,高)
4、多边形窗体,调用方式:A_Wds.polygonwds([端点1],[端点2],[端点3]……)
               非常强大的方法,端点数不限,程序会根据端点顺序自动连接成形状。
   例如修改窗体成一个以窗口顶部中点为顶点,底部为底边创立一三角形窗体。
   方法为:A_Wds.polygonwds([320,0],[0,480],[640,480])
   类似于菱形,五角星等形状都可实现。
5、自定窗体,具体方法见“自定窗体详解”

PS:坐标的基准为窗体内部的显示区域左上角为基准,即与RM内建对象标准相同。


原理:创建一矩形(矩形非数学意义的方形,代表区域)区域,将窗体移入该区域进行显示,达成改变窗体的目的。

矩形区域的获取方法:
1、标准矩形:A_Wds.rect(X坐标,Y坐标,宽,高)
2、圆角矩形,A_Wds.round(X坐标,Y坐标,宽,高,圆角椭圆的宽,圆角椭圆的高)
3、圆形矩形,A_Wds.circle(X坐标,Y坐标,宽,高)
4、多边形矩形,A_Wds.polygon([端点1],[端点2],[端点3]……)
5、自定矩形,具体方法见“自定窗体详解”

PS:这几个方法是利用返回值获取矩形,因还未将窗体移动其内,不会对窗体形状造成
    影响,可利用内定的四则运算对矩形合并拆解,以得到新的形状。

矩形四则运算:
加法:取两矩形并集,调用方法,A_Wds.+(矩形1,矩形2,是否立即改变窗体)
减法:矩形1减矩形2,调用方法,A_Wds.-(矩形1,矩形2,是否立即改变窗体)
乘法:取两矩形非交集部分,调用方法,A_Wds.*(矩形1,矩形2,是否立即改变窗体)
除法:取两矩形交集,调用方法,A_Wds./(矩形1,矩形2,是否立即改变窗体)

PS:方法返回值的是合并后的新矩形,所以可不立即改变窗体,多次运算,创建希奇古
    怪的形状。

四则运算样例:
A_Wds.setwindow(矩形)可直接设置窗体,主要配合四则运算得出的矩形。
例如创建一同心环窗体具体流程:

a1 = A_Wds.circle(0,0,640,480)       #创建外侧大圆形状
b1 = A_Wds.circle(50,50,540,380)     #创建外侧小圆形状
c1 = A_Wds.-(a1,b1,false)            #外侧大圆减外侧小圆,不改变窗体,
                                     #保留新矩形
a2 = A_Wds.circle(100,100,440,280)   #创建内侧大圆形状
b2 = A_Wds.circle(150,150,340,180)   #创建内侧小圆形状
c2 = A_Wds.-(a2,b2,false)            #内侧大圆减内侧小圆,不改变窗体,
                                     #保留新矩形
A_Wds.+(c1,c2,true)                  #合并内外环,生成同心环窗体。

自定窗体详解:
最为强大的方法,可实现任何2D形状。
以一张图片的底色@color_w为参照背景,将窗体变化为非底色部分的形状,所以事先
需要预备一张图片采集数据。
默认底色为Color.new(255,255,255)。
基本流程为:
1:采集图片数据,方法:A_Wds.makebit("图片名")。
2:根据图片数据生成矩形并改变窗体,方法:A_Wds.makewds(x坐标偏移,y坐标偏移)

PS:
1:获取自定义矩形的方法:A_Wds.makerect,可正常四则运算。
2:A_Wds.makerect与A_Wds.makewds必须保证已用A_Wds.makebit采集完数据,否则无效。
3:清除自定数据A_Wds.clearbit。
4:因采集过程比较慢,640*480约2秒,所以可预先采集存储在变量中,利用存档的方
   式建立形状库,改变窗体时直接调用即可。



外延功能:
一:利用自定窗体与显示图片创建美观的新显示框。


二:只要输入窗体标题,非RM程序也可以通过该脚本修改。


展示范例之形体变化
ftp://[email protected]/个� ... 窗体之变化.rar

展示范例之事件表达
让RM的事件制作更上一层楼。
ftp://[email protected]/个� ... 窗体之事件.rar



源程序:
  1. #==============================================================================
  2. # ■ A_Wds - 百变窗体  BY:美兽
  3. #------------------------------------------------------------------------------
  4. =begin
  5. #------------------------------------------------------------------------------ 
  6. 功能:任意改变窗体的形状,@name = '百变窗体'处换成自己的工程名。
  7. #------------------------------------------------------------------------------
  8. 注意:1、全屏模式下会恢复正常,可配合夏娜的禁止ALT+ENTER使用。

  9. #------------------------------------------------------------------------------
  10. 基础窗体形状(四种):
  11. 1、矩形窗体,调用方式:A_Wds.rectwds(X坐标,Y坐标,宽,高)
  12. 2、圆角矩形窗体,调用方式:A_Wds.roundwds(X坐标,Y坐标,宽,高,圆角椭圆的宽,
  13.                                           圆角椭圆的高)
  14. 3、圆形窗体,调用方式:A_Wds.circlewds(X坐标,Y坐标,宽,高)
  15. 4、多边形窗体,调用方式:A_Wds.polygonwds([端点1],[端点2],[端点3]……)
  16.                非常强大的方法,端点数不限,程序会根据端点顺序自动连接成形状。
  17.    例如修改窗体成一个以窗口顶部中点为顶点,底部为底边创立一三角形窗体。
  18.    方法为:A_Wds.polygonwds([320,0],[0,480],[640,480])
  19.    类似于菱形,五角星等形状都可实现。
  20. 5、自定窗体,具体方法见“自定窗体详解”

  21. PS:坐标的基准为窗体内部的显示区域左上角为基准,即与RM内建对象标准相同。
  22. #------------------------------------------------------------------------------
  23. 原理:创建一矩形(矩形非数学意义的方形,代表区域)区域,将窗体移入该区域
  24.       进行显示,达成改变窗体的目的。
  25. #------------------------------------------------------------------------------
  26. 矩形区域的获取方法:
  27. 1、标准矩形:A_Wds.rect(X坐标,Y坐标,宽,高)
  28. 2、圆角矩形,A_Wds.round(X坐标,Y坐标,宽,高,圆角椭圆的宽,圆角椭圆的高)
  29. 3、圆形矩形,A_Wds.circle(X坐标,Y坐标,宽,高)
  30. 4、多边形矩形,A_Wds.polygon([端点1],[端点2],[端点3]……)
  31. 5、自定矩形,具体方法见“自定窗体详解”

  32. PS:这几个方法是利用返回值获取矩形,因还未将窗体移动其内,不会对窗体形状造成
  33.     影响,可利用内定的四则运算对矩形合并拆解,以得到新的形状。
  34. #------------------------------------------------------------------------------
  35. 矩形四则运算:
  36. 加法:取两矩形并集,调用方法,A_Wds.+(矩形1,矩形2,是否立即改变窗体)
  37. 减法:矩形1减矩形2,调用方法,A_Wds.-(矩形1,矩形2,是否立即改变窗体)
  38. 乘法:取两矩形非交集部分,调用方法,A_Wds.*(矩形1,矩形2,是否立即改变窗体)
  39. 除法:取两矩形交集,调用方法,A_Wds./(矩形1,矩形2,是否立即改变窗体)

  40. PS:方法返回值的是合并后的新矩形,所以可不立即改变窗体,多次运算,创建希奇古
  41.     怪的形状。
  42. #------------------------------------------------------------------------------
  43. 四则运算样例:
  44. A_Wds.setwindow(矩形)可直接设置窗体,主要配合四则运算得出的矩形。
  45. 例如创建一同心环窗体具体流程:

  46. a1 = A_Wds.circle(0,0,640,480)       #创建外侧大圆形状
  47. b1 = A_Wds.circle(50,50,540,380)     #创建外侧小圆形状
  48. c1 = A_Wds.-(a1,b1,false)            #外侧大圆减外侧小圆,不改变窗体,
  49.                                      #保留新矩形
  50. a2 = A_Wds.circle(100,100,440,280)   #创建内侧大圆形状
  51. b2 = A_Wds.circle(150,150,340,180)   #创建内侧小圆形状
  52. c2 = A_Wds.-(a2,b2,false)            #内侧大圆减内侧小圆,不改变窗体,
  53.                                      #保留新矩形
  54. A_Wds.+(c1,c2,true)                  #合并内外环,生成同心环窗体。
  55. #------------------------------------------------------------------------------
  56. 自定窗体详解:
  57. 最为强大的方法,可实现任何2D形状。
  58. 以一张图片的底色@color_w为参照背景,将窗体变化为非底色部分的形状,所以事先
  59. 需要预备一张图片采集数据。
  60. 默认底色为Color.new(255,255,255)。
  61. 基本流程为:
  62. 1:采集图片数据,方法:A_Wds.makebit("图片名")。
  63. 2:根据图片数据生成矩形并改变窗体,方法:A_Wds.makewds(x坐标偏移,y坐标偏移)

  64. PS:
  65. 1:获取自定义矩形的方法:A_Wds.makerect,可正常四则运算。
  66. 2:A_Wds.makerect与A_Wds.makewds必须保证已用A_Wds.makebit采集完数据,否则无效。
  67. 3:清除自定数据A_Wds.clearbit。
  68. 4:因采集过程比较慢,640*480约2秒,所以可预先采集存储在变量中,利用存档的方
  69.    式建立形状库,改变窗体时直接调用即可。
  70. #------------------------------------------------------------------------------
  71. 外延功能:
  72. 一:利用自定窗体与显示图片创建美观的新显示框。
  73. 二:只要输入窗体标题,非RM程序也可以通过该脚本修改。
  74. #------------------------------------------------------------------------------
  75. =end
  76. #==============================================================================


  77. module A_Wds
  78.   
  79.   @name = '百变窗体'
  80.   
  81.   #自定窗体参照底色
  82.   @color_w = Color.new(255,255,255)
  83.   #位置修正
  84.   LEFT = 3
  85.   TOP = 29
  86.   CP_ACP = 0
  87.   CP_UTF8 = 65001
  88.   WDS_AND = 0x1  
  89.   WDS_OR = 0x2   
  90.   WDS_RUC = 0x3  
  91.   WDS_SUB = 0x4  
  92.   
  93.   #转码
  94.   @m2w = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  95.   @w2m = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')
  96.   @wsm = Proc.new{|i|
  97.          len = @m2w.call(CP_UTF8, 0, i, -1, nil, 0)
  98.          buf = "\0\0" * len
  99.          @m2w.call(CP_UTF8, 0, i, -1, buf, buf.size/2)
  100.          len = @w2m.call(CP_ACP, 0, buf, -1, nil, 0, nil, nil)
  101.          @s = "\0" * len
  102.          @w2m.call(CP_ACP, 0, buf, -1, @s, @s.size, nil, nil)
  103.          }
  104.   @wsm.call(@name)  
  105.   
  106.   #生成必要API
  107.   #获取目标句柄
  108.   @FindWindowEX = Win32API.new('user32','FindWindowEx','llpp','l')
  109.   @hWnd = @FindWindowEX.call(0,0,nil,@s)
  110.   #设置窗口
  111.   @setwindows = Win32API.new('user32','SetWindowRgn','lll','l')
  112.   #创建矩形(左上xy,右下xy)
  113.   @rect = Win32API.new('gdi32','CreateRectRgn','llll','l')
  114.   #创建圆角矩形(左上xy,右下xy,圆宽,圆高)
  115.   @roundrect = Win32API.new('gdi32','CreateRoundRectRgn','llllll','l')
  116.   #创建圆(左上xy,右下xy)  
  117.   @circlerect = Win32API.new('gdi32','CreateEllipticRgn','llll','l')
  118.   #创建多边形(端点连线)
  119.   @polygonrect = Win32API.new('gdi32','CreatePolygonRgn','pll','l')
  120.   
  121.   #合并矩形
  122.   @joinrect = Win32API.new('gdi32','CombineRgn','llll','l')
  123.   #删除GDI备用
  124.   @deleterect = Win32API.new('gdi32','DeleteObject','l','l')

  125.   #临时图像数据
  126.   @bitmap_date = []
  127.   
  128.   #设置窗体
  129.   def self.setwindow(rect)
  130.       @setwindows.call(@hWnd,rect,1)
  131.   end  
  132.    
  133.   #获取标准矩形
  134.   def self.rect(lx,ly,rx,ry)      
  135.       return @rect.call(LEFT+lx,TOP+ly,LEFT+lx+rx,TOP+ly+ry)
  136.   end
  137.    
  138.   #获取圆角矩形
  139.   def self.round(lx,ly,rx,ry,cw,ch)
  140.       return @roundrect.call(LEFT+lx,TOP+ly,LEFT+lx+rx,TOP+ly+ry,cw,ch)
  141.   end

  142.   #获取圆形矩形
  143.   def self.circle(lx,ly,rx,ry)
  144.       return @circlerect.call(LEFT+lx,TOP+ly,LEFT+lx+rx,TOP+ly+ry)
  145.   end

  146.   #获取多边矩形
  147.   def self.polygon(*arg)
  148.       n = [*arg]
  149.       s = Array.new
  150.       for i in n
  151.          pointapi = [i[0]+LEFT,i[1]+TOP].pack('ll')
  152.          s.push pointapi
  153.       end
  154.       return @polygonrect.call(s.to_s,n.size,1)
  155.   end

  156.   #采集自定矩形数据
  157.   def self.makebit(name)
  158.       bitmap = RPG::Cache.picture(name)
  159.       for y in 0...bitmap.height
  160.          s = []
  161.          @line = false
  162.          for x in 0...bitmap.width
  163.              #Graphics.update if (x == 0)
  164.              if bitmap.get_pixel(x,y) != @color_w
  165.                 if !@line
  166.                    @line = true
  167.                    s.push(x) ; s.push(y)     
  168.                 end
  169.                 if x == bitmap.width-1
  170.                    s.push(x) ; s.push(y+1)
  171.                    @bitmap_date.push s
  172.                    s = []
  173.                    @line = false
  174.                    next
  175.                 end                 
  176.              elsif @line  
  177.                 s.push(x) ; s.push(y+1)
  178.                 @bitmap_date.push s
  179.                 s = []
  180.                 @line = false                  
  181.              end
  182.          end
  183.       end
  184.   end
  185.    
  186.   #获取自定矩形
  187.   def self.makerect(lx=0,ly=0)
  188.       return (p '无矩形数据!')if @bitmap_date.empty?
  189.       s = @rect.call(0,0,0,0)
  190.       for i in @bitmap_date
  191.          temprect = @rect.call(LEFT+i[0]+lx,TOP+i[1]+ly,LEFT+i[2]+lx,TOP+i[3]+ly)
  192.          @joinrect.call(s,s,temprect,WDS_OR)         
  193.       end
  194.       self.delete(temprect)
  195.       return s      
  196.   end
  197.    
  198.   #普通矩形窗体
  199.   def self.rectwds(lx,ly,rx,ry)
  200.       @setwindows.call(@hWnd,self.rect(lx,ly,rx,ry),1)
  201.   end
  202.    
  203.   #圆角矩形窗体
  204.   def self.roundwds(lx,ly,rx,ry,cw,ch)
  205.       @setwindows.call(@hWnd,self.round(lx,ly,rx,ry,cw,ch),1)
  206.   end

  207.   #圆形窗体
  208.   def self.circlewds(lx,ly,rx,ry)
  209.       @setwindows.call(@hWnd,self.circle(lx,ly,rx,ry),1)
  210.   end
  211.    
  212.   #多边窗体
  213.   def self.polygonwds(*arg)
  214.       @setwindows.call(@hWnd,self.polygon(*arg),1)
  215.   end
  216.    
  217.   #自定窗体
  218.   def self.makewds(lx=0,ly=0)
  219.       @setwindows.call(@hWnd,self.makerect(lx,ly),1)
  220.       @bitmap_date.clear
  221.   end
  222.    
  223.   #rect1加rect2  
  224.   def self.+(rect1,rect2,set=true)
  225.       s = @rect.call(0,0,0,0)
  226.       @joinrect.call(s,rect1,rect2,WDS_OR)
  227.       @setwindows.call(@hWnd,s,1) if set
  228.       return s   
  229.   end
  230.    
  231.   #rect1减rect2  
  232.   def self.-(rect1,rect2,set=true)
  233.       s = @rect.call(0,0,0,0)
  234.       @joinrect.call(s,rect1,rect2,WDS_SUB)
  235.       @setwindows.call(@hWnd,s,1) if set     
  236.       return s      
  237.   end
  238.    
  239.   #rect1与rect2交集  
  240.   def self./(rect1,rect2,set=true)
  241.       s = @rect.call(0,0,0,0)
  242.       @joinrect.call(s,rect1,rect2,WDS_AND)
  243.       @setwindows.call(@hWnd,s,1) if set     
  244.       return s      
  245.   end

  246.   #rect1与rect2非交集  
  247.   def self.*(rect1,rect2,set=true)
  248.       s = @rect.call(0,0,0,0)
  249.       @joinrect.call(s,rect1,rect2,WDS_RUC)
  250.       @setwindows.call(@hWnd,s,1) if set
  251.       return s     
  252.   end
  253.   
  254.   #删除GDI
  255.   def self.delete(rect)
  256.       @deleterect.call(rect)
  257.   end  
  258.   
  259. end

复制代码




              [本贴由 叶舞枫 于 2007-4-1 19:37:48 进行了编辑]
纵然千里外,我等雁归来。

Lv1.梦旅人

月下可怜人

梦石
0
星屑
50
在线时间
10 小时
注册时间
2005-11-23
帖子
4085

第1届短篇游戏比赛亚军

2
 楼主| 发表于 2007-3-27 03:32:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
脚本内容详解:

功能:任意改变窗体的形状,@name = '百变窗体'处换成自己的工程名。

注意:1、全屏模式下会恢复正常,可配合夏娜的禁止ALT+ENTER使用。

基础窗体形状(四种):
1、矩形窗体,调用方式:A_Wds.rectwds(X坐标,Y坐标,宽,高)
2、圆角矩形窗体,调用方式:A_Wds.roundwds(X坐标,Y坐标,宽,高,圆角椭圆的宽,
                                          圆角椭圆的高)
3、圆形窗体,调用方式:A_Wds.circlewds(X坐标,Y坐标,宽,高)
4、多边形窗体,调用方式:A_Wds.polygonwds([端点1],[端点2],[端点3]……)
               非常强大的方法,端点数不限,程序会根据端点顺序自动连接成形状。
   例如修改窗体成一个以窗口顶部中点为顶点,底部为底边创立一三角形窗体。
   方法为:A_Wds.polygonwds([320,0],[0,480],[640,480])
   类似于菱形,五角星等形状都可实现。
5、自定窗体,具体方法见“自定窗体详解”

PS:坐标的基准为窗体内部的显示区域左上角为基准,即与RM内建对象标准相同。


原理:创建一矩形(矩形非数学意义的方形,代表区域)区域,将窗体移入该区域进行显示,达成改变窗体的目的。

矩形区域的获取方法:
1、标准矩形:A_Wds.rect(X坐标,Y坐标,宽,高)
2、圆角矩形,A_Wds.round(X坐标,Y坐标,宽,高,圆角椭圆的宽,圆角椭圆的高)
3、圆形矩形,A_Wds.circle(X坐标,Y坐标,宽,高)
4、多边形矩形,A_Wds.polygon([端点1],[端点2],[端点3]……)
5、自定矩形,具体方法见“自定窗体详解”

PS:这几个方法是利用返回值获取矩形,因还未将窗体移动其内,不会对窗体形状造成
    影响,可利用内定的四则运算对矩形合并拆解,以得到新的形状。

矩形四则运算:
加法:取两矩形并集,调用方法,A_Wds.+(矩形1,矩形2,是否立即改变窗体)
减法:矩形1减矩形2,调用方法,A_Wds.-(矩形1,矩形2,是否立即改变窗体)
乘法:取两矩形非交集部分,调用方法,A_Wds.*(矩形1,矩形2,是否立即改变窗体)
除法:取两矩形交集,调用方法,A_Wds./(矩形1,矩形2,是否立即改变窗体)

PS:方法返回值的是合并后的新矩形,所以可不立即改变窗体,多次运算,创建希奇古
    怪的形状。

四则运算样例:
A_Wds.setwindow(矩形)可直接设置窗体,主要配合四则运算得出的矩形。
例如创建一同心环窗体具体流程:

a1 = A_Wds.circle(0,0,640,480)       #创建外侧大圆形状
b1 = A_Wds.circle(50,50,540,380)     #创建外侧小圆形状
c1 = A_Wds.-(a1,b1,false)            #外侧大圆减外侧小圆,不改变窗体,
                                     #保留新矩形
a2 = A_Wds.circle(100,100,440,280)   #创建内侧大圆形状
b2 = A_Wds.circle(150,150,340,180)   #创建内侧小圆形状
c2 = A_Wds.-(a2,b2,false)            #内侧大圆减内侧小圆,不改变窗体,
                                     #保留新矩形
A_Wds.+(c1,c2,true)                  #合并内外环,生成同心环窗体。

自定窗体详解:
最为强大的方法,可实现任何2D形状。
以一张图片的底色@color_w为参照背景,将窗体变化为非底色部分的形状,所以事先
需要预备一张图片采集数据。
默认底色为Color.new(255,255,255)。
基本流程为:
1:采集图片数据,方法:A_Wds.makebit("图片名")。
2:根据图片数据生成矩形并改变窗体,方法:A_Wds.makewds(x坐标偏移,y坐标偏移)

PS:
1:获取自定义矩形的方法:A_Wds.makerect,可正常四则运算。
2:A_Wds.makerect与A_Wds.makewds必须保证已用A_Wds.makebit采集完数据,否则无效。
3:清除自定数据A_Wds.clearbit。
4:因采集过程比较慢,640*480约2秒,所以可预先采集存储在变量中,利用存档的方
   式建立形状库,改变窗体时直接调用即可。



外延功能:
一:利用自定窗体与显示图片创建美观的新显示框。


二:只要输入窗体标题,非RM程序也可以通过该脚本修改。


展示范例之形体变化
ftp://[email protected]/个� ... 窗体之变化.rar

展示范例之事件表达
让RM的事件制作更上一层楼。
ftp://[email protected]/个� ... 窗体之事件.rar



源程序:
  1. #==============================================================================
  2. # ■ A_Wds - 百变窗体  BY:美兽
  3. #------------------------------------------------------------------------------
  4. =begin
  5. #------------------------------------------------------------------------------ 
  6. 功能:任意改变窗体的形状,@name = '百变窗体'处换成自己的工程名。
  7. #------------------------------------------------------------------------------
  8. 注意:1、全屏模式下会恢复正常,可配合夏娜的禁止ALT+ENTER使用。

  9. #------------------------------------------------------------------------------
  10. 基础窗体形状(四种):
  11. 1、矩形窗体,调用方式:A_Wds.rectwds(X坐标,Y坐标,宽,高)
  12. 2、圆角矩形窗体,调用方式:A_Wds.roundwds(X坐标,Y坐标,宽,高,圆角椭圆的宽,
  13.                                           圆角椭圆的高)
  14. 3、圆形窗体,调用方式:A_Wds.circlewds(X坐标,Y坐标,宽,高)
  15. 4、多边形窗体,调用方式:A_Wds.polygonwds([端点1],[端点2],[端点3]……)
  16.                非常强大的方法,端点数不限,程序会根据端点顺序自动连接成形状。
  17.    例如修改窗体成一个以窗口顶部中点为顶点,底部为底边创立一三角形窗体。
  18.    方法为:A_Wds.polygonwds([320,0],[0,480],[640,480])
  19.    类似于菱形,五角星等形状都可实现。
  20. 5、自定窗体,具体方法见“自定窗体详解”

  21. PS:坐标的基准为窗体内部的显示区域左上角为基准,即与RM内建对象标准相同。
  22. #------------------------------------------------------------------------------
  23. 原理:创建一矩形(矩形非数学意义的方形,代表区域)区域,将窗体移入该区域
  24.       进行显示,达成改变窗体的目的。
  25. #------------------------------------------------------------------------------
  26. 矩形区域的获取方法:
  27. 1、标准矩形:A_Wds.rect(X坐标,Y坐标,宽,高)
  28. 2、圆角矩形,A_Wds.round(X坐标,Y坐标,宽,高,圆角椭圆的宽,圆角椭圆的高)
  29. 3、圆形矩形,A_Wds.circle(X坐标,Y坐标,宽,高)
  30. 4、多边形矩形,A_Wds.polygon([端点1],[端点2],[端点3]……)
  31. 5、自定矩形,具体方法见“自定窗体详解”

  32. PS:这几个方法是利用返回值获取矩形,因还未将窗体移动其内,不会对窗体形状造成
  33.     影响,可利用内定的四则运算对矩形合并拆解,以得到新的形状。
  34. #------------------------------------------------------------------------------
  35. 矩形四则运算:
  36. 加法:取两矩形并集,调用方法,A_Wds.+(矩形1,矩形2,是否立即改变窗体)
  37. 减法:矩形1减矩形2,调用方法,A_Wds.-(矩形1,矩形2,是否立即改变窗体)
  38. 乘法:取两矩形非交集部分,调用方法,A_Wds.*(矩形1,矩形2,是否立即改变窗体)
  39. 除法:取两矩形交集,调用方法,A_Wds./(矩形1,矩形2,是否立即改变窗体)

  40. PS:方法返回值的是合并后的新矩形,所以可不立即改变窗体,多次运算,创建希奇古
  41.     怪的形状。
  42. #------------------------------------------------------------------------------
  43. 四则运算样例:
  44. A_Wds.setwindow(矩形)可直接设置窗体,主要配合四则运算得出的矩形。
  45. 例如创建一同心环窗体具体流程:

  46. a1 = A_Wds.circle(0,0,640,480)       #创建外侧大圆形状
  47. b1 = A_Wds.circle(50,50,540,380)     #创建外侧小圆形状
  48. c1 = A_Wds.-(a1,b1,false)            #外侧大圆减外侧小圆,不改变窗体,
  49.                                      #保留新矩形
  50. a2 = A_Wds.circle(100,100,440,280)   #创建内侧大圆形状
  51. b2 = A_Wds.circle(150,150,340,180)   #创建内侧小圆形状
  52. c2 = A_Wds.-(a2,b2,false)            #内侧大圆减内侧小圆,不改变窗体,
  53.                                      #保留新矩形
  54. A_Wds.+(c1,c2,true)                  #合并内外环,生成同心环窗体。
  55. #------------------------------------------------------------------------------
  56. 自定窗体详解:
  57. 最为强大的方法,可实现任何2D形状。
  58. 以一张图片的底色@color_w为参照背景,将窗体变化为非底色部分的形状,所以事先
  59. 需要预备一张图片采集数据。
  60. 默认底色为Color.new(255,255,255)。
  61. 基本流程为:
  62. 1:采集图片数据,方法:A_Wds.makebit("图片名")。
  63. 2:根据图片数据生成矩形并改变窗体,方法:A_Wds.makewds(x坐标偏移,y坐标偏移)

  64. PS:
  65. 1:获取自定义矩形的方法:A_Wds.makerect,可正常四则运算。
  66. 2:A_Wds.makerect与A_Wds.makewds必须保证已用A_Wds.makebit采集完数据,否则无效。
  67. 3:清除自定数据A_Wds.clearbit。
  68. 4:因采集过程比较慢,640*480约2秒,所以可预先采集存储在变量中,利用存档的方
  69.    式建立形状库,改变窗体时直接调用即可。
  70. #------------------------------------------------------------------------------
  71. 外延功能:
  72. 一:利用自定窗体与显示图片创建美观的新显示框。
  73. 二:只要输入窗体标题,非RM程序也可以通过该脚本修改。
  74. #------------------------------------------------------------------------------
  75. =end
  76. #==============================================================================


  77. module A_Wds
  78.   
  79.   @name = '百变窗体'
  80.   
  81.   #自定窗体参照底色
  82.   @color_w = Color.new(255,255,255)
  83.   #位置修正
  84.   LEFT = 3
  85.   TOP = 29
  86.   CP_ACP = 0
  87.   CP_UTF8 = 65001
  88.   WDS_AND = 0x1  
  89.   WDS_OR = 0x2   
  90.   WDS_RUC = 0x3  
  91.   WDS_SUB = 0x4  
  92.   
  93.   #转码
  94.   @m2w = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  95.   @w2m = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')
  96.   @wsm = Proc.new{|i|
  97.          len = @m2w.call(CP_UTF8, 0, i, -1, nil, 0)
  98.          buf = "\0\0" * len
  99.          @m2w.call(CP_UTF8, 0, i, -1, buf, buf.size/2)
  100.          len = @w2m.call(CP_ACP, 0, buf, -1, nil, 0, nil, nil)
  101.          @s = "\0" * len
  102.          @w2m.call(CP_ACP, 0, buf, -1, @s, @s.size, nil, nil)
  103.          }
  104.   @wsm.call(@name)  
  105.   
  106.   #生成必要API
  107.   #获取目标句柄
  108.   @FindWindowEX = Win32API.new('user32','FindWindowEx','llpp','l')
  109.   @hWnd = @FindWindowEX.call(0,0,nil,@s)
  110.   #设置窗口
  111.   @setwindows = Win32API.new('user32','SetWindowRgn','lll','l')
  112.   #创建矩形(左上xy,右下xy)
  113.   @rect = Win32API.new('gdi32','CreateRectRgn','llll','l')
  114.   #创建圆角矩形(左上xy,右下xy,圆宽,圆高)
  115.   @roundrect = Win32API.new('gdi32','CreateRoundRectRgn','llllll','l')
  116.   #创建圆(左上xy,右下xy)  
  117.   @circlerect = Win32API.new('gdi32','CreateEllipticRgn','llll','l')
  118.   #创建多边形(端点连线)
  119.   @polygonrect = Win32API.new('gdi32','CreatePolygonRgn','pll','l')
  120.   
  121.   #合并矩形
  122.   @joinrect = Win32API.new('gdi32','CombineRgn','llll','l')
  123.   #删除GDI备用
  124.   @deleterect = Win32API.new('gdi32','DeleteObject','l','l')

  125.   #临时图像数据
  126.   @bitmap_date = []
  127.   
  128.   #设置窗体
  129.   def self.setwindow(rect)
  130.       @setwindows.call(@hWnd,rect,1)
  131.   end  
  132.    
  133.   #获取标准矩形
  134.   def self.rect(lx,ly,rx,ry)      
  135.       return @rect.call(LEFT+lx,TOP+ly,LEFT+lx+rx,TOP+ly+ry)
  136.   end
  137.    
  138.   #获取圆角矩形
  139.   def self.round(lx,ly,rx,ry,cw,ch)
  140.       return @roundrect.call(LEFT+lx,TOP+ly,LEFT+lx+rx,TOP+ly+ry,cw,ch)
  141.   end

  142.   #获取圆形矩形
  143.   def self.circle(lx,ly,rx,ry)
  144.       return @circlerect.call(LEFT+lx,TOP+ly,LEFT+lx+rx,TOP+ly+ry)
  145.   end

  146.   #获取多边矩形
  147.   def self.polygon(*arg)
  148.       n = [*arg]
  149.       s = Array.new
  150.       for i in n
  151.          pointapi = [i[0]+LEFT,i[1]+TOP].pack('ll')
  152.          s.push pointapi
  153.       end
  154.       return @polygonrect.call(s.to_s,n.size,1)
  155.   end

  156.   #采集自定矩形数据
  157.   def self.makebit(name)
  158.       bitmap = RPG::Cache.picture(name)
  159.       for y in 0...bitmap.height
  160.          s = []
  161.          @line = false
  162.          for x in 0...bitmap.width
  163.              #Graphics.update if (x == 0)
  164.              if bitmap.get_pixel(x,y) != @color_w
  165.                 if !@line
  166.                    @line = true
  167.                    s.push(x) ; s.push(y)     
  168.                 end
  169.                 if x == bitmap.width-1
  170.                    s.push(x) ; s.push(y+1)
  171.                    @bitmap_date.push s
  172.                    s = []
  173.                    @line = false
  174.                    next
  175.                 end                 
  176.              elsif @line  
  177.                 s.push(x) ; s.push(y+1)
  178.                 @bitmap_date.push s
  179.                 s = []
  180.                 @line = false                  
  181.              end
  182.          end
  183.       end
  184.   end
  185.    
  186.   #获取自定矩形
  187.   def self.makerect(lx=0,ly=0)
  188.       return (p '无矩形数据!')if @bitmap_date.empty?
  189.       s = @rect.call(0,0,0,0)
  190.       for i in @bitmap_date
  191.          temprect = @rect.call(LEFT+i[0]+lx,TOP+i[1]+ly,LEFT+i[2]+lx,TOP+i[3]+ly)
  192.          @joinrect.call(s,s,temprect,WDS_OR)         
  193.       end
  194.       self.delete(temprect)
  195.       return s      
  196.   end
  197.    
  198.   #普通矩形窗体
  199.   def self.rectwds(lx,ly,rx,ry)
  200.       @setwindows.call(@hWnd,self.rect(lx,ly,rx,ry),1)
  201.   end
  202.    
  203.   #圆角矩形窗体
  204.   def self.roundwds(lx,ly,rx,ry,cw,ch)
  205.       @setwindows.call(@hWnd,self.round(lx,ly,rx,ry,cw,ch),1)
  206.   end

  207.   #圆形窗体
  208.   def self.circlewds(lx,ly,rx,ry)
  209.       @setwindows.call(@hWnd,self.circle(lx,ly,rx,ry),1)
  210.   end
  211.    
  212.   #多边窗体
  213.   def self.polygonwds(*arg)
  214.       @setwindows.call(@hWnd,self.polygon(*arg),1)
  215.   end
  216.    
  217.   #自定窗体
  218.   def self.makewds(lx=0,ly=0)
  219.       @setwindows.call(@hWnd,self.makerect(lx,ly),1)
  220.       @bitmap_date.clear
  221.   end
  222.    
  223.   #rect1加rect2  
  224.   def self.+(rect1,rect2,set=true)
  225.       s = @rect.call(0,0,0,0)
  226.       @joinrect.call(s,rect1,rect2,WDS_OR)
  227.       @setwindows.call(@hWnd,s,1) if set
  228.       return s   
  229.   end
  230.    
  231.   #rect1减rect2  
  232.   def self.-(rect1,rect2,set=true)
  233.       s = @rect.call(0,0,0,0)
  234.       @joinrect.call(s,rect1,rect2,WDS_SUB)
  235.       @setwindows.call(@hWnd,s,1) if set     
  236.       return s      
  237.   end
  238.    
  239.   #rect1与rect2交集  
  240.   def self./(rect1,rect2,set=true)
  241.       s = @rect.call(0,0,0,0)
  242.       @joinrect.call(s,rect1,rect2,WDS_AND)
  243.       @setwindows.call(@hWnd,s,1) if set     
  244.       return s      
  245.   end

  246.   #rect1与rect2非交集  
  247.   def self.*(rect1,rect2,set=true)
  248.       s = @rect.call(0,0,0,0)
  249.       @joinrect.call(s,rect1,rect2,WDS_RUC)
  250.       @setwindows.call(@hWnd,s,1) if set
  251.       return s     
  252.   end
  253.   
  254.   #删除GDI
  255.   def self.delete(rect)
  256.       @deleterect.call(rect)
  257.   end  
  258.   
  259. end

复制代码




              [本贴由 叶舞枫 于 2007-4-1 19:37:48 进行了编辑]
纵然千里外,我等雁归来。

Lv1.梦旅人

梦石
0
星屑
111
在线时间
74 小时
注册时间
2006-5-29
帖子
453
3
发表于 2007-3-27 04:32:31 | 只看该作者
沙发啊..
{/se}一来就看到好东东鸟.这个........太强悍了吧.
看的偶目瞪口呆的说...效果很棒~!!有一些特殊用法呢。
【我的百度空间】
 不定时更新绘画或像素图~~
回复 支持 反对

使用道具 举报

Lv1.梦旅人

大火烧了毛毛虫

梦石
0
星屑
205
在线时间
288 小时
注册时间
2006-3-18
帖子
2335
4
发表于 2007-3-27 04:52:20 | 只看该作者
好有趣``
回复 支持 反对

使用道具 举报

Lv1.梦旅人

邪恶小龙包

梦石
0
星屑
55
在线时间
17 小时
注册时间
2006-5-22
帖子
7006

第2届短篇游戏比赛冠军第3届短篇游戏大赛小游戏及其他组冠军RMVX自由创作大赛冠军

5
发表于 2007-3-27 05:09:57 | 只看该作者
好强的东西......膜拜.........
虚无  堕落
回复 支持 反对

使用道具 举报

Lv1.梦旅人

逃兵

6
发表于 2007-3-27 20:47:41 | 只看该作者
刚回来看一眼就看到这个,{/qiang}
冒个泡,后迅速逃逸
「If you judge people, you have no time to love them.」—— Mother Teresa
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
1 小时
注册时间
2006-7-21
帖子
714
7
发表于 2007-3-27 20:50:25 | 只看该作者
还是第一页,看顶后看……{/hx}
回复 支持 反对

使用道具 举报

Lv1.梦旅人

Dancer-

梦石
0
星屑
105
在线时间
78 小时
注册时间
2006-5-15
帖子
3306
8
发表于 2007-3-27 20:52:57 | 只看该作者
强是强……
但是真的用有么?{/fd}
一个机缘巧合后,被改变了人生的第八年。
养着两只猫,可是我对猫过敏。
为了那终将到来的一天。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

月下可怜人

梦石
0
星屑
50
在线时间
10 小时
注册时间
2005-11-23
帖子
4085

第1届短篇游戏比赛亚军

9
 楼主| 发表于 2007-3-28 03:34:32 | 只看该作者
以下引用小真·爱舞于2007-3-27 12:52:57的发言:

强是强……
但是真的用有么?


最迟一月,会让该功能出现在游戏中,前提是,不出意外。
纵然千里外,我等雁归来。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

獨·思

梦石
0
星屑
60
在线时间
2 小时
注册时间
2006-12-27
帖子
2085
10
发表于 2007-3-28 03:37:37 | 只看该作者
强……太强了,膜拜…………,另外,美兽大大的经验……汗一个!
殘花逝盡心亦亂,劍魂難掩月色寒,
吟笛蕭瑟空留戀,雪落無痕為影殘。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-4 05:09

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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