Project1

标题: 【卖萌】关于渐变图像的绘制 [打印本页]

作者: 无脑之人    时间: 2013-5-18 20:30
标题: 【卖萌】关于渐变图像的绘制
在RMVX中貌似有了线性渐变的矩形绘制,利用它可以进行更多的(bu)科学绘制
首先要引入一个很渣的东西——配色条,它用于设置渐变的内容
  1. class ColorStrip
  2.   def initialize(length,color1,color2=nil)
  3.     raise TypeError,"不可以将#{length.class}代入配色条(length)." if length.class != Fixnum
  4.     raise TypeError,"不可以将#{color1.class}代入配色条(color)." if color1.class != Color
  5.     @length = length
  6.     color2 ||= color1
  7.     raise TypeError,"不可以将#{color2.class}代入配色条(color)." if color2.class != Color
  8.     [url=home.php?mod=space&uid=10453]@color[/url] = {}
  9.     @color[0] = color1
  10.     @color[length] = color2
  11.   end
  12.   
  13.   def add(pos,color)
  14.     raise TypeError,"应用了非法的配色条位置." if pos.class != Fixnum
  15.     raise TypeError,"不可以将#{color.class}代入配色条(color)." if color.class != Color
  16.     @color[pos] = color
  17.   end
  18.   
  19.   def get(pos)
  20.     raise TypeError,"应用了非法的配色条位置." if pos.class != Fixnum
  21.     bmp = bitmap
  22.     c = bmp.get_pixel(pos,0)
  23.     bmp.dispose
  24.     c
  25.   end
  26.   
  27.   def bitmap
  28.     key = @color.keys.sort!
  29.     bmp = Bitmap.new(@length,1)
  30.     for i in 0...key.size-1
  31.       color1 = @color[key[i]]
  32.       color2 = @color[key[i+1]]
  33.       pos1 = key[i]
  34.       pos2 = key[i+1]
  35.       bmp.gradient_fill_rect(pos1,0,pos2-pos1,1, color1, color2)
  36.     end
  37.     bmp
  38.   end
  39. end
复制代码
使用方法想必这里的神触们肯定都能明白……
接下来引入对Bitmap的方法的定义……
  1. class Bitmap
  2.   def draw_strip(rect,cs,dir=0)
  3.     xr = (rect.x)..(rect.x+rect.width)
  4.     yr = (rect.y)..(rect.y+rect.height)
  5.     bitmap = cs.bitmap
  6.     case dir
  7.     when 0
  8.       for y in yr
  9.         blt(rect.x,y,bitmap,bitmap.rect)
  10.       end
  11.     when 1
  12.       bmp = Bitmap.new(1,rect.height)
  13.       for y in yr
  14.         bmp.set_pixel(0,y-rect.y,cs.get(y-rect.y))
  15.       end
  16.       for x in xr
  17.         blt(x,rect.y,bmp,bmp.rect)
  18.       end
  19.       bmp.dispose
  20.     end
  21.     bitmap.dispose
  22.   end
  23.   #以上是线性渐变
  24.     def draw_round(x, y, r, c1, c2=nil)
  25.      if c1.class == Bitmap
  26.       sample = c1
  27.     elsif c1.class == ColorStrip
  28.       sample = c1.bitmap
  29.     else
  30.       sample = Bitmap.new(r, 1)
  31.       c2 ||= c1
  32.       sample.gradient_fill_rect(sample.rect, c1, c2)
  33.     end
  34.     cx, cy = x, y
  35.     (0...r).each{|y|
  36.       xr = Math.sqrt(r * r - y * y)
  37.       next if y >= xr
  38.       (0..xr).each{|x|
  39.         dis = Math.hypot(x, y)
  40.         c = sample.get_pixel(dis, 0)
  41.         set_pixel cx + x, cy + y, c
  42.         set_pixel cx - x, cy + y, c
  43.         set_pixel cx - x, cy - y, c
  44.         set_pixel cx + x, cy - y, c
  45.         set_pixel cx + y, cy + x, c
  46.         set_pixel cx - y, cy + x, c
  47.         set_pixel cx - y, cy - x, c
  48.         set_pixel cx + y, cy - x, c
  49.       }
  50.     }
  51.     sample.dispose
  52.   end
  53.   #以上是圆的放射性渐变
  54. end
复制代码
圆的渐变方法来自兰触,在此表示谢意
突然发现没什么可说的……贴张图吧

作者: 神圣战士06    时间: 2013-5-18 20:34
前排膜拜二要神触
作者: feizhaodan    时间: 2013-5-18 21:14
这其实就是Direct2D的渐变色绘制方法。当然人家的效率比我们这个高很多。
作者: 你欠抽吧    时间: 2013-6-7 19:09
混个脸熟
作者: 二要触翻天际    时间: 2013-6-7 20:55
触                  
作者: 十大神兽の1    时间: 2013-7-27 20:36
跪拜大触




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