搜索附件  

精灵按键.rar

 

不知道有没有人做过,用精灵做的按键:
貌似很多人看不懂……所以就做个了简单的范例,需要的请查看附件
话说不做不知道,做了个范例才发现我这脚本bug一堆……当时考虑的太不周全了……:L


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

废话不多说了,有兴趣的拿去吧……
  1. #==============================================================================# ■ 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在线咨询功能删除,谢谢。
Loading...

QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

GMT+8, 2024-11-24 01:19 , Processed in 0.050823 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

返回顶部