Project1

标题: ISA 文字渐变 Text Gradient [打印本页]

作者: 沙漠点灰    时间: 2011-4-16 16:15
标题: ISA 文字渐变 Text Gradient
本帖最后由 沙漠点灰 于 2011-4-17 15:11 编辑

某系统的附加产物:效果

提供10种渐变,实质只有几种;图中最后个数字代表方式;
0.中央渐变
1~4 & 6~9参考小键盘位置
比如4就是左到右,9就是右上到左下,很好理解
5为中心辐射,效果和0差不多,但算法不一样(废话),5就像太阳,而0像调色板...嘛,反正差不多
使用方法
bitmap_obj.draw_text(x,y,width,height,str,对齐方式,[渐变方法,color1,color2])
或者:
bitmap_obj.draw_text(rect,str,对齐方式,[渐变方法,color1,color2])
注意,[渐变方法,color1,color2]是数组,[]不可省略,使用渐变必须把对齐方式填了...
这张截图使用脚本:
  1. size = 58
  2. devil = []
  3. 0.upto(9){|i|
  4.   devil << Sprite.new
  5.   devil[-1].bitmap = Bitmap.new(640,480)
  6.   devil[-1].bitmap.font.size = size
  7.   array = [i, Color.new(255,0,0), Color.new(255,255,255)]
  8.   if i == 0
  9.     x,y = 220,360
  10.   else
  11.     x,y = (i-1)%3 * 220,(9-i)/3*120
  12.   end
  13.   devil[-1].bitmap.draw_text(x,y,size*3.5,size,"66RPG_#{i}",0,array)}
  14. loop do
  15.   Graphics.update
  16. end
复制代码
脚本如下:
  1. #______________________________________________________________________________
  2. # * 此脚本归66RPG - Idiot Script Association(ISA)所有,谢绝任何形式转载。
  3. #______________________________________________________________________________

  4. #==============================================================================
  5. # ■ 文字渐变 Text Gradient
  6. #------------------------------------------------------------------------------
  7. #   遵守协议:66RPG - Idiot Script Association(ISA)
  8. #   当前版本:0.1.0.0
  9. #------------------------------------------------------------------------------
  10. #   更新日记:沙漠.灰(2011.4.16)
  11. #             - 初始化
  12. #==============================================================================
  13. #==============================================================================
  14. # ■ Bitmap
  15. #------------------------------------------------------------------------------
  16. #  位图 类
  17. #==============================================================================

  18. class Bitmap
  19.   #--------------------------------------------------------------------------
  20.   # ● 描绘字符串
  21.   #    arrar 格式 arrar = [where, color1, color2]
  22.   #      where     : 渐变起始位置           值为:4 5 6 2 8
  23.   #      color1    : 起始颜色               Color类
  24.   #      color2    : 结束颜色               Color类
  25.   #--------------------------------------------------------------------------
  26.   alias isa_draw_text draw_text unless Bitmap.method_defined? "isa_draw_text"
  27.   def draw_text(x, y="", width=0, height=[], str="", align=0,array=[])
  28.     if x.is_a? Rect
  29.       s1 = x.x
  30.       s2 = x.y
  31.       s3 = x.width
  32.       s4 = x.height
  33.       return draw_text(s1,s2,s3,s4,y,width,height)
  34.     end
  35.     isa_draw_text(x, y, width, height, str, align)
  36.     return if array == [] or !(0..9).to_a.include? array[0]
  37.     case array[0]
  38.     when 0 # 中心渐变
  39.       # 计算中心坐标
  40.       cen_x = x + width / 2
  41.       cen_y = y + height/ 2
  42.       # 计算每(左右)像素应增加RGB值
  43.       r_p_46 = (array[2].red  - array[1].red  ) /width
  44.       g_p_46 = (array[2].green- array[1].green) /width
  45.       b_p_46 = (array[2].blue - array[1].blue ) /width
  46.       # 计算每(上下)像素应增加RGB值
  47.       r_p_28 = (array[2].red  - array[1].red  ) /height
  48.       g_p_28 = (array[2].green- array[1].green) /height
  49.       b_p_28 = (array[2].blue - array[1].blue ) /height
  50.       # 循环位图(坐标,我也不知道从哪开始)
  51.       for n_x in x...x+width
  52.         for n_y in y...y+height
  53.           alpha = self.get_pixel(n_x, n_y).alpha
  54.           next if alpha == 0
  55.           r_new = array[1].red   + (r_p_46 * (n_x - cen_x).abs+r_p_28 * (n_y - cen_y).abs)/2
  56.           g_new = array[1].green + (g_p_46 * (n_x - cen_x).abs+g_p_28 * (n_y - cen_y).abs)/2
  57.           b_new = array[1].blue  + (b_p_46 * (n_x - cen_x).abs+b_p_28 * (n_y - cen_y).abs)/2
  58.           self.set_pixel(n_x, n_y,Color.new(r_new, g_new, b_new, alpha))
  59.         end
  60.       end
  61.     when 1 # 右上渐变
  62.       # 调用 9 翻转
  63.       temp = [9, array[2], array[1], array[3]]
  64.       return draw_text(x, y, width, height, str, align, temp)
  65.     when 2 # 从下至上
  66.       # 调用 8 翻转
  67.       temp = [8, array[2], array[1], array[3]]
  68.       return draw_text(x, y, width, height, str, align, temp)
  69.     when 3 # 左上渐变
  70.       # 调用 7 翻转
  71.       temp = [7, array[2], array[1], array[3]]
  72.       return draw_text(x, y, width, height, str, align, temp)
  73.     when 4 # 从左至右
  74.       # 计算每像素应增加RGB值
  75.       r_p = (array[2].red  - array[1].red  ) / width
  76.       g_p = (array[2].green- array[1].green) / width
  77.       b_p = (array[2].blue - array[1].blue ) / width
  78.       # 循环位图(坐标,左开始)
  79.       for n_x in x...x+width
  80.         for n_y in y...y+height
  81.           alpha = self.get_pixel(n_x, n_y).alpha
  82.           next if alpha == 0
  83.           r_new = array[1].red   + r_p * (n_x - x)
  84.           g_new = array[1].green + g_p * (n_x - x)
  85.           b_new = array[1].blue  + b_p * (n_x - x)
  86.           self.set_pixel(n_x, n_y,Color.new(r_new, g_new, b_new, alpha))
  87.         end
  88.       end
  89.     when 5 # 中心辐射
  90.       # 计算中心坐标
  91.       cen_x = x + width / 2
  92.       cen_y = y + height/ 2
  93.       # 计算每像素应增加RGB值
  94.       len = Math.sqrt(height**2 + width**2)
  95.       r_p = (array[2].red  - array[1].red  ) / len
  96.       g_p = (array[2].green- array[1].green) / len
  97.       b_p = (array[2].blue - array[1].blue ) / len
  98.       # 循环位图(坐标,我也不知道从哪开始)
  99.       for n_x in x...x+width
  100.         for n_y in y...y+height
  101.           alpha = self.get_pixel(n_x, n_y).alpha
  102.           next if alpha == 0
  103.           step = Math.sqrt((n_x - cen_x)**2 + (n_y - cen_y)**2)
  104.           r_new = array[1].red   + r_p * step
  105.           g_new = array[1].green + g_p * step
  106.           b_new = array[1].blue  + b_p * step
  107.           self.set_pixel(n_x, n_y,Color.new(r_new, g_new, b_new, alpha))
  108.         end
  109.       end
  110.     when 6 # 从右至左
  111.       # 调用 4 翻转
  112.       temp = [4, array[2], array[1], array[3]]
  113.       return draw_text(x, y, width, height, str, align, temp)
  114.     when 7 # 右下渐变
  115.       # 计算每(左右)像素应增加RGB值
  116.       r_p_46 = (array[2].red  - array[1].red  ) / width
  117.       g_p_46 = (array[2].green- array[1].green) / width
  118.       b_p_46 = (array[2].blue - array[1].blue ) / width
  119.       # 计算每(上下)像素应增加RGB值
  120.       r_p_28 = (array[2].red  - array[1].red  ) / height
  121.       g_p_28 = (array[2].green- array[1].green) / height
  122.       b_p_28 = (array[2].blue - array[1].blue ) / height
  123.       # 循环位图(坐标,我也不知道从哪开始)
  124.       for n_x in x...x+width
  125.         for n_y in y...y+height
  126.           alpha = self.get_pixel(n_x, n_y).alpha
  127.           next if alpha == 0
  128.           r_new = array[1].red   + (r_p_46 * (n_x - x)+r_p_28 * (n_y - y))/2
  129.           g_new = array[1].green + (g_p_46 * (n_x - x)+g_p_28 * (n_y - y))/2
  130.           b_new = array[1].blue  + (b_p_46 * (n_x - x)+b_p_28 * (n_y - y))/2
  131.           self.set_pixel(n_x, n_y,Color.new(r_new, g_new, b_new, alpha))
  132.         end
  133.       end
  134.     when 8 # 从上至下
  135.       # 计算每像素应增加RGB值
  136.       r_p = (array[2].red  - array[1].red  ) / height
  137.       g_p = (array[2].green- array[1].green) / height
  138.       b_p = (array[2].blue - array[1].blue ) / height
  139.       # 循环位图(坐标,上开始)
  140.       time= -1
  141.       for n_y in y...y+height
  142.         for n_x in x...x+width
  143.           alpha = self.get_pixel(n_x, n_y).alpha
  144.           next if alpha == 0
  145.           r_new = array[1].red   + r_p * (n_y - y)
  146.           g_new = array[1].green + g_p * (n_y - y)
  147.           b_new = array[1].blue  + b_p * (n_y - y)
  148.           self.set_pixel(n_x, n_y,Color.new(r_new, g_new, b_new, alpha))
  149.         end
  150.       end
  151.     when 9 # 左下渐变
  152.       # 计算每(左右)像素应增加RGB值
  153.       r_p_46 = (array[2].red  - array[1].red  ) / width
  154.       g_p_46 = (array[2].green- array[1].green) / width
  155.       b_p_46 = (array[2].blue - array[1].blue ) / width
  156.       # 计算每(上下)像素应增加RGB值
  157.       r_p_28 = (array[2].red  - array[1].red  ) / height
  158.       g_p_28 = (array[2].green- array[1].green) / height
  159.       b_p_28 = (array[2].blue - array[1].blue ) / height
  160.       # 循环位图(坐标,我也不知道从哪开始)
  161.       for n_x in (x...x+width).to_a.reverse
  162.         for n_y in y...y+height
  163.           alpha = self.get_pixel(n_x, n_y).alpha
  164.           next if alpha == 0
  165.           r_new = array[1].red   + (r_p_46 * (x+width-n_x)+r_p_28 * (n_y - y))/2
  166.           g_new = array[1].green + (g_p_46 * (x+width-n_x)+g_p_28 * (n_y - y))/2
  167.           b_new = array[1].blue  + (b_p_46 * (x+width-n_x)+b_p_28 * (n_y - y))/2
  168.           self.set_pixel(n_x, n_y,Color.new(r_new, g_new, b_new, alpha))
  169.         end
  170.       end
  171.     end
  172.   end
  173. end
复制代码

作者: 小传子    时间: 2011-4-16 22:50
= =居然有人发布了,赶紧的看看先。
作者: 忧雪の伤    时间: 2011-6-19 15:58
本帖最后由 忧雪の伤 于 2011-6-19 16:01 编辑
  1. size = 58
  2. devil = []
  3. 0.upto(9){|i|
  4.   devil << Sprite.new
  5.   devil[-1].bitmap = Bitmap.new('Graphics/Titles/001-Title01')
  6.   devil[-1].bitmap.font.size = size
  7.   array = [i, Color.new(255,0,0), Color.new(255,255,255)]
  8.   if i == 0
  9.     x,y = 220,360
  10.   else
  11.     x,y = (i-1)%3 * 220,(9-i)/3*120
  12.   end
  13.   devil[-1].bitmap.draw_text(x,y,size*3.5,size,"66RPG_#{i}",0,array)}
  14. loop do
  15.   Graphics.update
  16. end
复制代码



试了这个就知道问题了。

这说明,依靠alpha来决定是否填充是不行的。
作者: yangff    时间: 2011-6-19 17:44
set_pixel自重不解释,LZ可以试试遮罩= =或者挂个DLL啥的,再或者哟给你blt也好啊




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