Project1
标题:
不知道有没有人做过,用精灵做的按键
[打印本页]
作者:
darkscout3000
时间:
2010-11-13 06:06
标题:
不知道有没有人做过,用精灵做的按键
本帖最后由 darkscout3000 于 2010-11-14 02:10 编辑
貌似很多人看不懂……所以就做个了简单的范例,需要的请查看附件
话说不做不知道,做了个范例才发现我这脚本bug一堆……当时考虑的太不周全了……:L
精灵按键.rar
(236.19 KB, 下载次数: 485)
2010-11-14 01:48 上传
点击文件名下载附件
顺便说下功能
这个是自己很早以前写的精灵做的按键,就是用那个sprite加位图显示一个按键……
当时的想法是可以让有美工底子的人可以做华丽的菜单,毕竟XP自带的按键太(淳朴?)了……
其实最纠结的是,XP自带的窗口每个都有边界限制,因为貌似无论怎么修改脚本,只要用到了Window,那么窗口周围必然有一圈空白。所以才决定换个思路,用精灵写个按键,这样不仅可以使用任何华丽的按键,还可以随便放在屏幕的任何位置。
废话不多说了,有兴趣的拿去吧……
#==============================================================================
# ■ Font
#------------------------------------------------------------------------------
=begin
字体类补充
为字体类增加了自制的字体设置方法
自制字体格式
Font = { "name" => name,
"size" => size,
"color" => color,
"bold" => true/false,
"italic" => true/false }
=end
#==============================================================================
class Font
#--------------------------------------------------------------------------
# ● 自制字体设置
# custom_font : 自制的字体设置格式
# 每个custom_font都是Hash Table,Entry有以下可能
# name - 字体名字,为字体名字array,e.g. ["黑体"]
# bold - 粗体, true : false
# italic - 斜体,true : false
#--------------------------------------------------------------------------
def set_font(custom_font)
if custom_font != nil #如果有设置自制字体
if custom_font["color"].is_a? Color # != nil
self.color = custom_font["color"]
end
if custom_font["name"] != nil
self.name=custom_font["name"]
end
if custom_font["bold"] != nil
self.bold=custom_font["bold"]
end
if custom_font["italic"] != nil
self.italic=custom_font["italic"]
end
if custom_font["size"] != nil
self.size=custom_font["size"]
end
end
end
end
#==============================================================================
# ■ Sprite_Button
#------------------------------------------------------------------------------
=begin
精灵按键
注:
因为是精灵,尽量少调用各绘图用的draw方法
不是必要的情况不要用refresh,就用update就好了
主要的类变量:
enabled 该按键是否可以点击,true或false
text 显示的文字,string
hightlight 这个是按键选中表示,true或false
visible 按键是不是看得见,true或false
x, y, z 这个就是x,y坐标和z高度
width,height 长宽的记录
主要的类方法:(详细的请看代码吧……)
intialize 初始化
dispose 精灵都要有的……
size 设置按键的大小用
refresh 重新绘制按键,很慢……非必要不要使用……
update 刷新按键……不解释……
mouseover 求鼠标是否在此按键之上,返回true如果是
=end
#==============================================================================
class Sprite_Button < Sprite
attr_accessor :enabled #该按钮是否可以点击
attr_accessor :highlight #该按钮被选中
attr_accessor :custom_font #写按钮字体,格式请参考说明
attr_reader :width #按键的宽
attr_reader :height #按键的高
#attr_reader :skin_enabled #该按钮可点击时的skin
#attr_reader :skin_disabled #该按钮不可点击时的skin
#attr_reader :sprite_select #按钮选中时的sprite
#--------------------------------------------------------------------------
# ● 初始化对象
# text : 按钮的文字
# skin_enabled : 可选时skin的bitmap object
# skin_disabled : 不可选时skin的bitmap object
# skin_highlight: highlights时的skin
# width : 想要的宽
# height : 想要的高
#--------------------------------------------------------------------------
def initialize(text, skin_enabled, skin_disabled = nil, skin_highlight = nil,
width = nil, height = nil)
super()
@enabled = false
@highlight = false
@text = text
@skin_enabled = skin_enabled
@skin_disabled = skin_disabled
@skin_highlight = skin_highlight
@sprite_select = Sprite.new() #选择框精灵
@select_box_size = 2 #选择框的宽度
@select_box_border = -2 #选择框边界的宽度
@sprite_text = Sprite.new() #文字精灵
self.z = 200
self.bitmap = (@skin_disabled != nil)? @skin_disabled : @skin_enabled
@width = (width != nil)? width : self.bitmap.width
@height = (height != nil)? height : self.bitmap.height
size(@width, @height)
end
#--------------------------------------------------------------------------
# ● 释放
#--------------------------------------------------------------------------
def dispose
@sprite_text.dispose if @sprite_text != nil
@sprite_select.dispose if @sprite_select != nil
@skin_enabled.dispose if @skin_enabled != nil
@skin_disabled.dispose if @skin_disabled !=nil
super
end
#--------------------------------------------------------------------------
# ● 获取按钮开关
#--------------------------------------------------------------------------
def enabled
return @enabled
end
#--------------------------------------------------------------------------
# ● 设置按钮开关
#--------------------------------------------------------------------------
def enabled=(n)
if @enabled != n
@enabled = n
update
end
end
#--------------------------------------------------------------------------
# ● 设置按键文字
#--------------------------------------------------------------------------
def text=(n)
@text = n
draw_button_text
update
end
#--------------------------------------------------------------------------
# ● 设置按键点亮
#--------------------------------------------------------------------------
def highlight=(n)
if @highlight != n
@highlight = n
@sprite_select.visible = @highlight
update
end
end
#--------------------------------------------------------------------------
# ● 设置按键的可视性
#--------------------------------------------------------------------------
def visible=(n)
super
@sprite_select.visible = @highlight if @sprite_select != nil
@sprite_text.visible = n if @sprite_text != nil
end
#--------------------------------------------------------------------------
# ● 设置按键的x值
#--------------------------------------------------------------------------
def x=(n)
super
@sprite_select.x = self.x + @sprite_select_rx if @sprite_select_rx != nil
@sprite_text.x = self.x + @sprite_text_rx if @sprite_text_rx != nil
end
#--------------------------------------------------------------------------
# ● 设置按键的y值
#--------------------------------------------------------------------------
def y=(n)
super
@sprite_select.y = self.y + @sprite_select_ry if @sprite_select_ry != nil
@sprite_text.y = self.y + @sprite_text_ry if @sprite_text_ry != nil
end
#--------------------------------------------------------------------------
# ● 设置按键的z值
#--------------------------------------------------------------------------
def z=(n)
super
@sprite_select.z = self.z + 10
@sprite_text.z = self.z + 5
end
#--------------------------------------------------------------------------
# ● 设置按键大小
# width : 想要的宽
# height : 想要的高
#--------------------------------------------------------------------------
def size(width, height)
# 比较理想的大小和位图大小来拉伸位图
self.zoom_x = width.to_f / self.bitmap.width.to_f
self.zoom_y = height.to_f / self.bitmap.height.to_f
@sprite_select.zoom_x = self.zoom_x
@sprite_select.zoom_y = self.zoom_y
end
#--------------------------------------------------------------------------
# ● 获得按钮按键的位图形式
#--------------------------------------------------------------------------
def bitmap_all
temp_bitmap = Bitmap.new(self.bitmap.width, self.bitmap.height)
temp_bitmap.blt(0,0,self.bitmap,self.bitmap.rect)
if @sprite_text.bitmap != nil
temp_bitmap.blt(@sprite_text_rx,@sprite_text_ry,
@sprite_text.bitmap,@sprite_text.rect)
end
if @sprite_select.bitmap != nil
temp_bitmap.blt(@sprite_select_rx,@sprite_select_ry,
@sprite_select.bitmap,@sprite_select.bitmap.rect)
end
return temp_bitmap
end
#--------------------------------------------------------------------------
# ● 按钮文字
#--------------------------------------------------------------------------
def draw_button_text
if @sprite_text.bitmap != nil
@sprite_text.bitmap.clear
end
#没有就不写文字
return if (@text == nil)
#文字精灵在较前面
@sprite_text.z = self.z + 15
#设置要书写的文字
if @custom_font != nil #需要提前读取字体大小
text_size=(@custom_font["size"]!= nil)? @custom_font["size"] : 12
else
text_size=12
end
#计算文字的长度和宽度
text_width = @text.size / 3 * text_size
text_height = text_size
#打开Bitmap
@sprite_text.bitmap = Bitmap.new(width,height)
#首先设字体
@sprite_text.bitmap.font.size = 12 #默认大小
@sprite_text.bitmap.font.set_font(@custom_font)
#计算文字的位置
@sprite_text_rx = (self.width - text_width)/2
@sprite_text_ry = (self.height - text_height)/2
#画出文字
@sprite_text.bitmap.draw_text(0, 0, text_width, text_height, @text, 1)
end
#--------------------------------------------------------------------------
# ● 按钮选中框颜色
#--------------------------------------------------------------------------
def highlight_color(range)
if range == "outer"
return Color.new(255,255,255,130)
elsif range == "inner"
return Color.new(255,255,255,160)
end
end
#--------------------------------------------------------------------------
# ● 按钮选中框
# 这个东西是如果有highlight的skin就用,不然就画一个
#--------------------------------------------------------------------------
def draw_button_highlight
#如果highlight位图已经绘制过了,清除旧位图
if @sprite_select.bitmap != nil
@sprite_select.bitmap.clear
end
#return if !highlight
@sprite_select.z = self.z + 10
#检查是否可见(如果highlight disabled,此highlight不可见)
@sprite_select.visible = @highlight
#如果有highlight位图,就使用位图
if @skin_highlight != nil
@sprite_select.bitmap = Bitmap.new(self.bitmap.width, self.bitmap.height)
@sprite_select_rx = (self.bitmap.width - @sprite_select.bitmap.width)/2
@sprite_select_ry = (self.bitmap.height - @sprite_select.bitmap.height)/2
@sprite_select.bitmap.blt(@sprite_select_rx,@sprite_select_ry,
@skin_highlight,@sprite_select.bitmap.rect)
@sprite_select_rx = 0
@sprite_select_ry = 0
return
end
#打开Bitmap
@sprite_select.bitmap = Bitmap.new(self.bitmap.width - 2*@select_box_border,
self.bitmap.height - 2*@select_box_border)
#计算方框的位置
@sprite_select_rx = @select_box_border
@sprite_select_ry = @select_box_border
#画出方框
@sprite_select.bitmap.fill_rect(0, 0,
@sprite_select.bitmap.width,
@sprite_select.bitmap.height,
highlight_color("outer"))
@sprite_select.bitmap.fill_rect(1, 1,
@sprite_select.bitmap.width-2,
@sprite_select.bitmap.height-2,
highlight_color("inner"))
@sprite_select.bitmap.fill_rect(@select_box_size, @select_box_size,
@sprite_select.bitmap.width-@select_box_size*2,
@sprite_select.bitmap.height-@select_box_size*2,
Color.new(0,0,0,0))
end
#--------------------------------------------------------------------------
# ● 重新绘制
#--------------------------------------------------------------------------
def refresh
draw_button_text
draw_button_highlight
end
#--------------------------------------------------------------------------
# ● 刷新
#--------------------------------------------------------------------------
def update
super
#enable只是改色调
if @enabled #enabled
self.bitmap = @skin_enabled
self.tone.set(0,0,0,0)
else #disabled
if @skin_disabled != nil #has disabled skin
self.bitmap = @skin_disabled
else #no disabled skin, just grey the enabled version
#self.bitmap = @skin_enabled
self.tone.set(0, 0, 0, 255)
end
end
#色调同步
@sprite_text.tone.set(self.tone.red, self.tone.green,
self.tone.blue, self.tone.gray)
@sprite_select.tone.set(self.tone.red, self.tone.green,
self.tone.blue, self.tone.gray)
self.x = x
self.y = y
end
#--------------------------------------------------------------------------
# ● 鼠标应用
# mouse_x : 鼠标的X坐标
# mouse_y : 鼠标的Y坐标
#--------------------------------------------------------------------------
def mouseover(mouse_x = nil, mouse_y = nil)
#没有鼠标应用就不运行
return if !defined? Mouse
#如果没有给予坐标,就读取坐标
if (mouse_x == nil) or (mouse_y == nil)
mouse_x, mouse_y = Mouse.get_mouse_pos
end
#检测鼠标是否在这个按键的区域内
return ((self.x < mouse_x) and
(self.y < mouse_y) and
(self.x + @width > mouse_x) and
(self.y + @height > mouse_y))
end
end # class end
复制代码
作者:
a554187203
时间:
2010-11-13 09:30
怎么使用啊.......纯纯粉粉嫩嫩的小白路过~
作者:
埋風葬月
时间:
2010-11-13 10:03
提示:
作者被禁止或删除 内容自动屏蔽
作者:
黑崎一护
时间:
2010-11-13 16:50
楼主能提供范例么,看不懂。
作者:
q621028
时间:
2010-11-13 18:14
这个软件我苦学了3天,大概只学会了75%,楼主的这些我看不懂。
作者:
enghao_lim
时间:
2010-11-14 01:16
其实丢个范例出来不是很难吧?
如果我还是版主我会直接加了3vip然后发布去了……
这东西可以做出很雷的效果,啊哈哈
作者:
无心孤云
时间:
2010-11-14 01:33
很惭愧的说- -我也看不懂- -求范例求解释求教程- -
作者:
darkscout3000
时间:
2010-11-14 02:02
不好意思,偷了下懒,范例已经上传……顺便修复了些bug……
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1