查看: 2797|回复: 2

[原创发布] 用Bitmap#hue_change 模拟 HSL颜色渐变

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

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

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

×
[pre lang="ruby"]class Color
  def hue
    r, g, b = self.red / 255, self.green / 255, self.blue / 255
   
    max = min = r
    if g > max then max = g else min = g end
    if b > max then max = b elsif b < min then min = b end
   
    return 0 if max == min

    vH = case max
         when r then (g - b) * 60 / (max - min)
         when g then (b - r) * 60 / (max - min) + 120
         when b then (r - g) * 60 / (max - min) + 240
         end
    if vH < 0 then vH += 360 elsif vH > 360 then vH -= 360 end
    vH
  end
end


class Bitmap
  def draw_scan0(colorA, colorB)
    self.set_pixel(0, 0, colorA)
    return if self.width == 1
    self.set_pixel(0, self.width - 1, colorB)  
    return if self.width == 2

    hueA, hueB = colorA.hue, colorB.hue
    deltaHue = (hueB - hueA) / (self.width - 1)
   
    hue, pixel = hueA, Bitmap.new(1, 1)   
   
    1.upto(self.width - 2) do |i|
      pixel.set_pixel(0, 0, colorA)
      pixel.hue_change(hue += deltaHue)
      self.set_pixel(i, 0, pixel.get_pixel(0, 0))
    end
   
    pixel.dispose

  end
end


bitmap = Bitmap.new(640, 1)
red = Color.new(255, 0, 0)
blue = Color.new(0, 0, 255)
count, t = 0, Time.now
loop do
  bitmap.draw_scan0(red, blue)
  break if Time.now - t >= 1.0
  count += 1
end
print "Bitmap#draw_scan0 => #{count}次/秒"

sprite = Sprite.new
sprite.bitmap = bitmap
sprite.y = 240
sprite.zoom_y = 20

loop {Graphics.update}[/pre]
梦石
1
星屑
24088
在线时间
3339 小时
注册时间
2011-7-8
回帖
3862

开拓者

发表于 2022-3-27 14:52:10 | 显示全部楼层
说起来hue有多个公式,rm用的到底是哪一种呢?反正我图简便就用了坐标旋转……

点评

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

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部