设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 3116|回复: 7
打印 上一主题 下一主题

[原创发布] 不知道有没有人做过,用精灵做的按键

[复制链接]

Lv1.梦旅人

梦石
0
星屑
245
在线时间
227 小时
注册时间
2009-7-26
帖子
216
跳转到指定楼层
1
发表于 2010-11-13 06:06:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 darkscout3000 于 2010-11-14 02:10 编辑

貌似很多人看不懂……所以就做个了简单的范例,需要的请查看附件
话说不做不知道,做了个范例才发现我这脚本bug一堆……当时考虑的太不周全了……:L
精灵按键.rar (236.19 KB, 下载次数: 485)

顺便说下功能
这个是自己很早以前写的精灵做的按键,就是用那个sprite加位图显示一个按键……
当时的想法是可以让有美工底子的人可以做华丽的菜单,毕竟XP自带的按键太(淳朴?)了……
其实最纠结的是,XP自带的窗口每个都有边界限制,因为貌似无论怎么修改脚本,只要用到了Window,那么窗口周围必然有一圈空白。所以才决定换个思路,用精灵写个按键,这样不仅可以使用任何华丽的按键,还可以随便放在屏幕的任何位置。

废话不多说了,有兴趣的拿去吧……

  1. #==============================================================================
  2. # ■ Font
  3. #------------------------------------------------------------------------------
  4. =begin
  5.     字体类补充
  6.    
  7.     为字体类增加了自制的字体设置方法
  8.    
  9.     自制字体格式
  10.     Font = { "name"   => name,
  11.              "size"   => size,
  12.              "color"  => color,
  13.              "bold"   => true/false,
  14.              "italic" => true/false }
  15. =end
  16. #==============================================================================

  17. class Font
  18.   #--------------------------------------------------------------------------
  19.   # ● 自制字体设置
  20.   #     custom_font : 自制的字体设置格式
  21.   #                   每个custom_font都是Hash Table,Entry有以下可能
  22.   #                   name   - 字体名字,为字体名字array,e.g. ["黑体"]
  23.   #                   bold   - 粗体, true : false
  24.   #                   italic - 斜体,true : false
  25.   #--------------------------------------------------------------------------
  26.   def set_font(custom_font)
  27.     if custom_font != nil  #如果有设置自制字体
  28.       if custom_font["color"].is_a? Color # != nil
  29.         self.color = custom_font["color"]
  30.       end
  31.       if custom_font["name"] != nil
  32.         self.name=custom_font["name"]
  33.       end
  34.       if custom_font["bold"] != nil
  35.         self.bold=custom_font["bold"]
  36.       end
  37.       if custom_font["italic"] != nil
  38.         self.italic=custom_font["italic"]
  39.       end
  40.       if custom_font["size"] != nil
  41.         self.size=custom_font["size"]
  42.       end
  43.     end
  44.   end
  45. end

  46. #==============================================================================
  47. # ■ Sprite_Button
  48. #------------------------------------------------------------------------------
  49. =begin
  50.    精灵按键

  51.     注:
  52.     因为是精灵,尽量少调用各绘图用的draw方法
  53.     不是必要的情况不要用refresh,就用update就好了
  54.    
  55.    
  56.     主要的类变量:
  57.     enabled       该按键是否可以点击,true或false
  58.     text          显示的文字,string
  59.     hightlight    这个是按键选中表示,true或false
  60.     visible       按键是不是看得见,true或false
  61.     x, y, z       这个就是x,y坐标和z高度
  62.     width,height 长宽的记录
  63.    
  64.     主要的类方法:(详细的请看代码吧……)
  65.     intialize     初始化
  66.     dispose       精灵都要有的……
  67.     size          设置按键的大小用
  68.     refresh       重新绘制按键,很慢……非必要不要使用……
  69.     update        刷新按键……不解释……
  70.     mouseover     求鼠标是否在此按键之上,返回true如果是
  71.    
  72. =end
  73. #==============================================================================

  74. class Sprite_Button < Sprite
  75.   attr_accessor :enabled        #该按钮是否可以点击
  76.   attr_accessor :highlight      #该按钮被选中
  77.   attr_accessor :custom_font    #写按钮字体,格式请参考说明
  78.   attr_reader   :width          #按键的宽
  79.   attr_reader   :height         #按键的高
  80.   #attr_reader   :skin_enabled   #该按钮可点击时的skin
  81.   #attr_reader   :skin_disabled  #该按钮不可点击时的skin
  82.   #attr_reader   :sprite_select  #按钮选中时的sprite
  83.   
  84.   #--------------------------------------------------------------------------
  85.   # ● 初始化对象
  86.   #     text   : 按钮的文字
  87.   #     skin_enabled  : 可选时skin的bitmap object
  88.   #     skin_disabled : 不可选时skin的bitmap object
  89.   #     skin_highlight: highlights时的skin
  90.   #     width   : 想要的宽
  91.   #     height  : 想要的高
  92.   #--------------------------------------------------------------------------
  93.   def initialize(text, skin_enabled, skin_disabled = nil, skin_highlight = nil,
  94.                   width = nil, height = nil)
  95.     super()
  96.     @enabled = false
  97.     @highlight = false
  98.     @text = text
  99.     @skin_enabled  = skin_enabled
  100.     @skin_disabled = skin_disabled
  101.     @skin_highlight = skin_highlight
  102.     @sprite_select = Sprite.new()         #选择框精灵
  103.     @select_box_size = 2                  #选择框的宽度
  104.     @select_box_border = -2               #选择框边界的宽度
  105.     @sprite_text = Sprite.new()           #文字精灵
  106.     self.z = 200
  107.     self.bitmap = (@skin_disabled != nil)? @skin_disabled : @skin_enabled
  108.     @width = (width != nil)? width : self.bitmap.width
  109.     @height = (height != nil)? height : self.bitmap.height
  110.     size(@width, @height)
  111.   end
  112.   #--------------------------------------------------------------------------
  113.   # ● 释放
  114.   #--------------------------------------------------------------------------
  115.   def dispose
  116.     @sprite_text.dispose    if @sprite_text != nil
  117.     @sprite_select.dispose  if @sprite_select != nil
  118.     @skin_enabled.dispose   if @skin_enabled != nil
  119.     @skin_disabled.dispose  if @skin_disabled !=nil
  120.     super
  121.   end
  122.   #--------------------------------------------------------------------------
  123.   # ● 获取按钮开关
  124.   #--------------------------------------------------------------------------
  125.   def enabled
  126.     return @enabled
  127.   end
  128.   #--------------------------------------------------------------------------
  129.   # ● 设置按钮开关
  130.   #--------------------------------------------------------------------------
  131.   def enabled=(n)
  132.     if @enabled != n
  133.       @enabled = n
  134.       update
  135.     end
  136.   end
  137.   #--------------------------------------------------------------------------
  138.   # ● 设置按键文字
  139.   #--------------------------------------------------------------------------
  140.   def text=(n)
  141.     @text = n
  142.     draw_button_text
  143.     update
  144.   end
  145.   #--------------------------------------------------------------------------
  146.   # ● 设置按键点亮
  147.   #--------------------------------------------------------------------------
  148.   def highlight=(n)
  149.     if @highlight != n
  150.       @highlight = n
  151.       @sprite_select.visible = @highlight
  152.       update
  153.     end
  154.   end
  155.   #--------------------------------------------------------------------------
  156.   # ● 设置按键的可视性
  157.   #--------------------------------------------------------------------------
  158.   def visible=(n)
  159.     super
  160.     @sprite_select.visible = @highlight if @sprite_select != nil
  161.     @sprite_text.visible = n if @sprite_text != nil
  162.   end
  163.   #--------------------------------------------------------------------------
  164.   # ● 设置按键的x值
  165.   #--------------------------------------------------------------------------
  166.   def x=(n)
  167.     super
  168.     @sprite_select.x = self.x + @sprite_select_rx if @sprite_select_rx != nil
  169.     @sprite_text.x = self.x + @sprite_text_rx if @sprite_text_rx != nil
  170.   end
  171.   #--------------------------------------------------------------------------
  172.   # ● 设置按键的y值
  173.   #--------------------------------------------------------------------------
  174.   def y=(n)
  175.     super
  176.     @sprite_select.y = self.y + @sprite_select_ry if @sprite_select_ry != nil
  177.     @sprite_text.y = self.y + @sprite_text_ry if @sprite_text_ry != nil
  178.   end
  179.   #--------------------------------------------------------------------------
  180.   # ● 设置按键的z值
  181.   #--------------------------------------------------------------------------
  182.   def z=(n)
  183.     super
  184.     @sprite_select.z = self.z + 10
  185.     @sprite_text.z = self.z + 5
  186.   end
  187.   #--------------------------------------------------------------------------
  188.   # ● 设置按键大小
  189.   #     width   : 想要的宽
  190.   #     height  : 想要的高
  191.   #--------------------------------------------------------------------------
  192.   def size(width, height)
  193.     # 比较理想的大小和位图大小来拉伸位图
  194.     self.zoom_x = width.to_f / self.bitmap.width.to_f
  195.     self.zoom_y = height.to_f / self.bitmap.height.to_f
  196.     @sprite_select.zoom_x = self.zoom_x
  197.     @sprite_select.zoom_y = self.zoom_y
  198.   end
  199.   #--------------------------------------------------------------------------
  200.   # ● 获得按钮按键的位图形式
  201.   #--------------------------------------------------------------------------
  202.   def bitmap_all
  203.     temp_bitmap = Bitmap.new(self.bitmap.width, self.bitmap.height)
  204.     temp_bitmap.blt(0,0,self.bitmap,self.bitmap.rect)
  205.     if @sprite_text.bitmap != nil
  206.       temp_bitmap.blt(@sprite_text_rx,@sprite_text_ry,
  207.           @sprite_text.bitmap,@sprite_text.rect)
  208.     end
  209.     if @sprite_select.bitmap != nil
  210.       temp_bitmap.blt(@sprite_select_rx,@sprite_select_ry,
  211.           @sprite_select.bitmap,@sprite_select.bitmap.rect)
  212.     end
  213.     return temp_bitmap
  214.   end
  215.   #--------------------------------------------------------------------------
  216.   # ● 按钮文字
  217.   #--------------------------------------------------------------------------
  218.   def draw_button_text
  219.     if @sprite_text.bitmap != nil
  220.       @sprite_text.bitmap.clear
  221.     end
  222.     #没有就不写文字
  223.     return if (@text == nil)
  224.     #文字精灵在较前面
  225.     @sprite_text.z = self.z + 15
  226.     #设置要书写的文字
  227.     if @custom_font != nil  #需要提前读取字体大小
  228.       text_size=(@custom_font["size"]!= nil)? @custom_font["size"] : 12
  229.     else
  230.       text_size=12
  231.     end
  232.     #计算文字的长度和宽度
  233.     text_width = @text.size / 3 * text_size
  234.     text_height = text_size
  235.     #打开Bitmap
  236.     @sprite_text.bitmap = Bitmap.new(width,height)
  237.     #首先设字体
  238.     @sprite_text.bitmap.font.size = 12 #默认大小
  239.     @sprite_text.bitmap.font.set_font(@custom_font)
  240.     #计算文字的位置
  241.     @sprite_text_rx = (self.width - text_width)/2
  242.     @sprite_text_ry = (self.height - text_height)/2
  243.     #画出文字
  244.     @sprite_text.bitmap.draw_text(0, 0, text_width, text_height, @text, 1)
  245.   end
  246.   #--------------------------------------------------------------------------
  247.   # ● 按钮选中框颜色
  248.   #--------------------------------------------------------------------------
  249.   def highlight_color(range)
  250.     if range == "outer"
  251.       return Color.new(255,255,255,130)
  252.     elsif range == "inner"
  253.       return Color.new(255,255,255,160)
  254.     end
  255.   end
  256.   #--------------------------------------------------------------------------
  257.   # ● 按钮选中框
  258.   #     这个东西是如果有highlight的skin就用,不然就画一个
  259.   #--------------------------------------------------------------------------
  260.   def draw_button_highlight
  261.     #如果highlight位图已经绘制过了,清除旧位图
  262.     if @sprite_select.bitmap != nil
  263.       @sprite_select.bitmap.clear
  264.     end
  265.     #return if !highlight
  266.     @sprite_select.z = self.z + 10
  267.     #检查是否可见(如果highlight disabled,此highlight不可见)
  268.     @sprite_select.visible = @highlight
  269.     #如果有highlight位图,就使用位图
  270.     if @skin_highlight != nil
  271.       @sprite_select.bitmap = Bitmap.new(self.bitmap.width, self.bitmap.height)
  272.       @sprite_select_rx = (self.bitmap.width - @sprite_select.bitmap.width)/2
  273.       @sprite_select_ry = (self.bitmap.height - @sprite_select.bitmap.height)/2
  274.       @sprite_select.bitmap.blt(@sprite_select_rx,@sprite_select_ry,
  275.         @skin_highlight,@sprite_select.bitmap.rect)
  276.       @sprite_select_rx = 0
  277.       @sprite_select_ry = 0
  278.       return
  279.     end
  280.     #打开Bitmap
  281.     @sprite_select.bitmap = Bitmap.new(self.bitmap.width - 2*@select_box_border,
  282.                               self.bitmap.height - 2*@select_box_border)
  283.     #计算方框的位置
  284.     @sprite_select_rx = @select_box_border
  285.     @sprite_select_ry = @select_box_border
  286.     #画出方框
  287.     @sprite_select.bitmap.fill_rect(0, 0,
  288.         @sprite_select.bitmap.width,
  289.         @sprite_select.bitmap.height,
  290.         highlight_color("outer"))
  291.     @sprite_select.bitmap.fill_rect(1, 1,
  292.         @sprite_select.bitmap.width-2,
  293.         @sprite_select.bitmap.height-2,
  294.         highlight_color("inner"))
  295.     @sprite_select.bitmap.fill_rect(@select_box_size, @select_box_size,
  296.         @sprite_select.bitmap.width-@select_box_size*2,
  297.         @sprite_select.bitmap.height-@select_box_size*2,
  298.         Color.new(0,0,0,0))
  299.   end
  300.   #--------------------------------------------------------------------------
  301.   # ● 重新绘制
  302.   #--------------------------------------------------------------------------
  303.   def refresh
  304.     draw_button_text
  305.     draw_button_highlight
  306.   end
  307.   #--------------------------------------------------------------------------
  308.   # ● 刷新
  309.   #--------------------------------------------------------------------------
  310.   def update
  311.     super
  312.     #enable只是改色调
  313.     if @enabled   #enabled
  314.       self.bitmap = @skin_enabled
  315.       self.tone.set(0,0,0,0)
  316.     else          #disabled
  317.       if @skin_disabled != nil  #has disabled skin
  318.         self.bitmap = @skin_disabled
  319.       else        #no disabled skin, just grey the enabled version
  320.         #self.bitmap = @skin_enabled
  321.         self.tone.set(0, 0, 0, 255)
  322.       end
  323.     end
  324.     #色调同步
  325.     @sprite_text.tone.set(self.tone.red, self.tone.green,
  326.       self.tone.blue, self.tone.gray)
  327.     @sprite_select.tone.set(self.tone.red, self.tone.green,
  328.       self.tone.blue, self.tone.gray)
  329.     self.x = x
  330.     self.y = y
  331.   end
  332.   #--------------------------------------------------------------------------
  333.   # ● 鼠标应用
  334.   #     mouse_x : 鼠标的X坐标
  335.   #     mouse_y : 鼠标的Y坐标
  336.   #--------------------------------------------------------------------------
  337.   def mouseover(mouse_x = nil, mouse_y = nil)
  338.     #没有鼠标应用就不运行
  339.     return if !defined? Mouse
  340.     #如果没有给予坐标,就读取坐标
  341.     if (mouse_x == nil) or (mouse_y == nil)
  342.       mouse_x, mouse_y = Mouse.get_mouse_pos
  343.     end
  344.     #检测鼠标是否在这个按键的区域内
  345.     return ((self.x < mouse_x) and
  346.             (self.y < mouse_y) and
  347.             (self.x + @width > mouse_x) and
  348.             (self.y + @height > mouse_y))
  349.   end
  350. end # class end
复制代码

点评

多谢大大加分  发表于 2010-11-14 02:30
请给新人们提供一个使用方法哦~~  发表于 2010-11-13 08:45
看起来很赞,等测试后加分。  发表于 2010-11-13 08:07

评分

参与人数 1星屑 +600 收起 理由
fux2 + 600 喵喵的太赞了!

查看全部评分

不要吐槽我⋯⋯

Lv1.梦旅人

超级囧神 无尽的灌水

梦石
0
星屑
144
在线时间
784 小时
注册时间
2010-6-27
帖子
2065
2
发表于 2010-11-13 09:30:41 | 只看该作者
怎么使用啊.......纯纯粉粉嫩嫩的小白路过~
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
31 小时
注册时间
2010-11-1
帖子
70
3
发表于 2010-11-13 10:03:54 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
381
在线时间
1398 小时
注册时间
2010-9-23
帖子
557
4
发表于 2010-11-13 16:50:03 | 只看该作者
楼主能提供范例么,看不懂。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
33 小时
注册时间
2010-11-13
帖子
11
5
发表于 2010-11-13 18:14:56 | 只看该作者
这个软件我苦学了3天,大概只学会了75%,楼主的这些我看不懂。
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
7946
在线时间
1182 小时
注册时间
2007-7-29
帖子
2055
6
发表于 2010-11-14 01:16:57 | 只看该作者
其实丢个范例出来不是很难吧?
如果我还是版主我会直接加了3vip然后发布去了……
这东西可以做出很雷的效果,啊哈哈
回复 支持 反对

使用道具 举报

Lv1.梦旅人

垃圾死人

梦石
0
星屑
50
在线时间
285 小时
注册时间
2009-1-27
帖子
2420

贵宾

7
发表于 2010-11-14 01:33:33 | 只看该作者
很惭愧的说- -我也看不懂- -求范例求解释求教程- -
努力努力再努力
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
245
在线时间
227 小时
注册时间
2009-7-26
帖子
216
8
 楼主| 发表于 2010-11-14 02:02:32 | 只看该作者
不好意思,偷了下懒,范例已经上传……顺便修复了些bug……
不要吐槽我⋯⋯
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-29 00:57

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表