貌似很多人看不懂……所以就做个了简单的范例,需要的请查看附件
话说不做不知道,做了个范例才发现我这脚本bug一堆……当时考虑的太不周全了……:L
顺便说下功能
这个是自己很早以前写的精灵做的按键,就是用那个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 endend#==============================================================================# ■ 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)) endend # class end复制代码
复制代码 本帖来自P1论坛作者darkscout3000,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:
https://rpg.blue/forum.php?mod=viewthread&tid=160808 若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。