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看看吧
#==============================================================================
# 添加slider控件的rm窗体 by 沉影不器
#------------------------------------------------------------------------------
# 功能描述: ① 一个可使用类似C++的slider控件的窗体
# ② 通过slider控件的value输出与指定变量绑定
# ③ 方便脚本用户自定义样式,可在[● 样式1]之后随意添加新样式
#
# 输入与输出: ① 允许自定义的项目包括:
# 名称、坐标、宽高、数据最大值、每次改变量、
# 初始化时显示的值(value)、样式
# ② 控件输出包括:
# 数据最大值、每次改变量、当前变量值(value)
#------------------------------------------------------------------------------
class Slider < Window_Base
#--------------------------------------------------------------------------
# ● 定义实例变量
#--------------------------------------------------------------------------
attr_reader :name # 名称
attr_reader :max # 最大值
attr_reader :change # 改变量
attr_reader :value # 当前值
def initialize(name, x, y, w, h = 10, max = 100, change = 1, value = 0, style = 0)
super(0, 0, 544, 416)
self.opacity = 0
setup(name, x, y, w, h, max, change, value, style)
end
#--------------------------------------------------------------------------
# ● 设置 保存参数
# name : 名称
# x : X 坐标
# y : Y 坐标
# w : 宽
# h : 高
# max : 最大值
# change : 改变量
# value : 当前值
# style : 样式
#--------------------------------------------------------------------------
def setup(name, x, y, w, h, max, change, value, style)
@name = name
@x = x
@y = y
@w = w
@h = h
@max = max
@value = value
@style = style
@change = change > 0 ? change : 1
@color1 = Color.new(255, 255, 255, 255)
@color2 = Color.new(64, 128, 64, 255)
draw_slider(value)
end
#--------------------------------------------------------------------------
# ● 描绘 slider
# value : 当前值
#--------------------------------------------------------------------------
def draw_slider(value)
case @style
when 0
style_0(value)
when 1
style_1(value)
end
end
#--------------------------------------------------------------------------
# ● slider颜色
# color : 颜色
#--------------------------------------------------------------------------
def color1=(color)
@color1 = color
draw_slider(@value)
end
def color2=(color)
@color2 = color
draw_slider(@value)
end
#--------------------------------------------------------------------------
# ● 样式0
# value : 当前值
#--------------------------------------------------------------------------
def style_0(value)
slide_x = (@w - @h/2) * value / @max
# 清理
self.contents.clear
# 描绘名称
self.contents.draw_text(@x, @y, @w, 24, @name)
# 描绘当前值
self.contents.draw_text(@x+@w-64, @y, 64, 24, value.to_s, 2)
# 填充
self.contents.fill_rect(@x, @y+23+@h/2, @w, 2, @color1)
self.contents.fill_rect(@x+slide_x, @y+24, @h/2, @h, @color2)
end
#--------------------------------------------------------------------------
# ● 样式1
# value : 当前值
#--------------------------------------------------------------------------
def style_1(value)
width = @w * value / @max
# 清理
self.contents.clear
# 描绘名称
self.contents.draw_text(@x, @y, @w, 24, @name)
# 描绘当前值
self.contents.draw_text(@x+@w-64, @y, 64, 24, value.to_s, 2)
# 填充
self.contents.fill_rect(@x-1, @y+23, @w+2, @h+2, @color1)
self.contents.fill_rect(@x, @y+24, width, @h, @color2)
end
#--------------------------------------------------------------------------
# ● 更改当前值
# value : 当前值
#--------------------------------------------------------------------------
def value=(value)
@value = value
draw_slider(value)
end
#--------------------------------------------------------------------------
# ● 输入刷新
#--------------------------------------------------------------------------
def update
if Input.repeat?(Input::RIGHT)
if @value < @max - @change
@value += @change
else
@value = @max
end
draw_slider(@value)
end
if Input.repeat?(Input::LEFT)
if @value > @change
@value -= @change
else
@value = 0
end
draw_slider(@value)
end
end
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
class Slider_Base < Sprite_Base
#--------------------------------------------------------------------------
# ● 定义实例变量
#--------------------------------------------------------------------------
attr_reader :name # 名称
attr_reader :max # 最大值
attr_reader :change # 改变量
attr_reader :value # 当前值
attr_accessor :vertical # 当前值
attr_reader :contents
WLH = 24
def initialize(name, x, y, w, h = 10, max = 100, change = 1, value = 0, style = 0)
viewport = Viewport.new(0, 0, 544, 416)
super(viewport)
self.bitmap = Bitmap.new(544, 416)
self.bitmap.font.color = normal_color
@contents = @bitmap
setup(name, x, y, w, h, max, change, value, style)
end
#--------------------------------------------------------------------------
# ● 设置 保存参数
# name : 名称
# x : X 坐标
# y : Y 坐标
# w : 宽
# h : 高
# max : 最大值
# change : 改变量
# value : 当前值
# style : 样式
#--------------------------------------------------------------------------
def setup(name, x, y, w, h, max, change, value, style)
@name = name
@x = x
@y = y
@w = w
@h = h
@max = max
@value = value
@style = style
@change = change > 0 ? change : 1
@scale = true
@scale_size = 12
@color1 = Color.new(255, 255, 255, 255)
@color2 = Color.new(192, 64, 64, 255)
@name_color = normal_color
@value_color = normal_color
draw_slider(value)
end
def update
end
#--------------------------------------------------------------------------
# ● slider颜色
# color : 颜色
#--------------------------------------------------------------------------
def color(type, color)
case type
when "bar", 1
@color1 = color
when "slide", 2
@color2 = color
when "name", 3
@name_color = color
when "value", 4
@value_color = color
end
draw_slider(@value)
end
def color1=(color)
@color1 = color
draw_slider(@value)
end
def color2=(color)
@color2 = color
draw_slider(@value)
end
def name_color=(color)
@name_color = color
draw_slider(@value)
end
def value_color=(color)
@value_color = color
draw_slider(@value)
end
#--------------------------------------------------------------------------
# ● 更改当前值
# value : 当前值
#--------------------------------------------------------------------------
def value=(value)
@value = value
draw_slider(value)
end
def scale=(yes=true)
@scale=yes
end
def scale?
return @scale
end
def scale_size=(size)
@scale_size = size
end
#--------------------------------------------------------------------------
# ● 绘制名称和当前值
# value : 当前值
#--------------------------------------------------------------------------
def draw_name(x, y)
# 描绘名称
self.bitmap.font.color = @name_color
self.bitmap.draw_text(x, y, @w, 24, @name)
end
def draw_value(x, y, value=@value)
# 描绘当前值
self.bitmap.font.color = @value_color
self.bitmap.draw_text(x, y, 64, 24, value.to_s, 2)
end
def vertical=(v)
@vertical = v
end
end
class Slider_H < Slider_Base
def initialize(name, x, y, w, h = 10, max = 100, change = 1, value = 0, style = 0)
super(name, x, y, w, h, max, change, value, style)
@vertical = false
end
#--------------------------------------------------------------------------
# ● 描绘 slider
# value : 当前值
#--------------------------------------------------------------------------
def draw_slider(value)
case @style
when 0
style_0(value)
when 1
style_1(value)
end
draw_scale(@scale_size) if scale?
end
#--------------------------------------------------------------------------
# ● 样式0
# value : 当前值
#--------------------------------------------------------------------------
def style_0(value)
slide_x = (@w - @h/2) * value / @max
# 清理
self.bitmap.clear
# 绘制名称和当前值
self.bitmap.font.size = 20
draw_name(@x, @y)
draw_value(@x+@w-64, @y, value)
# 填充
self.bitmap.fill_rect(@x, @y+23+@h/2, @w, 2, @color1)
self.bitmap.fill_rect(@x+slide_x, @y+24, @h/2, @h, @color2)
end
#--------------------------------------------------------------------------
# ● 样式1
# value : 当前值
#--------------------------------------------------------------------------
def style_1(value)
width = @w * value / @max
# 清理
self.bitmap.clear
self.bitmap.font.size = 20
# 绘制名称和当前值
draw_name(@x, @y)
draw_value(@x+@w-64, @y, value)
# 填充
self.bitmap.fill_rect(@x-1, @y+23, @w+2, @h+2, @color1)
self.bitmap.fill_rect(@x, @y+24, width, @h, @color2)
end
#--------------------------------------------------------------------------
# ● 绘制刻度
# value : 当前值
#--------------------------------------------------------------------------
def draw_scale(size=12)
self.bitmap.font.color= normal_color
self.bitmap.font.size = size
s1 = (bitmap.text_size(0).width)/2
s2 = (bitmap.text_size(@max.to_s).width)/2
self.bitmap.draw_text(@x-s1, @y+@h+32, @w, size, 0)
self.bitmap.draw_text(@x, @y+@h+32, @w, size, @max/2, 1)
self.bitmap.draw_text(@x, @y+@h+32, @w+s2, size, @max, 2)
end
#--------------------------------------------------------------------------
# ● 输入刷新
#--------------------------------------------------------------------------
def update
super
if Input.repeat?(Input::RIGHT)
if @value < @max - @change
@value += @change
else
@value = @max
end
draw_slider(@value)
end
if Input.repeat?(Input::LEFT)
if @value > @change
@value -= @change
else
@value = 0
end
draw_slider(@value)
end
end
end
class Slider_V < Slider_Base
def initialize(name, x, y, w, h = 10, max = 100, change = 1, value = 0, style = 1)
super(name, x, y, w, h, max, change, value, style)
@vertical = true
end
#--------------------------------------------------------------------------
# ● 描绘 slider
# value : 当前值
#--------------------------------------------------------------------------
def draw_slider(value)
case @style
when 0
style_0(value)
when 1
style_1(value)
end
draw_scale(@scale_size) if scale?
end
#--------------------------------------------------------------------------
# ● 样式0
# value : 当前值
#--------------------------------------------------------------------------
def style_0(value)
slide_y = (@w - @h/2) * value / @max
# 清理
self.bitmap.clear
# 绘制名称和当前值
draw_name_v(@x+24, @y, @vertical)
draw_value(@x-24, @y+@w-WLH, value) # 填充
# 填充
self.bitmap.fill_rect(@x+47+@h/2, @y, 2, @w, @color1)
self.bitmap.fill_rect(@x+49, @y+slide_y, @h, @h/2, @color2)
end
#--------------------------------------------------------------------------
# ● 样式1
# value : 当前值
#--------------------------------------------------------------------------
def style_1(value)
width = @w * (@max-value) / @max
# 清理
self.bitmap.clear
# 绘制名称和当前值
draw_name(@x+24, @y, @vertical)
draw_value(@x-24, @y+@w-WLH, value)#(@x+@w-64, @y, value) # 填充
self.bitmap.fill_rect(@x+47, @y-1, @h+2, @w+2, @color2)
self.bitmap.fill_rect(@x+48, @y, @h, width, @color1)
end
def draw_name(x, y, v=true)
v ? draw_name_v(x, y) : super(x, y)
end
def draw_name_v(x, y)
# 描绘名称
self.bitmap.font.color = @name_color
self.bitmap.font.size = 20
t = @name.clone
cy = y - WLH
while ((c = t.slice!(/./m)) != nil)
cy += 3 + WLH - WLH/3
self.bitmap.draw_text(x, cy, @w, 24, c)
end
end
def draw_scale(size=12)
self.bitmap.font.color= normal_color
self.bitmap.font.size = size
s1 = (bitmap.text_size(0).width)/2
s2 = (bitmap.text_size(@max.to_s).width)/2
self.bitmap.draw_text(@x+50+@h, @y+@w-size/2, @w, size, 0)
self.bitmap.draw_text(@x+50+@h, @y+(@w-size)/2, @w, size, @max/2)
self.bitmap.draw_text(@x+50+@h, @y-size/2, @w+s2, size, @max)
end
#--------------------------------------------------------------------------
# ● 输入刷新
#--------------------------------------------------------------------------
def update
super
if Input.repeat?(Input::UP)
if @value < @max - @change
@value += @change
else
@value = @max
end
draw_slider(@value)
end
if Input.repeat?(Input::DOWN)
if @value > @change
@value -= @change
else
@value = 0
end
draw_slider(@value)
end
end
end
class Sprite_Base < Sprite
#--------------------------------------------------------------------------
# ● 獲取文字顏色
# n : 文字顏色色號(0-31)
#--------------------------------------------------------------------------
def text_color(n)
windowskin = Cache.system("Window")
x = 64 + (n % 8) * 8
y = 96 + (n / 8) * 8
return windowskin.get_pixel(x, y)
end
#--------------------------------------------------------------------------
# ● 獲取一般文字顏色
#--------------------------------------------------------------------------
def normal_color
return text_color(0)
end
#--------------------------------------------------------------------------
# ● 獲取系統文字顏色
#--------------------------------------------------------------------------
def system_color
return text_color(16)
end
#--------------------------------------------------------------------------
# ● 獲取危機文字顏色
#--------------------------------------------------------------------------
def crisis_color
return text_color(17)
end
#--------------------------------------------------------------------------
# ● 獲取戰鬥不能文字顏色
#--------------------------------------------------------------------------
def knockout_color
return text_color(18)
end
#--------------------------------------------------------------------------
# ● 獲取裝備畫面能力值上升顏色
#--------------------------------------------------------------------------
def power_up_color
return text_color(24)
end
#--------------------------------------------------------------------------
# ● 獲取裝備畫面能力值下降顏色
#--------------------------------------------------------------------------
def power_down_color
return text_color(25)
end
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