查看: 2846|回复: 4

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

[复制链接]
梦石
0
星屑
6483
在线时间
119 小时
注册时间
2020-1-8
回帖
205
发表于 2022-3-16 14:55:04 | 显示全部楼层 |阅读模式

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

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

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

边学边练

[pre lang="ruby"]<<-DOC
函数原型:
  int bitmapDrawScanH(int bitmap_obj_id, int color0_obj_id, int color1_obj_id)
函数作用:
  以color0,color1进行HSL渐变,水平填充至bitmap的最后一行,
  作为颜色源数据给相关需求调用。

使用示例:
  proc = Win32API.new('color.dll', 'bitmapDrawScanH', 'LLL', 'L')
  src_bitmap = Bitmap.new(180, 1)
  color0 = Color.new(255, 0, 0, 128)
  color1 = Color.new(0, 255, 0, 255)
  proc.call(src_bitmap.object_id, color0.object_id, color1.object_id)
  #src_bitmap.dispose
  
应用示例:见Bitmap#fill_ellipse3


函数原型:
  int bitmapFillTextH(int bitmap_obj_id, int color0_obj_id, int color1_obj_id)
函数作用:
  初始化的bitmap,绘制文字后,
  以color0,color1的HSL渐变,水平填充至绘制的字体。

使用示例:
  proc = Win32API.new('color.dll', 'bitmapFillTextH', 'LLL', 'L')
  src_bitmap = Bitmap.new(180, 32)
  src_bitmap.draw_text(0, 0, 180, 32, "文字测试")
  color0 = Color.new(255, 0, 0, 128)
  color1 = Color.new(0, 255, 0, 255)
  proc.call(src_bitmap.object_id, color0.object_id, color1.object_id)
  #src_bitmap.dispose
  
应用示例:见Bitmap#draw_text_ex



示意图:
  bitmap = Bitmap.new(640, 480)
  color0 = Color.new(255, 0, 0, 128)
  color1 = Color.new(0, 0, 255)
  bitmap.fill_ellipse3(320, 240, 300, 200, 0, Color.new(0,0,0), color0, color1)
  bitmap.draw_text_ex(200, 200, "文字测试", color0, color1)
   
DOC

class Bitmap
  DrawScanH = Win32API.new('color.dll', 'bitmapDrawScanH', 'LLL', 'L')
  FillTextH = Win32API.new('color.dll', 'bitmapFillTextH', 'LLL', 'L')
  
  #--------------------------------------------------------------------
  # cx    椭圆中心点X           基本整型
  # cy    椭圆中心点Y           基本整型
  # ax    椭圆X半轴长度         无符号整型
  # by    椭圆Y半轴长度         无符号整型
  # mode  椭圆颜色填充方向(0:左->右;1:上->下)   无符号整型
  # color 椭圆边框颜色          RMXP的Color实例对象
  # fillB 椭圆填充的起始颜色    RMXP的Color实例对象
  # fillE 椭圆填充的终止颜色    RMXP的Color实例对象 或 nil(单色填充)
  #--------------------------------------------------------------------
  def fill_ellipse3(cx, cy, ax, by, mode, color, fillB, fillE=nil)
   
    if fillE
      if mode == 0
        step = ax + ax + 1
        src_rect = Rect.new(0, 0, 0, 0)
      else
        step = by + by + 1
      end
      src = Bitmap.new(step, 1)
      DrawScanH.call(src.object_id, fillB.object_id, fillE.object_id)
    else
      mode = 1 if mode = 0
    end
   
    ratio, w2 = ax.to_f / by,  0
    (by).downto(1) do |y|
      w = (Math.sqrt((by + y) * (by - y)) * ratio).round
      
      if fillE
        if mode == 1
          self.fill_rect(cx - w, cy - y, w + w, 1, src.get_pixel(by - y, 0))
          self.fill_rect(cx - w, cy + y, w + w, 1, src.get_pixel(by + y, 0))
        else
          src_rect.set(ax - w, 0, w + w, 1)
          self.blt(cx - w, cy - y, src, src_rect)
          self.blt(cx - w, cy + y, src, src_rect)
        end
      else
        self.fill_rect(cx - w, cy - y, w + w, 1, fillB)
        self.fill_rect(cx - w, cy + y, w + w, 1, fillB)
      end
      
      self.set_pixel(cx - w, cy - y, color)
      self.set_pixel(cx + w, cy - y, color)
      self.set_pixel(cx - w, cy + y, color)
      self.set_pixel(cx + w, cy + y, color)
      
      while w2 < w
        self.set_pixel(cx - w2, cy - y - 1, color)
        self.set_pixel(cx + w2, cy - y - 1, color)
        self.set_pixel(cx - w2, cy + y + 1, color)
        self.set_pixel(cx + w2, cy + y + 1, color)
        w2 += 1
      end
    end
   
    if fillE
      if mode == 1
        self.fill_rect(cx - ax, cy, ax + ax + 1, 1, src.get_pixel(by, 0))
      else
        self.blt(cx - ax, cy, src, src.rect)
      end
    else
      self.fill_rect(cx - ax, cy, ax + ax + 1, 1, fillB)
    end
    self.set_pixel(cx - ax, cy, color)
    self.set_pixel(cx + ax, cy, color)
   
    src.dispose if src
  end
  
  def draw_text_ex(x, y, text, color0, color1)
    rect = self.text_size(text)
    temp = Bitmap.new(rect.width, rect.height)
    temp.draw_text(rect, text)
    FillTextH.call(temp.object_id, color0.object_id, color1.object_id)
    self.blt(x, y, temp, rect)
    temp.dispose
  end
end
      [/pre]

示意图

示意图

color.zip

7.43 KB, 下载次数: 10

color.dll

评分

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

查看全部评分

梦石
1
星屑
24088
在线时间
3339 小时
注册时间
2011-7-8
回帖
3862

开拓者

发表于 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 网络脚本 *
回复

使用道具 举报

梦石
0
星屑
1442
在线时间
171 小时
注册时间
2019-10-4
回帖
162
发表于 2022-3-16 20:12:46 | 显示全部楼层
刚想用 比如说怎么填充到文字进行渐变 比如说把主角名字进行渐变填充

点评

已更新  发表于 2022-3-17 15:27
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部