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

Project1

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

[原创发布] 简单的HSL渐变

[复制链接]

Lv4.逐梦者

梦石
0
星屑
6483
在线时间
119 小时
注册时间
2020-1-8
帖子
234
跳转到指定楼层
1
发表于 2022-3-16 14:55:04 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 RPGzh500223 于 2022-3-17 15:17 编辑

边学边练

RUBY 代码复制
  1. <<-DOC
  2. 函数原型:
  3.   int bitmapDrawScanH(int bitmap_obj_id, int color0_obj_id, int color1_obj_id)
  4. 函数作用:
  5.   以color0,color1进行HSL渐变,水平填充至bitmap的最后一行,
  6.   作为颜色源数据给相关需求调用。
  7.  
  8. 使用示例:
  9.   proc = Win32API.new('color.dll', 'bitmapDrawScanH', 'LLL', 'L')
  10.   src_bitmap = Bitmap.new(180, 1)
  11.   color0 = Color.new(255, 0, 0, 128)
  12.   color1 = Color.new(0, 255, 0, 255)
  13.   proc.call(src_bitmap.object_id, color0.object_id, color1.object_id)
  14.   #src_bitmap.dispose
  15.  
  16. 应用示例:见Bitmap#fill_ellipse3
  17.  
  18.  
  19. 函数原型:
  20.   int bitmapFillTextH(int bitmap_obj_id, int color0_obj_id, int color1_obj_id)
  21. 函数作用:
  22.   初始化的bitmap,绘制文字后,
  23.   以color0,color1的HSL渐变,水平填充至绘制的字体。
  24.  
  25. 使用示例:
  26.   proc = Win32API.new('color.dll', 'bitmapFillTextH', 'LLL', 'L')
  27.   src_bitmap = Bitmap.new(180, 32)
  28.   src_bitmap.draw_text(0, 0, 180, 32, "文字测试")
  29.   color0 = Color.new(255, 0, 0, 128)
  30.   color1 = Color.new(0, 255, 0, 255)
  31.   proc.call(src_bitmap.object_id, color0.object_id, color1.object_id)
  32.   #src_bitmap.dispose
  33.  
  34. 应用示例:见Bitmap#draw_text_ex
  35.  
  36.  
  37.  
  38. 示意图:
  39.   bitmap = Bitmap.new(640, 480)
  40.   color0 = Color.new(255, 0, 0, 128)
  41.   color1 = Color.new(0, 0, 255)
  42.   bitmap.fill_ellipse3(320, 240, 300, 200, 0, Color.new(0,0,0), color0, color1)
  43.   bitmap.draw_text_ex(200, 200, "文字测试", color0, color1)
  44.  
  45. DOC
  46.  
  47. class Bitmap
  48.   DrawScanH = Win32API.new('color.dll', 'bitmapDrawScanH', 'LLL', 'L')
  49.   FillTextH = Win32API.new('color.dll', 'bitmapFillTextH', 'LLL', 'L')
  50.  
  51.   #--------------------------------------------------------------------
  52.   # cx    椭圆中心点X           基本整型
  53.   # cy    椭圆中心点Y           基本整型
  54.   # ax    椭圆X半轴长度         无符号整型
  55.   # by    椭圆Y半轴长度         无符号整型
  56.   # mode  椭圆颜色填充方向(0:左->右;1:上->下)   无符号整型
  57.   # color 椭圆边框颜色          RMXP的Color实例对象
  58.   # fillB 椭圆填充的起始颜色    RMXP的Color实例对象
  59.   # fillE 椭圆填充的终止颜色    RMXP的Color实例对象 或 nil(单色填充)
  60.   #--------------------------------------------------------------------
  61.   def fill_ellipse3(cx, cy, ax, by, mode, color, fillB, fillE=nil)
  62.  
  63.     if fillE
  64.       if mode == 0
  65.         step = ax + ax + 1
  66.         src_rect = Rect.new(0, 0, 0, 0)
  67.       else
  68.         step = by + by + 1
  69.       end
  70.       src = Bitmap.new(step, 1)
  71.       DrawScanH.call(src.object_id, fillB.object_id, fillE.object_id)
  72.     else
  73.       mode = 1 if mode = 0
  74.     end
  75.  
  76.     ratio, w2 = ax.to_f / by,  0
  77.     (by).downto(1) do |y|
  78.       w = (Math.sqrt((by + y) * (by - y)) * ratio).round
  79.  
  80.       if fillE
  81.         if mode == 1
  82.           self.fill_rect(cx - w, cy - y, w + w, 1, src.get_pixel(by - y, 0))
  83.           self.fill_rect(cx - w, cy + y, w + w, 1, src.get_pixel(by + y, 0))
  84.         else
  85.           src_rect.set(ax - w, 0, w + w, 1)
  86.           self.blt(cx - w, cy - y, src, src_rect)
  87.           self.blt(cx - w, cy + y, src, src_rect)
  88.         end
  89.       else
  90.         self.fill_rect(cx - w, cy - y, w + w, 1, fillB)
  91.         self.fill_rect(cx - w, cy + y, w + w, 1, fillB)
  92.       end
  93.  
  94.       self.set_pixel(cx - w, cy - y, color)
  95.       self.set_pixel(cx + w, cy - y, color)
  96.       self.set_pixel(cx - w, cy + y, color)
  97.       self.set_pixel(cx + w, cy + y, color)
  98.  
  99.       while w2 < w
  100.         self.set_pixel(cx - w2, cy - y - 1, color)
  101.         self.set_pixel(cx + w2, cy - y - 1, color)
  102.         self.set_pixel(cx - w2, cy + y + 1, color)
  103.         self.set_pixel(cx + w2, cy + y + 1, color)
  104.         w2 += 1
  105.       end
  106.     end
  107.  
  108.     if fillE
  109.       if mode == 1
  110.         self.fill_rect(cx - ax, cy, ax + ax + 1, 1, src.get_pixel(by, 0))
  111.       else
  112.         self.blt(cx - ax, cy, src, src.rect)
  113.       end
  114.     else
  115.       self.fill_rect(cx - ax, cy, ax + ax + 1, 1, fillB)
  116.     end
  117.     self.set_pixel(cx - ax, cy, color)
  118.     self.set_pixel(cx + ax, cy, color)
  119.  
  120.     src.dispose if src
  121.   end
  122.  
  123.   def draw_text_ex(x, y, text, color0, color1)
  124.     rect = self.text_size(text)
  125.     temp = Bitmap.new(rect.width, rect.height)
  126.     temp.draw_text(rect, text)
  127.     FillTextH.call(temp.object_id, color0.object_id, color1.object_id)
  128.     self.blt(x, y, temp, rect)
  129.     temp.dispose
  130.   end
  131. end


示意图.png (13.24 KB, 下载次数: 19)

示意图

示意图

color.zip

7.43 KB, 下载次数: 10

color.dll

评分

参与人数 1+1 收起 理由
契约师Vi + 1 不太会用Dll 要有工程实例就好了.

查看全部评分

Lv5.捕梦者 (版主)

梦石
1
星屑
23994
在线时间
3339 小时
注册时间
2011-7-8
帖子
3926

开拓者

2
发表于 2022-3-16 15:56:36 | 只看该作者
所以RMXP的stretch_blt(dest_rect, src_bitmap, src_rect[, opacity]) 是临近插值,要是有过渡,把两个像素点的bitmap一拉伸就行了……

点评

???  发表于 2022-3-17 15:24
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1561
在线时间
195 小时
注册时间
2019-10-4
帖子
286
3
发表于 2022-3-16 20:12:46 | 只看该作者
刚想用 比如说怎么填充到文字进行渐变 比如说把主角名字进行渐变填充

点评

已更新  发表于 2022-3-17 15:27
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-25 12:10

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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