赞 | 1 |
VIP | 2 |
好人卡 | 18 |
积分 | 3 |
经验 | 7766 |
最后登录 | 2012-5-1 |
在线时间 | 227 小时 |
Lv2.观梦者
- 梦石
- 0
- 星屑
- 260
- 在线时间
- 227 小时
- 注册时间
- 2009-7-26
- 帖子
- 216
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 darkscout3000 于 2010-11-14 02:10 编辑
貌似很多人看不懂……所以就做个了简单的范例,需要的请查看附件
话说不做不知道,做了个范例才发现我这脚本bug一堆……当时考虑的太不周全了……:L
精灵按键.rar
(236.19 KB, 下载次数: 485)
顺便说下功能
这个是自己很早以前写的精灵做的按键,就是用那个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
复制代码 |
评分
-
查看全部评分
|