Project1

标题: 添加slider控件的rm窗体 [打印本页]

作者: 沉影不器    时间: 2008-4-19 17:59
提示: 作者被禁止或删除 内容自动屏蔽
作者: 越前リョーマ    时间: 2008-4-19 18:44
可以拿来当血条。
作者: 火鸡三毛老大    时间: 2008-4-19 18:56
以下引用越前リョーマ于2008-4-19 10:44:30的发言:

可以拿来当血条。

对.......
我的战斗系统的赵云的血条有冲突.....
作者: 越前リョーマ    时间: 2008-4-19 20:17
但是就一条可能不够。
作者: 雪流星    时间: 2008-4-19 20:45
本来想写一个的,被LZ抢先了

发个范例吧,不然有些人不会调用吧?
作者: 沉影    时间: 2008-4-20 05:50
提示: 作者被禁止或删除 内容自动屏蔽
作者: 雪流星    时间: 2008-4-20 12:46
提两个建议
把slider的窗口直接设为
XY座标(0,0)宽高(544,416)透明度0  
在initialize里面取得参数直接并调用setup
还有Window_Slider直接命名为Slider

这样生成slider时只要一句
@slider = Slider.new(各项参数)

再来就是可以在多加两个颜色的参数
这样就可以一个style多个用处了

这是我改过的,LZ看看吧
  1. #==============================================================================
  2. # 添加slider控件的rm窗体 by 沉影不器
  3. #------------------------------------------------------------------------------
  4. # 功能描述:   ① 一个可使用类似C++的slider控件的窗体
  5. #             ② 通过slider控件的value输出与指定变量绑定
  6. #             ③ 方便脚本用户自定义样式,可在[● 样式1]之后随意添加新样式
  7. #
  8. # 输入与输出: ① 允许自定义的项目包括:
  9. #                 名称、坐标、宽高、数据最大值、每次改变量、
  10. #                 初始化时显示的值(value)、样式
  11. #             ② 控件输出包括:
  12. #                 数据最大值、每次改变量、当前变量值(value)
  13. #------------------------------------------------------------------------------
  14. class Slider < Window_Base
  15.   #--------------------------------------------------------------------------
  16.   # ● 定义实例变量
  17.   #--------------------------------------------------------------------------
  18.   attr_reader   :name                     # 名称
  19.   attr_reader   :max                      # 最大值
  20.   attr_reader   :change                   # 改变量
  21.   attr_reader   :value                    # 当前值
  22.   
  23.   def initialize(name, x, y, w, h = 10, max = 100, change = 1, value = 0, style = 0)
  24.     super(0, 0, 544, 416)
  25.     self.opacity = 0
  26.     setup(name, x, y, w, h, max, change, value, style)
  27.   end
  28.   
  29.   #--------------------------------------------------------------------------
  30.   # ● 设置 保存参数
  31.   #     name   : 名称
  32.   #     x      : X 坐标
  33.   #     y      : Y 坐标
  34.   #     w      : 宽
  35.   #     h      : 高
  36.   #     max    : 最大值
  37.   #     change : 改变量
  38.   #     value  : 当前值
  39.   #     style  : 样式
  40.   #--------------------------------------------------------------------------
  41.   def setup(name, x, y, w, h, max, change, value, style)
  42.     @name   = name
  43.     @x      = x
  44.     @y      = y
  45.     @w      = w
  46.     @h      = h
  47.     @max    = max
  48.     @value  = value
  49.     @style  = style
  50.     @change = change > 0 ? change : 1
  51.     @color1 = Color.new(255, 255, 255, 255)
  52.     @color2 = Color.new(64, 128, 64, 255)
  53.     draw_slider(value)
  54.   end
  55.   #--------------------------------------------------------------------------
  56.   # ● 描绘 slider
  57.   #     value  : 当前值
  58.   #--------------------------------------------------------------------------
  59.   def draw_slider(value)
  60.     case @style
  61.     when 0
  62.       style_0(value)
  63.     when 1
  64.       style_1(value)
  65.     end
  66.   end
  67.   #--------------------------------------------------------------------------
  68.   # ● slider颜色
  69.   #     color  : 颜色
  70.   #--------------------------------------------------------------------------
  71.   def color1=(color)
  72.     @color1 =  color
  73.     draw_slider(@value)
  74.   end
  75.   def color2=(color)
  76.     @color2 = color
  77.     draw_slider(@value)
  78.   end  
  79.   #--------------------------------------------------------------------------
  80.   # ● 样式0
  81.   #     value  : 当前值
  82.   #--------------------------------------------------------------------------
  83.   def style_0(value)
  84.     slide_x = (@w - @h/2) * value / @max
  85.     # 清理
  86.     self.contents.clear
  87.     # 描绘名称
  88.     self.contents.draw_text(@x, @y, @w, 24, @name)
  89.     # 描绘当前值
  90.     self.contents.draw_text(@x+@w-64, @y, 64, 24, value.to_s, 2)
  91.     # 填充
  92.     self.contents.fill_rect(@x, @y+23+@h/2, @w, 2, @color1)
  93.     self.contents.fill_rect(@x+slide_x, @y+24, @h/2, @h, @color2)
  94.   end
  95.   #--------------------------------------------------------------------------
  96.   # ● 样式1
  97.   #     value  : 当前值
  98.   #--------------------------------------------------------------------------
  99.   def style_1(value)
  100.     width   = @w * value / @max
  101.     # 清理
  102.     self.contents.clear
  103.     # 描绘名称
  104.     self.contents.draw_text(@x, @y, @w, 24, @name)
  105.     # 描绘当前值
  106.     self.contents.draw_text(@x+@w-64, @y, 64, 24, value.to_s, 2)
  107.     # 填充
  108.     self.contents.fill_rect(@x-1, @y+23, @w+2, @h+2, @color1)
  109.     self.contents.fill_rect(@x, @y+24, width, @h, @color2)
  110.   end
  111.   #--------------------------------------------------------------------------
  112.   # ● 更改当前值
  113.   #     value  : 当前值
  114.   #--------------------------------------------------------------------------
  115.   def value=(value)
  116.     @value = value
  117.     draw_slider(value)
  118.   end
  119.   #--------------------------------------------------------------------------
  120.   # ● 输入刷新
  121.   #--------------------------------------------------------------------------
  122.   def update
  123.     if Input.repeat?(Input::RIGHT)
  124.       if @value < @max - @change
  125.         @value += @change
  126.       else
  127.         @value = @max
  128.       end
  129.       draw_slider(@value)
  130.     end
  131.     if Input.repeat?(Input::LEFT)
  132.       if @value > @change
  133.         @value -= @change
  134.       else
  135.         @value = 0
  136.       end
  137.       draw_slider(@value)
  138.     end
  139.   end
  140. end
复制代码


作者: 雪流星    时间: 2008-4-20 16:35
以下引用鸿剑于2008-4-20 8:10:48的发言:
雪流星你用的是標楷體??


你又不是不知道我的是繁体机子
当然用标楷体

作者: 沉影不器    时间: 2008-4-20 19:37
提示: 作者被禁止或删除 内容自动屏蔽
作者: 雪流星    时间: 2008-4-22 15:54
又改了一下,改成横竖皆可,
再加上刻度
效果图:


作者: 沉影不器    时间: 2008-4-22 20:37
提示: 作者被禁止或删除 内容自动屏蔽
作者: 雪流星    时间: 2008-4-22 21:05
我是比较喜欢Window类的
原因是像text_color这些方法不用重写,可以直接调用{/cy}
话说Sprite比较不耗内存吧
作者: 沉影不器    时间: 2008-4-23 03:52
提示: 作者被禁止或删除 内容自动屏蔽
作者: 雪流星    时间: 2008-4-23 08:49
sprite 的slider已经写好了
比想像中的还简单{/dy}
沉影不器允许的话我就贴出来
作者: 沉影不器    时间: 2008-4-24 22:28
提示: 作者被禁止或删除 内容自动屏蔽
作者: 雪流星    时间: 2008-4-25 03:43
  1. class Slider_Base < Sprite_Base
  2.   #--------------------------------------------------------------------------
  3.   # ● 定义实例变量
  4.   #--------------------------------------------------------------------------
  5.   attr_reader   :name                     # 名称
  6.   attr_reader   :max                      # 最大值
  7.   attr_reader   :change                   # 改变量
  8.   attr_reader   :value                    # 当前值
  9.   attr_accessor :vertical                    # 当前值
  10.   attr_reader   :contents
  11.   WLH = 24
  12.   def initialize(name, x, y, w, h = 10, max = 100, change = 1, value = 0, style = 0)
  13.     viewport = Viewport.new(0, 0, 544, 416)
  14.     super(viewport)
  15.     self.bitmap = Bitmap.new(544, 416)
  16.     self.bitmap.font.color = normal_color
  17.     @contents = @bitmap
  18.     setup(name, x, y, w, h, max, change, value, style)
  19.   end
  20.   #--------------------------------------------------------------------------
  21.   # ● 设置 保存参数
  22.   #     name   : 名称
  23.   #     x      : X 坐标
  24.   #     y      : Y 坐标
  25.   #     w      : 宽
  26.   #     h      : 高
  27.   #     max    : 最大值
  28.   #     change : 改变量
  29.   #     value  : 当前值
  30.   #     style  : 样式
  31.   #--------------------------------------------------------------------------
  32.   def setup(name, x, y, w, h, max, change, value, style)
  33.     @name   = name
  34.     @x      = x
  35.     @y      = y
  36.     @w      = w
  37.     @h      = h
  38.     @max    = max
  39.     @value  = value
  40.     @style  = style
  41.     @change = change > 0 ? change : 1
  42.     @scale  = true
  43.     @scale_size = 12
  44.     @color1 = Color.new(255, 255, 255, 255)
  45.     @color2 = Color.new(192, 64, 64, 255)
  46.     @name_color = normal_color
  47.     @value_color = normal_color
  48.     draw_slider(value)
  49.   end
  50.   def update
  51.   end
  52.   #--------------------------------------------------------------------------
  53.   # ● slider颜色
  54.   #     color  : 颜色
  55.   #--------------------------------------------------------------------------
  56.   def color(type, color)
  57.     case type
  58.     when "bar", 1
  59.       @color1 =  color
  60.     when "slide", 2
  61.       @color2 = color
  62.     when "name", 3
  63.       @name_color = color
  64.     when "value", 4
  65.       @value_color = color
  66.     end
  67.     draw_slider(@value)
  68.   end
  69.   def color1=(color)
  70.     @color1 =  color
  71.     draw_slider(@value)
  72.   end
  73.   def color2=(color)
  74.     @color2 = color
  75.     draw_slider(@value)
  76.   end
  77.   def name_color=(color)
  78.     @name_color = color
  79.     draw_slider(@value)
  80.   end
  81.   def value_color=(color)
  82.     @value_color = color
  83.     draw_slider(@value)
  84.   end
  85.   #--------------------------------------------------------------------------
  86.   # ● 更改当前值
  87.   #     value  : 当前值
  88.   #--------------------------------------------------------------------------
  89.   def value=(value)
  90.     @value = value
  91.     draw_slider(value)
  92.   end
  93.   def scale=(yes=true)
  94.     @scale=yes
  95.   end
  96.   def scale?
  97.     return @scale
  98.   end
  99.   def scale_size=(size)
  100.     @scale_size = size
  101.   end
  102.   #--------------------------------------------------------------------------
  103.   # ● 绘制名称和当前值
  104.   #     value  : 当前值
  105.   #--------------------------------------------------------------------------
  106.   def draw_name(x, y)
  107.     # 描绘名称
  108.     self.bitmap.font.color = @name_color
  109.     self.bitmap.draw_text(x, y, @w, 24, @name)
  110.   end
  111.   def draw_value(x, y, value=@value)
  112.     # 描绘当前值
  113.     self.bitmap.font.color = @value_color
  114.     self.bitmap.draw_text(x, y, 64, 24, value.to_s, 2)
  115.   end
  116.   def vertical=(v)
  117.     @vertical = v
  118.   end
  119. end
  120. class Slider_H < Slider_Base
  121.   def initialize(name, x, y, w, h = 10, max = 100, change = 1, value = 0, style = 0)
  122.     super(name, x, y, w, h, max, change, value, style)
  123.     @vertical = false
  124.   end
  125.   #--------------------------------------------------------------------------
  126.   # ● 描绘 slider
  127.   #     value  : 当前值
  128.   #--------------------------------------------------------------------------
  129.   def draw_slider(value)
  130.     case @style
  131.     when 0
  132.       style_0(value)
  133.     when 1
  134.       style_1(value)
  135.     end
  136.     draw_scale(@scale_size) if scale?
  137.   end
  138.   #--------------------------------------------------------------------------
  139.   # ● 样式0
  140.   #     value  : 当前值
  141.   #--------------------------------------------------------------------------
  142.   def style_0(value)
  143.     slide_x = (@w - @h/2) * value / @max
  144.     # 清理
  145.     self.bitmap.clear
  146.     # 绘制名称和当前值
  147.     self.bitmap.font.size = 20
  148.     draw_name(@x, @y)
  149.     draw_value(@x+@w-64, @y, value)
  150.     # 填充
  151.     self.bitmap.fill_rect(@x, @y+23+@h/2, @w, 2, @color1)
  152.     self.bitmap.fill_rect(@x+slide_x, @y+24, @h/2, @h, @color2)
  153.   end
  154.   #--------------------------------------------------------------------------
  155.   # ● 样式1
  156.   #     value  : 当前值
  157.   #--------------------------------------------------------------------------
  158.   def style_1(value)
  159.     width   = @w * value / @max
  160.     # 清理
  161.     self.bitmap.clear
  162.     self.bitmap.font.size = 20
  163.     # 绘制名称和当前值
  164.     draw_name(@x, @y)
  165.     draw_value(@x+@w-64, @y, value)
  166.     # 填充
  167.     self.bitmap.fill_rect(@x-1, @y+23, @w+2, @h+2, @color1)
  168.     self.bitmap.fill_rect(@x, @y+24, width, @h, @color2)
  169.   end
  170.   #--------------------------------------------------------------------------
  171.   # ● 绘制刻度
  172.   #     value  : 当前值
  173.   #--------------------------------------------------------------------------
  174.   def draw_scale(size=12)
  175.     self.bitmap.font.color= normal_color
  176.     self.bitmap.font.size = size
  177.    
  178.     s1 = (bitmap.text_size(0).width)/2
  179.     s2 = (bitmap.text_size(@max.to_s).width)/2
  180.    
  181.     self.bitmap.draw_text(@x-s1, @y+@h+32, @w, size, 0)
  182.     self.bitmap.draw_text(@x, @y+@h+32, @w, size, @max/2, 1)
  183.     self.bitmap.draw_text(@x, @y+@h+32, @w+s2, size, @max, 2)
  184.   end
  185.   #--------------------------------------------------------------------------
  186.   # ● 输入刷新
  187.   #--------------------------------------------------------------------------
  188.   def update
  189.     super
  190.     if Input.repeat?(Input::RIGHT)
  191.       if @value < @max - @change
  192.         @value += @change
  193.       else
  194.         @value = @max
  195.       end
  196.       draw_slider(@value)
  197.     end
  198.     if Input.repeat?(Input::LEFT)
  199.       if @value > @change
  200.         @value -= @change
  201.       else
  202.         @value = 0
  203.       end
  204.       draw_slider(@value)
  205.     end
  206.   end
  207. end

  208. class Slider_V < Slider_Base
  209.   def initialize(name, x, y, w, h = 10, max = 100, change = 1, value = 0, style = 1)
  210.     super(name, x, y, w, h, max, change, value, style)
  211.     @vertical = true
  212.   end
  213.   #--------------------------------------------------------------------------
  214.   # ● 描绘 slider
  215.   #     value  : 当前值
  216.   #--------------------------------------------------------------------------
  217.   def draw_slider(value)
  218.     case @style
  219.     when 0
  220.       style_0(value)
  221.     when 1
  222.       style_1(value)
  223.     end
  224.     draw_scale(@scale_size) if scale?
  225.   end
  226.   #--------------------------------------------------------------------------
  227.   # ● 样式0
  228.   #     value  : 当前值
  229.   #--------------------------------------------------------------------------
  230.   def style_0(value)
  231.     slide_y = (@w - @h/2) * value / @max
  232.     # 清理
  233.     self.bitmap.clear
  234.     # 绘制名称和当前值
  235.     draw_name_v(@x+24, @y, @vertical)
  236.     draw_value(@x-24, @y+@w-WLH, value)    # 填充
  237.     # 填充
  238.     self.bitmap.fill_rect(@x+47+@h/2, @y, 2, @w, @color1)
  239.     self.bitmap.fill_rect(@x+49, @y+slide_y, @h, @h/2, @color2)
  240.   end
  241.   #--------------------------------------------------------------------------
  242.   # ● 样式1
  243.   #     value  : 当前值
  244.   #--------------------------------------------------------------------------
  245.   def style_1(value)
  246.     width   = @w * (@max-value) / @max
  247.     # 清理
  248.     self.bitmap.clear
  249.     # 绘制名称和当前值
  250.     draw_name(@x+24, @y, @vertical)
  251.     draw_value(@x-24, @y+@w-WLH, value)#(@x+@w-64, @y, value)    # 填充
  252.     self.bitmap.fill_rect(@x+47, @y-1, @h+2, @w+2, @color2)
  253.     self.bitmap.fill_rect(@x+48, @y, @h, width, @color1)
  254.   end
  255.   def draw_name(x, y, v=true)
  256.     v ? draw_name_v(x, y) : super(x, y)
  257.   end
  258.   def draw_name_v(x, y)
  259.     # 描绘名称
  260.     self.bitmap.font.color = @name_color
  261.     self.bitmap.font.size = 20
  262.     t = @name.clone
  263.     cy = y - WLH
  264.     while ((c = t.slice!(/./m)) != nil)
  265.       cy += 3 + WLH - WLH/3
  266.       self.bitmap.draw_text(x, cy, @w, 24, c)
  267.     end
  268.   end
  269.   def draw_scale(size=12)
  270.     self.bitmap.font.color= normal_color
  271.     self.bitmap.font.size = size
  272.    
  273.     s1 = (bitmap.text_size(0).width)/2
  274.     s2 = (bitmap.text_size(@max.to_s).width)/2
  275.    
  276.     self.bitmap.draw_text(@x+50+@h, @y+@w-size/2, @w, size, 0)
  277.     self.bitmap.draw_text(@x+50+@h, @y+(@w-size)/2, @w, size, @max/2)
  278.     self.bitmap.draw_text(@x+50+@h, @y-size/2, @w+s2, size, @max)
  279.   end
  280.   #--------------------------------------------------------------------------
  281.   # ● 输入刷新
  282.   #--------------------------------------------------------------------------
  283.   def update
  284.     super
  285.     if Input.repeat?(Input::UP)
  286.       if @value < @max - @change
  287.         @value += @change
  288.       else
  289.         @value = @max
  290.       end
  291.       draw_slider(@value)
  292.     end
  293.     if Input.repeat?(Input::DOWN)
  294.       if @value > @change
  295.         @value -= @change
  296.       else
  297.         @value = 0
  298.       end
  299.       draw_slider(@value)
  300.     end
  301.   end
  302. end
  303. class Sprite_Base < Sprite
  304.   #--------------------------------------------------------------------------
  305.   # ● 獲取文字顏色
  306.   #     n : 文字顏色色號(0-31)
  307.   #--------------------------------------------------------------------------
  308.   def text_color(n)
  309.     windowskin = Cache.system("Window")
  310.     x = 64 + (n % 8) * 8
  311.     y = 96 + (n / 8) * 8
  312.     return windowskin.get_pixel(x, y)
  313.   end
  314.   #--------------------------------------------------------------------------
  315.   # ● 獲取一般文字顏色
  316.   #--------------------------------------------------------------------------
  317.   def normal_color
  318.     return text_color(0)
  319.   end
  320.   #--------------------------------------------------------------------------
  321.   # ● 獲取系統文字顏色
  322.   #--------------------------------------------------------------------------
  323.   def system_color
  324.     return text_color(16)
  325.   end
  326.   #--------------------------------------------------------------------------
  327.   # ● 獲取危機文字顏色
  328.   #--------------------------------------------------------------------------
  329.   def crisis_color
  330.     return text_color(17)
  331.   end
  332.   #--------------------------------------------------------------------------
  333.   # ● 獲取戰鬥不能文字顏色
  334.   #--------------------------------------------------------------------------
  335.   def knockout_color
  336.     return text_color(18)
  337.   end
  338.   #--------------------------------------------------------------------------
  339.   # ● 獲取裝備畫面能力值上升顏色
  340.   #--------------------------------------------------------------------------
  341.   def power_up_color
  342.     return text_color(24)
  343.   end
  344.   #--------------------------------------------------------------------------
  345.   # ● 獲取裝備畫面能力值下降顏色
  346.   #--------------------------------------------------------------------------
  347.   def power_down_color
  348.     return text_color(25)
  349.   end
  350. end
复制代码

作者: 沉影不器    时间: 2008-4-26 23:17
提示: 作者被禁止或删除 内容自动屏蔽
作者: 雪流星    时间: 2008-5-17 08:34
发布完毕
http://rpg.blue/web/htm/news1051.htm

VIP+3
作者: 这不是马甲    时间: 2008-8-11 00:02
提示: 作者被禁止或删除 内容自动屏蔽
作者: link006007    时间: 2008-8-18 07:07
呵呵 窗体控件... 谁有兴趣写一套RM的通用基本GUI?




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