查看: 4302|回复: 9

[通用发布] [ISA][华丽丽地更新]子选项Final

[复制链接]
梦石
0
星屑
55
在线时间
323 小时
注册时间
2010-8-21
回帖
638
发表于 2012-11-23 22:52:17 | 显示全部楼层 |阅读模式

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

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

×
之前在ISA发的子选项的升级版,不兼容上个版本.
先上预览图...
捕获2.JPG
捕获3.JPG


这次做了视频说明.....
http://v.youku.com/v_show/id_XNDc5MDgyNTY0.html
网盘下载:
sub

脚本分为2部分:主体,库。之后可能会对库进行更新(可能性趋近与0)。我估计也没什么人用这个"半成品",
所以之后以本脚本为基础,做一些漂亮有实用的东西出来
xp,vx,va全支持,详见附件的范例下载(3个版本的都在里面),不过,范例只是个半成品,仅仅是来说明这个脚本是怎么使用的.

本体脚本:
[pre lang="ruby" line="1"]#==============================================================================
#  中文名称: 子选项Final
#  英文名称: ZiXuanXiangFinal
#------------------------------------------------------------------------------
#  协议: Ideal Script Association(ISA)
#------------------------------------------------------------------------------
#  作者: 沙漠点灰
#  版本: 0.9.5
#  更新日期:
#==============================================================================

module ISA
  # 字体选中显示修正
  SubTitleUpdate = true
  # 子选项字体阴影
  SubTitleShadow = true
  # 一页最大选项数,不建议修改,会出现bug
  SubTitleMAX    = 5
  # 间距,不建议修改
  SubTitleSpan   = 20
  # 移动层数  当层数达到该值,左移一格
  SubTitleDeep   = 3
  @@_reg ||= {}
  @@_reg["子选项Final"] = "0.9.5"
end
ISA::Edition = self ? (RUBY_VERSION == '1.9.2' ? :va : :vx) : :xp

#==============================================================================
# ■ 临时缓存
#==============================================================================
module ISACache
  # 注: "0xFF" => 窗体     "0xFE" => 窗体(选中) "0xFD" => 右箭头
  #     "0xFC" => 数字选择 "0xFB" => 数字
  
  def self.load(name)
    @@_cache[name]
  end
  def self.save(obj,name)
    @@_cache[name] = obj
  end
  def self.clear
    @@_cache = {}
    GC.start
    bg = Bitmap.new(22*6,32)
    bg.fill_rect(0,2,bg.width,bg.height-4, Color.new(220,150,0,255))
    self.save(bg, "0xFE")
    bg = Bitmap.new(14,32)
    bg.height.times{|i|bg.fill_rect(i,i-2,1,28-i*2, Color.new(255,255,255,200)) if i > 1}
    self.save(bg, "0xFD")
    bg = Bitmap.new(11,22)
    bg.fill_rect(bg.rect, Color.new(220,150,0))
    self.save(bg, "0xFC")
    rect = bg.text_size("0123456789")
    bg = Bitmap.new(rect.width, rect.height)
    bg.font.color =  Color.new(0,0,0)
    bg.draw_text(rect, "0123456789")
    self.save(bg, "0xFB")
    #self.save(Bitmap.new("font.png"), "0xFB")
  end
end

# 绘制位图数据
ISACache.clear
#==============================================================================
# ■ Wnd_SubTitle_Main
#------------------------------------------------------------------------------
#  子选项 主窗体
#==============================================================================

class Wnd_SubTitle_Main
  include ISA
  attr_reader :_id
  attr_reader :_sub
  attr_reader :index
  #--------------------------------------------------------------------------
  #  初始化对象
  #--------------------------------------------------------------------------
  def initialize(x, y, title,index=0)
    #!!!!!Sub的initialize也要修改!!
    @_backing = nil # 返回中
    @_num_input = false # 数字输入标志
    @_num_op = 255 # 数值不透明度
    @_num_de = -1 # 滚动方向
    @_num_ipt = 0 # 数值
    @_num_max = 0 # 最大数值
    @_num_index = 0 # 数值标志
    @_num_frt = 0 # 数值输入x坐标
    @_num_dig = 1 # 数值位数
    @_window_x = 0  # 窗体x
    @_window_x_old = 0 # 窗体旧x
    @_window_count = 0 # 窗体移动帧数
    @_window_move = [] # 窗体移动路径
    @title = title!(title)
    @index = index
    @_id = []
    @_view = Rect.new(x, y, 22*6+4, 32*SubTitleMAX)
    @_self = Sprite.new
    @_self.bitmap = Bitmap.new(@_view.width+SubTitleSpan, @_view.height)
    @_bitmap = @_self.bitmap.dup
    @_bitmap_data = [] # 临时位图储存
    @_title_count = [] # 移动剩余帧数
    @_title_move  = [] # 移动速度
    @_title_now_y = [] # 各index的y坐标
    @_title_str_x = [] # 显示项目的x坐标
    @_title_direc = [] # 项目滚动方向
    @_head_op = 128;@_head_dr = 1;@_head_move = 25;@_head_move_d = -1
    @size = 0
    @title.keys.each{|i|make_new(i[@_id.size],@title) if be2self?(i)
    @size+=1 if be2self?(i)}
    j = 0
    @title.keys.each{|i|
    if be2self?(i)
      @_title_str_x << 0
      @_title_count << 0
      @_title_move << []
      @_title_direc[j] = 1 unless @_title_direc[j]
      @_title_now_y << j*32 + SubTitleMAX*32
      get_to(j, @_title_now_y[j])
      move_to(j,j*32+64,30,1.5)
      add_pause(j, [j*10,50].min)
      j+=1
    end
    }
    @_update_step = 0
    @_sub = nil
    @_visible = true
    @_active = true
    self.x = x;self.y = y;@_z = 0
    @_exit = false
  end
  #--------------------------------------------------------------------------
  #  光标位置
  #--------------------------------------------------------------------------
  def _index
    index = [@index]
    obj = self
    while obj._sub
      index += [obj._sub.index]
      obj = obj._sub
    end
    index
  end
  #--------------------------------------------------------------------------
  #  回到x层数
  #--------------------------------------------------------------------------
  def back2(x)
    @_backing = x
  end
  #--------------------------------------------------------------------------
  #  缓存清除
  #--------------------------------------------------------------------------
  def cache_clear
    @_bitmap_data = []
    @size = 0
    @title.keys.each{|i|make_new(i[@_id.size],@title) if be2self?(i)
    @size+=1 if be2self?(i)}
    move_nor
    @_sub.cache_clear if @_sub
  end
  #--------------------------------------------------------------------------
  #  选择
  #--------------------------------------------------------------------------
  def set_index(index=@index)
    @index = index
    return if moving?
    @_title_move[index] = [0]
    @_title_count[index] = 1
  end
  #--------------------------------------------------------------------------
  #  存在子选项?
  #--------------------------------------------------------------------------
  def exist_sub?(index=@index)
    @title[@_id+[index,0]]
  end
  #--------------------------------------------------------------------------
  #  退出
  #--------------------------------------------------------------------------
  def exit!
    @_exit = true
    @size.times{|i|
    move_to(i,160,30,1.5)
    add_pause(i, [50, @size*10].min-[i*10,50].min)
    }
  end
  #--------------------------------------------------------------------------
  #  返回
  #--------------------------------------------------------------------------
  def back!
    return if @_exit
    return exit! unless @_sub
    @_sub.back! if !@_sub.exit?
  end
  #--------------------------------------------------------------------------
  #  显示数字
  #--------------------------------------------------------------------------
  def show_num(num)
    var = sprintf("%.#{@_num_dig}d", num)
    bmp = ISACache.load("0xFB");wd = bmp.width/10
    rect = bmp.text_size(var)
    new_b = Bitmap.new(@_view.width,32)
    x = (new_b.width-rect.width)/2;y = (new_b.height-rect.height)/2
    @_num_frt = x
    var.split("").each{|i|new_b.blt(x, y, bmp, Rect.new(i.to_i*wd,0,wd,bmp.height));x += wd}
    new_b
  end
  #--------------------------------------------------------------------------
  #  退出
  #--------------------------------------------------------------------------
  def exit?
    @_exit and !moving?
  end
  #--------------------------------------------------------------------------
  #  自己的??
  #--------------------------------------------------------------------------
  def be2self?(ary)
    ary.size == @_id.size+1 and @_id == ary[0,@_id.size]
  end
  #--------------------------------------------------------------------------
  #  加入暂停 缓停
  #--------------------------------------------------------------------------
  def add_pause(index, count)
    @_title_move[index] += [0]*count
    @_title_count[index] += count
  end
  #--------------------------------------------------------------------------
  #  释放
  #--------------------------------------------------------------------------
  def dispose
    @_sub.dispose if @_sub
    @_self.dispose
    @_bitmap.dispose
    @_self.bitmap.dispose
  end
  #--------------------------------------------------------------------------
  #  刷新副选项箭头
  #--------------------------------------------------------------------------
  def update_sub_head
    return unless exist_sub?
    @_head_move += @_head_move_d
    @_head_move = [0,[@_head_move,25].min].max
    @_bitmap.fill_rect(@_view.width, 67, SubTitleSpan, 32, Color.new(0,0,0,0))
    src_bmp = ISACache.load("0xFD")
    @_bitmap.blt(@_view.width+@_head_move, 67, src_bmp, src_bmp.rect, @_head_op)
    @_head_op += @_head_dr * 3
    @_head_dr *= -1 if @_head_op >= 255 or @_head_op <= 125
    @_head_op = 255 if @_head_op > 255
  end
  #--------------------------------------------------------------------------
  #  刷新
  #--------------------------------------------------------------------------
  def update
    if @_sub # 子选项刷新
      @_sub.update
      if @_sub.exit?
        @_sub.dispose
        @_sub = nil
        self.active = true
      end
    end
    if self.class == Wnd_SubTitle_Main # 窗体移动
      @_window_x = [(140+SubTitleSpan)*(SubTitleDeep-_index.size),0].min
      move_window if @_window_x != @_window_x_old
      if @_window_count > 0
        @_window_count -= 1
        self.x += @_window_move[@_window_count]
      end
    end
    update_move    # 移动刷新
    if @_num_input # 数值输入??
      if Input.repeat?(Input::DOWN) and self.active and !@_exit
        play_se
        @_num_ipt -= 10**(@_num_dig-@_num_index-1)
        @_num_ipt = [[@_num_ipt, 0].max, @_num_max].min
      end
      if Input.repeat?(Input::UP) and self.active and !@_exit
        play_se
        @_num_ipt += 10**(@_num_dig-@_num_index-1)
        @_num_ipt = [[@_num_ipt, 0].max, @_num_max].min
      end
      if Input.repeat?(Input::LEFT) and self.active and !@_exit
        play_se
        @_num_index -= 1 if @_num_index > 0
        update_input
      end
      if Input.repeat?(Input::RIGHT) and self.active and !@_exit
        play_se
        @_num_index += 1 if @_num_index < @_num_dig -1
        update_input
      end
    else # 普通
      if Input.repeat?(Input::DOWN) and self.active and !@_exit
        play_se
        @index += 1;@index%=@size
        move_nor
      end
      if Input.repeat?(Input::UP) and self.active and !@_exit
        play_se
        @index -= 1;@index%=@size
        move_nor
      end
    end
    if Input.trigger?(Input::C) and self.active and !@_exit
      if exist_sub? # 存在选择支
        play_se(1)
        @_sub = Wnd_SubTitle_Sub.new(@title,self,@_id+[@index])
        self.active = false
      end
    end
    if Input.trigger?(Input::B) and self.active and !@_sub and !@_exit
      play_se(2)
      exit!
    end
    if self.active
      update_input if @_num_input and @_num_ipt_old != @_num_ipt
      update_sub_head# 刷新副选项箭头
      update_show   # 字符显示修正
      update_bitmap # 位图刷新
    end
    return if self.class != Wnd_SubTitle_Main or !@_backing # 检查返回
    return @_backing = nil if @_backing == _index.size
    back! # 返回!
  end
  #--------------------------------------------------------------------------
  #  SE播放
  #--------------------------------------------------------------------------
  def play_se(se=0)
    case ISA::Edition
    when :xp
      case se
      when 0
        $game_system.se_play($data_system.cursor_se)
      when 1
        $game_system.se_play($data_system.decision_se)
      when 2
        $game_system.se_play($data_system.cancel_se)
      end
    when :vx
      case se
      when 0
        Sound.play_cursor
      when 1
        Sound.play_decision
      when 2
        Sound.play_cancel
      end
    when :va
      case se
      when 0
        Sound.play_cursor
      when 1
        Sound.play_ok
      when 2
        Sound.play_cancel
      end
    end
  end
  #--------------------------------------------------------------------------
  #  刷新输入
  #--------------------------------------------------------------------------
  def update_input
    return unless @_bitmap_data[index]
    @_bitmap_data[index][1] = show_num(@_num_ipt)
    bmp = ISACache.load("0xFC")
    get_to(0)
    @_bitmap.blt(@_num_frt+@_num_index*bmp.width,
    16-bmp.height/2+@_title_now_y[0],bmp,bmp.rect,@_num_op)
    @_num_op += @_num_de * 5
    @_num_de *= -1 if @_num_op < 156 or @_num_op >= 255
    @_num_op = [[@_num_op, 155].max,255].min
  end
  #--------------------------------------------------------------------------
  #  移动窗体
  #--------------------------------------------------------------------------
  def move_window
    count = 30;
    triangle_v = (@_window_x-@_window_x_old).to_f*2/(count**2)
    @_window_move = [-triangle_v/2]
    count.times{|i|@_window_move=triangle_v+@_window_move[i-1]}
    @_window_count = count
    @_window_x_old = @_window_x
  end
  #--------------------------------------------------------------------------
  #  C键允许
  #--------------------------------------------------------------------------
  def c?
    return true if !@_sub and !exist_sub?
    return true if @_sub and @_sub.c?
    false
  end
  #--------------------------------------------------------------------------
  #  字符显示修正
  #--------------------------------------------------------------------------
  def update_show
    @size.times{|i|
    if @_title_direc != 0 and (i == @index or !SubTitleUpdate )
      @_title_direc *= -1 if @_title_str_x == 0 or @_title_str_x-4 == @_bitmap_data[1].width-@_view.width
      @_title_str_x -= @_title_direc*0.25
      get_to(i, nil, @_title_str_x,@index==i)
    end
    }
  end
  #--------------------------------------------------------------------------
  #  位图刷新
  #--------------------------------------------------------------------------
  def update_bitmap
    @_self.bitmap.clear
    @_bitmap.height.times{|a|
    if a < 64
      @_self.bitmap.blt(0,a,@_bitmap,Rect.new(0,a,@_bitmap.width,1),a*4)
    elsif a >= 96
      @_self.bitmap.blt(0,a,@_bitmap,Rect.new(0,a,@_bitmap.width,1),(159-a)*4)
    elsif a == 64
      @_self.bitmap.blt(0,a,@_bitmap,Rect.new(0,a,@_bitmap.width,32))
    end
    }
  end
  #--------------------------------------------------------------------------
  #  按键通常移动
  #--------------------------------------------------------------------------
  def move_nor
    @size.times{|i|move_to(i, (i-@index+2)*32, 20, 4)}
    @_head_move = 25;@_head_move_d =-1
  end
  #--------------------------------------------------------------------------
  #  生成选项
  #--------------------------------------------------------------------------
  def make_new(index,title)
    bg = ISACache.load("0xFF") # 我就不信有人用这个当名称
    unless bg
      bg = Bitmap.new(22*6,32)
      bg.fill_rect(0,2,bg.width,bg.height-4, Color.new(255,255,255,125))
      ISACache.save(bg, "0xFF")
    end
    tl = ISACache.load([@_id+[index],title])
    unless tl
      tl = make_bmp(@title[@_id+[index]])
      ISACache.save(tl, [@_id+[index],title]) if !@_num_input
    end
    @_title_direc[index] = 0 if tl.width-8 <= @_view.width
    @_bitmap_data[index] = [bg, tl]
  end
  #--------------------------------------------------------------------------
  #  获取选项到...
  #--------------------------------------------------------------------------
  def get_to(index, y=nil, indentation=0,choosing=false)
    y = @_title_now_y[index] unless y
    @_bitmap.fill_rect(0, y, @_bitmap.width-SubTitleSpan, 32, Color.new(0,0,0,0))
    @_bitmap.blt(0, y, @_bitmap_data[index][0], @_bitmap_data[index][0].rect)
    if choosing and !@_num_input
      @_bitmap.blt(0, y, ISACache.load("0xFE"), @_bitmap_data[index][0].rect)
    end
    @_bitmap.blt(2, y+3, @_bitmap_data[index][1],
    Rect.new(indentation.to_i, 0, @_bitmap_data[index][0].width,32),60) if SubTitleShadow
    @_bitmap.blt(0, y, @_bitmap_data[index][1],
    Rect.new(indentation.to_i, 0, @_bitmap_data[index][0].width,32))
  end
  #--------------------------------------------------------------------------
  #  移动 仅Y轴 tag_y:目标y count移动时间(帧) a加速度
  #--------------------------------------------------------------------------
  def move_to(index, tag_y, count, acc)
    triangle_v = (tag_y-@_title_now_y[index]).to_f*2/(count**2)
    @_title_move[index] = [-triangle_v/2]
    count.times{|i|@_title_move[index]=triangle_v+@_title_move[index][i-1]}
    @_title_count[index] = count
  end
  #--------------------------------------------------------------------------
  #  刷新移动
  #--------------------------------------------------------------------------
  def update_move
    @_title_count.size.times{|i|
    if @_title_count > 0
      @_title_count -= 1
      clear(i)
      @_title_now_y += @_title_move[@_title_count]
      get_to(i, nil, 0, @index==i)
    end
    }
  end
  #--------------------------------------------------------------------------
  #  清除
  #--------------------------------------------------------------------------
  def clear(index)
    y = @_title_now_y[index]
    @_bitmap.fill_rect(0, y, @_bitmap.width, 32, Color.new(0,0,0,0))
  end
  #--------------------------------------------------------------------------
  #  运动中??
  #--------------------------------------------------------------------------
  def moving?
    @_title_count.any?{|i|i>0}
  end
  #--------------------------------------------------------------------------
  #  各种属性
  #--------------------------------------------------------------------------
  def x=(x)
    @_x = x
    @_self.x = x
    @_view.x = x
  end
  def x
    @_x
  end
  def y=(y)
    @_y = y
    @_self.y = y
    @_view.y = y
  end
  def y
    @_y
  end
  def z=(z)
    @_z = z
    @_self.z = @_z
  end
  def z
    @_z
  end
  def visible=(visible)
    @_visible = visible
    @_self.visible = visible
  end
  def visible
    @_visible
  end
  def active=(active)
    @_active = active
  end
  def active
    @_active
  end
  def input
    input = [0]
    obj = @_sub
    loop do
      input << obj._num_ipt
      break if !obj.exist_sub?
      obj = obj._sub
    end
    input
  end
end

class Array
  def add_ele(pos, num)
    self[pos] += num
  end
end
#==============================================================================
# ■ Wnd_SubTitle_Main
#------------------------------------------------------------------------------
#  子选项 主窗体
#==============================================================================

class Wnd_SubTitle_Sub < Wnd_SubTitle_Main
  def true_father
    obj = @father
    loop do
      break if obj.class == Wnd_SubTitle_Main
      obj = obj.father
    end
    obj
  end
  attr_reader :father
  attr_reader :_num_ipt
  #--------------------------------------------------------------------------
  #  初始化对象
  #--------------------------------------------------------------------------
  def initialize(title,father,_id,index=0)
    @_num_input = false # 数字输入标志
    @_num_ipt = 0 # 数值
    @_num_max = 0 # 最大数值
    @_num_index = 0 # 数值标志
    @_num_frt = 0 # 数值输入x坐标
    @_num_op = 255
    @_num_dig = 1 # 数值位数
    @title = title
    @index = index
    @_num_de = -1
    ##########
    @father = father
    @_id = _id
    @_view = Rect.new(father.x, father.y, 22*6+4, 32*ISA::SubTitleMAX)
    @_self = Sprite.new
    @_self.bitmap = Bitmap.new(@_view.width+ISA::SubTitleSpan, @_view.height)
    @_bitmap = @_self.bitmap.dup
    @_bitmap_data = [] # 临时位图储存
    @_title_count = [] # 移动剩余帧数
    @_title_move  = [] # 移动速度
    @_title_now_y = [] # 各index的y坐标
    @_title_str_x = [] # 显示项目的x坐标
    @_title_direc = [] # 项目滚动方向
    @_head_op = 128;@_head_dr = 1;@_head_move = 25;@_head_move_d = -1
    @size = 0
    @title.keys.each{|i|make_new(i[@_id.size],@title) if be2self?(i)
    @size+=1 if be2self?(i)}
    j = 0
    @title.keys.each{|i|
    if be2self?(i)
      @_title_str_x << 0
      @_title_count << 0
      @_title_move << []
      @_title_direc[j] = 1 unless @_title_direc[j]
      @_title_now_y << j*32 + ISA::SubTitleMAX*32
      get_to(j, @_title_now_y[j])
      move_to(j,j*32+64,30,1.5)
      add_pause(j, [j*10,50].min)
      j+=1
    end
    }
    @_update_step = 0
    @_sub = nil
    @_visible = true
    @_active = true
    self.x = father.x+140+ISA::SubTitleSpan;self.y = father.y;@_z = father.z
    @_exit = false
  end
  def update
    super
    self.x = @father.x+140+ISA::SubTitleSpan;self.y = @father.y;@_z = @father.z
  end
end[/pre]

库:
[pre lang="ruby" line="1"]class Wnd_SubTitle_Main
  case ISA::Edition
  when :xp
    #--------------------------------------------------------------------------
    #  文件初处理
    #--------------------------------------------------------------------------
    def title!(title)
      tmp = title.dup
      ary = tmp.keys.sort
      ary.each{|i|
      case tmp[0]
      when "输入"
        next unless tmp[4]
        size = 0;tmp2 = i.dup
        pos = tmp[4]
        loop do
          tmp2.add_ele(pos,1)
          tmp[tmp2[0,pos+1]+i[pos+1,i.size-pos-1]] = tmp
          break unless tmp[tmp2[0,pos+1]]
        end
      when "特技"
        if tmp[1].is_a?(String)
          actor = eval(tmp[1])
          next unless actor
          data = actor.skills
          if data == []
            tmp.delete(i) # 删除
          else
            data.size.times{|j|tmp[i[0,i.size-1]+[j]] = ["特技",data[j]]}
          end
        end
      when "命令"
        size = 0;tmp2 = i.dup
        pos = tmp[3] ? tmp[3] : i.size-2
        loop do
          tmp2.add_ele(pos,1)
          tmp[tmp2[0,pos+1]+i[pos+1,i.size-pos-1]] = tmp
          break unless tmp[tmp2[0,pos+1]]
        end
      when "队伍"
        data = $game_party.actors
        if data == []
          tmp.delete(i) # 删除
        else
          size = 0;tmp2 = i.dup
          pos = tmp[1] #? tmp[1] : i.size-2
          unless pos
            data.size.times{|j|tmp[i[0,i.size-1]+[j]] = ["角色",data[j]]}
          else
            loop do
              var = tmp2[0,pos+1]+i[pos+1,i.size-pos-1]
              data.size.times{|j|tmp[var[0,var.size-1]+[j]] = ["角色",data[j]]}
              tmp2.add_ele(pos,1)
              break unless tmp[tmp2[0,pos+1]]
            end
          end
        end
      when "物品"
        if tmp[1] == 0
          data = []
          for j in 1...$data_items.size
            data << j if $game_party.item_number(j) > 0
          end
          if data == []
            tmp.delete(i) # 删除
          else
            data.size.times{|j|tmp[i[0,i.size-1]+[j]] = ["物品",data[j]]}
          end
        end
      when "武器"
        if tmp[1] == 0
          data = []
          for j in 1...$data_weapons.size
            data << j if $game_party.weapon_number(j) > 0
          end
          if data == []
            tmp.delete(i) # 删除
          else
            data.size.times{|j|tmp[i[0,i.size-1]+[j]] = ["武器",data[j]]}
          end
        end
      when "防具"
        if tmp[1] == 0
          data = []
          for j in 1...$data_armors.size
            data << j if $game_party.armor_number(j) > 0
          end
          if data == []
            tmp.delete(i) # 删除
          else
            data.size.times{|j|tmp[i[0,i.size-1]+[j]] = ["防具",data[j]]}
          end
        end
      end
      }
      tmp
    end
    #--------------------------------------------------------------------------
    #  生成位图
    #--------------------------------------------------------------------------
    def make_bmp(obj)
      case obj[0]
      when "输入"
        @_num_input = true
        @_num_dig = eval(obj[1])
        @_num_ipt = eval(obj[2])
        @_num_max = eval(obj[3])
        bmp = show_num(@_num_ipt)
        update_input
      when "命令"
        str = eval(obj[1])
        wid = @_self.bitmap.text_size(str)
        bmp = Bitmap.new([wid.width, @_view.width].max,32)
        bmp.font.color = eval(obj[2]) ? Color.new(0,0,0) : Color.new(120,120,120)
        bmp.draw_text(bmp.rect, str, 1)
      when "文字"
        wid = @_self.bitmap.text_size(obj[1])
        bmp = Bitmap.new([wid.width, @_view.width].max,32)
        bmp.font.color = Color.new(0,0,0)
        bmp.draw_text(bmp.rect, obj[1], 1)
      when "特技"
        item = $data_skills[obj[1]]
        name = item.name
        wid = @_self.bitmap.text_size(name)
        wid.width += 24
        bitmap = RPG::Cache.icon(item.icon_name)
        bmp = Bitmap.new([wid.width+28, @_view.width].max+8,32)
        bmp.blt((bmp.width-wid.width)/2, 4, bitmap, Rect.new(0, 0, 24, 24))
        bmp.font.color = Color.new(0,0,0)
        bmp.draw_text(0, 0, bmp.width, 32, "  "+name,1)
      when "物品"
        item = $data_items[obj[1]]
        name = item.name + " ×#{$game_party.item_number(item.id)} "
        wid = @_self.bitmap.text_size(name)
        bitmap = RPG::Cache.icon(item.icon_name)
        bmp = Bitmap.new([wid.width+28, @_view.width].max+8,32)
        bmp.blt(0, 4, bitmap, Rect.new(0, 0, 24, 24))
        bmp.font.color = Color.new(0,0,0)
        bmp.draw_text(28, 0, 212, 32, name)
      when "武器"
        item = $data_weapons[obj[1]]
        name = item.name + " ×#{$game_party.weapon_number(item.id)} "
        wid = @_self.bitmap.text_size(name)
        bitmap = RPG::Cache.icon(item.icon_name)
        bmp = Bitmap.new([wid.width+28, @_view.width].max+8,32)
        bmp.blt(0, 4, bitmap, Rect.new(0, 0, 24, 24))
        bmp.font.color = Color.new(0,0,0)
        bmp.draw_text(28, 0, 212, 32, name)
      when "防具"
        item = $data_armors[obj[1]]
        name = item.name + " ×#{$game_party.armor_number(item.id)} "
        wid = @_self.bitmap.text_size(name)
        bitmap = RPG::Cache.icon(item.icon_name)
        bmp = Bitmap.new([wid.width+28, @_view.width].max+8,32)
        bmp.blt(0, 4, bitmap, Rect.new(0, 0, 24, 24))
        bmp.font.color = Color.new(0,0,0)
        bmp.draw_text(28, 0, 212, 32, name)
      when "脚本"
        str = eval(obj[1])
        wid = @_self.bitmap.text_size(str)
        bmp = Bitmap.new([wid.width, @_view.width].max+8,32)
        bmp.font.color = Color.new(0,0,0)
        bmp.draw_text(0,0,bmp.width-SubTitleSpan,bmp.height, str, 1)
      when "角色"
        wid = @_self.bitmap.text_size(obj[1].name)
        bmp = Bitmap.new([wid.width, @_view.width].max+8,32)
        bmp.font.color = Color.new(0,0,0)
        bmp.draw_text(0,0,bmp.width-SubTitleSpan,bmp.height, obj[1].name, 1)
      else
        print "未定义#{obj[0]}";exit
      end
      bmp
    end
  when :vx
    #--------------------------------------------------------------------------
    #  文件初处理
    #--------------------------------------------------------------------------
    def title!(title)
      tmp = title.dup
      ary = tmp.keys.sort
      ary.each{|i|
      case tmp[0]
      when "输入"
        next unless tmp[4]
        size = 0;tmp2 = i.dup
        pos = tmp[4]
        loop do
          tmp2.add_ele(pos,1)
          tmp[tmp2[0,pos+1]+i[pos+1,i.size-pos-1]] = tmp
          break unless tmp[tmp2[0,pos+1]]
        end
      when "特技"
        if tmp[1].is_a?(String)
          actor = eval(tmp[1])
          next unless actor
          data = actor.skills
          if data == []
            tmp.delete(i) # 删除
          else
            data.size.times{|j|tmp[i[0,i.size-1]+[j]] = ["特技",data[j]]}
          end
        end
      when "命令"
        size = 0;tmp2 = i.dup
        pos = tmp[3] ? tmp[3] : i.size-2
        loop do
          tmp2.add_ele(pos,1)
          tmp[tmp2[0,pos+1]+i[pos+1,i.size-pos-1]] = tmp
          break unless tmp[tmp2[0,pos+1]]
        end
      when "队伍"
        data = $game_party.members
        if data == []
          tmp.delete(i) # 删除
        else
          size = 0;tmp2 = i.dup
          pos = tmp[1] #? tmp[1] : i.size-2
          unless pos
            data.size.times{|j|tmp[i[0,i.size-1]+[j]] = ["角色",data[j]]}
          else
            loop do
              tmp2.add_ele(pos,1)
              var = tmp2[0,pos+1]+i[pos+1,i.size-pos-1]
              data.size.times{|j|tmp[var[0,var.size-1]+[j]] = ["角色",data[j]]}
              break unless tmp[tmp2[0,pos+1]]
            end
          end
        end
      when "物品"
        if tmp[1] == 0
          data = []
          $game_party.items.each{|item|data.push(item) if item.is_a?(RPG::Item)}
          if data == []
            tmp.delete(i) # 删除
          else
            data.size.times{|j|tmp[i[0,i.size-1]+[j]] = ["物品",data[j]]}
          end
        end
      when "武器"
        if tmp[1] == 0
          data = []
          $game_party.items.each{|item|data.push(item) if item.is_a?(RPG::Weapon)}
          if data == []
            tmp.delete(i) # 删除
          else
            data.size.times{|j|tmp[i[0,i.size-1]+[j]] = ["物品",data[j]]}
          end
        end
      when "防具"
        if tmp[1] == 0
          data = []
          $game_party.items.each{|item|data.push(item) if item.is_a?(RPG::Armor)}
          if data == []
            tmp.delete(i) # 删除
          else
            data.size.times{|j|tmp[i[0,i.size-1]+[j]] = ["物品",data[j]]}
          end
        end
      end
      }
      tmp
    end
    #--------------------------------------------------------------------------
    #  生成位图
    #--------------------------------------------------------------------------
    def make_bmp(obj)
      case obj[0]
      when "输入"
        @_num_input = true
        @_num_dig = eval(obj[1])
        @_num_ipt = eval(obj[2])
        @_num_max = eval(obj[3])
        bmp = show_num(@_num_ipt)
        update_input
      when "命令"
        str = eval(obj[1])
        wid = @_self.bitmap.text_size(str)
        bmp = Bitmap.new([wid.width, @_view.width].max,32)
        bmp.font.color = eval(obj[2]) ? Color.new(0,0,0) : Color.new(120,120,120)
        bmp.draw_text(bmp.rect, str, 1)
      when "文字"
        wid = @_self.bitmap.text_size(obj[1])
        bmp = Bitmap.new([wid.width, @_view.width].max,32)
        bmp.font.color = Color.new(0,0,0)
        bmp.draw_text(bmp.rect, obj[1], 1)
      when "特技"
        item = obj[1];name = item.name
        icon_index = item.icon_index
        wid = @_self.bitmap.text_size(name)
        wid.width += 24
        
        bitmap = Cache.system("Iconset")
        rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
        bmp = Bitmap.new([wid.width+28, @_view.width].max+8,32)
        
        bmp.blt((bmp.width-wid.width)/2, 4, bitmap, rect)
        bmp.font.color = Color.new(0,0,0)
        bmp.draw_text(0, 0, bmp.width, 32, "  "+name,1)
      when "物品"
        item = obj[1];name = item.name+" ×#{$game_party.item_number(item)} "
        icon_index = item.icon_index
        wid = @_self.bitmap.text_size(name)
        wid.width += 24
        
        bitmap = Cache.system("Iconset")
        rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
        bmp = Bitmap.new([wid.width+28, @_view.width].max+8,32)
        
        bmp.blt((bmp.width-wid.width)/2, 4, bitmap, rect)
        bmp.font.color = Color.new(0,0,0)
        bmp.draw_text(0, 0, bmp.width, 32, "  "+name,1)
      when "脚本"
        str = eval(obj[1])
        wid = @_self.bitmap.text_size(str)
        bmp = Bitmap.new([wid.width, @_view.width].max+8,32)
        bmp.font.color = Color.new(0,0,0)
        bmp.draw_text(0,0,bmp.width-SubTitleSpan,bmp.height, str, 1)
      when "角色"
        wid = @_self.bitmap.text_size(obj[1].name)
        bmp = Bitmap.new([wid.width, @_view.width].max+8,32)
        bmp.font.color = Color.new(0,0,0)
        bmp.draw_text(0,0,bmp.width-SubTitleSpan,bmp.height, obj[1].name, 1)
      else
        print "未定义#{obj}";exit
      end
      bmp
    end
  when :va
    #--------------------------------------------------------------------------
    #  文件初处理
    #--------------------------------------------------------------------------
    def title!(title)
      tmp = title.dup
      ary = tmp.keys.sort
      ary.each{|i|
      case tmp[0]
      when "输入"
        next unless tmp[4]
        size = 0;tmp2 = i.dup
        pos = tmp[4]
        loop do
          tmp2.add_ele(pos,1)
          tmp[tmp2[0,pos+1]+i[pos+1,i.size-pos-1]] = tmp
          break unless tmp[tmp2[0,pos+1]]
        end
      when "特技"
        if tmp[1].is_a?(String)
          actor = eval(tmp[1])
          next unless actor
          data = actor.skills
          if data == []
            tmp.delete(i) # 删除
          else
            data.size.times{|j|tmp[i[0,i.size-1]+[j]] = ["特技",data[j]]}
          end
        end
      when "命令"
        size = 0;tmp2 = i.dup
        pos = tmp[3] ? tmp[3] : i.size-2
        loop do
          tmp2.add_ele(pos,1)
          tmp[tmp2[0,pos+1]+i[pos+1,i.size-pos-1]] = tmp
          break unless tmp[tmp2[0,pos+1]]
        end
      when "队伍"
        data = $game_party.members
        if data == []
          tmp.delete(i) # 删除
        else
          size = 0;tmp2 = i.dup
          pos = tmp[1] #? tmp[1] : i.size-2
          unless pos
            data.size.times{|j|tmp[i[0,i.size-1]+[j]] = ["角色",data[j]]}
          else
            loop do
              tmp2.add_ele(pos,1)
              var = tmp2[0,pos+1]+i[pos+1,i.size-pos-1]
              data.size.times{|j|tmp[var[0,var.size-1]+[j]] = ["角色",data[j]]}
              break unless tmp[tmp2[0,pos+1]]
            end
          end
        end
      when "贵重物品"
        if tmp[1] == 0
          data = []
          $game_party.items.each{|item|data.push(item) if item.is_a?(RPG::Item) and item.key_item?}
          if data == []
            tmp.delete(i) # 删除
          else
            data.size.times{|j|tmp[i[0,i.size-1]+[j]] = ["物品",data[j]]}
          end
        end
      when "物品"
        if tmp[1] == 0
          data = []
          $game_party.items.each{|item|data.push(item) if item.is_a?(RPG::Item) and !item.key_item?}
          if data == []
            tmp.delete(i) # 删除
          else
            data.size.times{|j|tmp[i[0,i.size-1]+[j]] = ["物品",data[j]]}
          end
        end
      when "武器"
        if tmp[1] == 0
          data = []
          $game_party.items.each{|item|data.push(item) if item.is_a?(RPG::Weapon)}
          if data == []
            tmp.delete(i) # 删除
          else
            data.size.times{|j|tmp[i[0,i.size-1]+[j]] = ["物品",data[j]]}
          end
        end
      when "防具"
        if tmp[1] == 0
          data = []
          $game_party.items.each{|item|data.push(item) if item.is_a?(RPG::Armor)}
          if data == []
            tmp.delete(i) # 删除
          else
            data.size.times{|j|tmp[i[0,i.size-1]+[j]] = ["物品",data[j]]}
          end
        end
      end
      }
      tmp
    end
    #--------------------------------------------------------------------------
    #  生成位图
    #--------------------------------------------------------------------------
    def make_bmp(obj)
      case obj[0]
      when "输入"
        @_num_input = true
        @_num_dig = eval(obj[1])
        @_num_ipt = eval(obj[2])
        @_num_max = eval(obj[3])
        bmp = show_num(@_num_ipt)
        update_input
      when "命令"
        str = eval(obj[1])
        wid = @_self.bitmap.text_size(str)
        bmp = Bitmap.new([wid.width, @_view.width].max,32)
        bmp.font.color = eval(obj[2]) ? Color.new(0,0,0) : Color.new(120,120,120)
        bmp.draw_text(bmp.rect, str, 1)
      when "文字"
        wid = @_self.bitmap.text_size(obj[1])
        bmp = Bitmap.new([wid.width, @_view.width].max,32)
        bmp.font.color = Color.new(0,0,0)
        bmp.draw_text(bmp.rect, obj[1], 1)
      when "特技"
        item = obj[1];name = item.name
        icon_index = item.icon_index
        wid = @_self.bitmap.text_size(name)
        wid.width += 24
        
        bitmap = Cache.system("Iconset")
        rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
        bmp = Bitmap.new([wid.width+28, @_view.width].max+8,32)
        
        bmp.blt((bmp.width-wid.width)/2, 4, bitmap, rect)
        bmp.font.color = Color.new(0,0,0)
        bmp.draw_text(0, 0, bmp.width, 32, "  "+name,1)
      when "物品"
        item = obj[1];name = item.name+" ×#{$game_party.item_number(item)} "
        icon_index = item.icon_index
        wid = @_self.bitmap.text_size(name)
        wid.width += 24
        
        bitmap = Cache.system("Iconset")
        rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
        bmp = Bitmap.new([wid.width+28, @_view.width].max+8,32)
        
        bmp.blt((bmp.width-wid.width)/2, 4, bitmap, rect)
        bmp.font.color = Color.new(0,0,0)
        bmp.draw_text(0, 0, bmp.width, 32, "  "+name,1)
      when "脚本"
        str = eval(obj[1])
        wid = @_self.bitmap.text_size(str)
        bmp = Bitmap.new([wid.width, @_view.width].max+8,32)
        bmp.font.color = Color.new(0,0,0)
        bmp.draw_text(0,0,bmp.width-SubTitleSpan,bmp.height, str, 1)
      when "角色"
        wid = @_self.bitmap.text_size(obj[1].name)
        bmp = Bitmap.new([wid.width, @_view.width].max+8,32)
        bmp.font.color = Color.new(0,0,0)
        bmp.draw_text(0,0,bmp.width-SubTitleSpan,bmp.height, obj[1].name, 1)
      else
        print "未定义#{obj}";exit
      end
      bmp
    end
  else
    print "RGSS版本识别不能"
  end
end[/pre]

附件范例下载:
RM.part1.rar (999 KB, 下载次数: 180)
RM.part2.rar (914.33 KB, 下载次数: 193)

评分

参与人数 1星屑 +600 收起 理由
feizhaodan + 600 奖赏条例

查看全部评分

>>猛戳>>MetalSagaR游戏主页<<这里<<
欢迎提供您的意见
梦石
0
星屑
55
在线时间
295 小时
注册时间
2008-5-24
回帖
469
发表于 2012-11-24 00:27:13 | 显示全部楼层
支持,很华丽。
另外,就是在选技能上,和选物品上,如此小的框框真会让人玩得不爽,
建议到了选技能和物品时,沿用Xp默认系统的选法,感觉上会好一些。
嗯,如果不必要的话,菜单系统可以弄大一点,加上背景,动态萤火什么的(当然,是成品…还有游戏帧数支持的话……)
就是这样子,以上是个人的一些看法,不必挂在心上。
楼主已经做得很好了。所以,让我借鉴一下吧。

点评

呵呵(= =),初衷仅仅是"子选项",这个菜单仅仅是范例而已...  发表于 2012-11-24 20:38
前方
迷茫
后方
已不在
回复

使用道具 举报

职业の水客

梦石
2
星屑
16976
在线时间
7495 小时
注册时间
2010-6-16
回帖
3461

极短27评委MZ评测员极短26评委开拓者

发表于 2012-11-24 18:08:46 | 显示全部楼层
仿SAO的菜单选项......
做的很不错
一个看图的地方
群爆炸重建后状态:论坛老人最多(只剩下了活跃的老人),技术力很强(依旧不变)的编程灌水群:901540785
专门讨论RM相关的Q群:56875149
PS:第一个群不是专门讨论RM的,第二个才是哦。
回复

使用道具 举报

梦石
0
星屑
660
在线时间
1286 小时
注册时间
2011-6-14
回帖
3949
发表于 2012-11-24 18:43:31 | 显示全部楼层
真华丽=w=
不过貌似会占用玩家一点时间来看特效之类的,特效速度应该快一点。
另外,如此小的框。。。
回复

使用道具 举报

梦石
0
星屑
47
在线时间
976 小时
注册时间
2011-4-30
回帖
846
发表于 2012-11-26 12:59:03 | 显示全部楼层
菜单退出的时候速度太慢了,特别是打开层数过多的时候。这里我指的不是运行速度,而是设计上的问题。

举个例子说,LZ做的这个有点类似win7之前的win菜单设计,而win7已经放弃这种设计了,就算是早期的win,他也可以用鼠标想退到第几层就退到第几层,而LZ这个只能一层一层退,比较死板。

而且类似这种层数太多的设计最好有个快速退出的通道。

还有原本rm画面就不大,可显示的信息量本来就有限,按照LZ这么一弄,显示的信息量更少了,我估计是LZ考虑到这个菜单的运行效率不能加载太多的选项?

虽然我觉得这个构思有点意思,但是如果实际应用我不会向别人推荐这款设计。

暂时就想到这些了。
湿滑落式骑!
回复

使用道具 举报

梦石
0
星屑
728
在线时间
687 小时
注册时间
2011-2-13
回帖
637
发表于 2012-11-26 17:54:29 | 显示全部楼层
东西一多 岂不是...

点评

下个版本会注意的,谢谢关注  发表于 2012-11-26 19:25
回复

使用道具 举报

梦石
0
星屑
55
在线时间
323 小时
注册时间
2010-8-21
回帖
638
 楼主| 发表于 2012-11-26 19:32:42 | 显示全部楼层
本帖最后由 沙漠点灰 于 2012-11-26 19:35 编辑
羞射了 发表于 2012-11-26 12:59
菜单退出的时候速度太慢了,特别是打开层数过多的时候。这里我指的不是运行速度,而是设计上的问题。

举个 ...


先感谢5l的反馈。先做出解释:

菜单退出的时候速度太慢了

这个是自己的固执吧,因为移动是"缓动",即加速度为负数的匀变速运动,移动时间少了看不出来..
这个可以修改(在更新版中会给出设置值):
def exit!

    @_exit = true

    @size.times{|i|

    move_to(i,160,30,1.5)

    add_pause(i, [50, @size*10].min-[i*10,50].min)

    }

  end

中, move_to(i,160,30,1.5)的30可以修改为更低值,
add_pause(i, [50, @size*10].min-[i*10,50].min)
也要做出相应修改,这个是控制每项移动的间隔时间,这个我会在更新版做出更好的解决方式。


举个例子说,LZ做的这个有点类似win7之前的win菜单设计,而win7已经放弃这种设计了,就算是早期的win,他也可以用鼠标想退到第几层就退到第几层,而LZ这个只能一层一层退,比较死板。


这句话,5l可能没组织好语言,5l的意思可能是建议加入鼠标支持吧,毕竟Win的选项用键盘也只能一层一层地退。
说到鼠标支持,5l可能没用过之前版本的子选项吧..


之前也是先出个键盘版作预览,之后才加入鼠标支持。之前没人用的子选项我也会更新,这次就更别说了,而且
这次的难度比上次的简单太多了....






显示的信息量更少了

当初有个
SubTitleMAX    = 5

以供显示每层显示的选项,但是在
  def update_bitmap

    @_self.bitmap.clear

    @_bitmap.height.times{|a|

    if a < 64

      @_self.bitmap.blt(0,a,@_bitmap,Rect.new(0,a,@_bitmap.width,1),a*4)

    elsif a >= 96

      @_self.bitmap.blt(0,a,@_bitmap,Rect.new(0,a,@_bitmap.width,1),(159-a)*4)

    elsif a == 64

      @_self.bitmap.blt(0,a,@_bitmap,Rect.new(0,a,@_bitmap.width,32))

    end

    }

  end

手贱一下,变成这样了...不透明度步进值为4,只能显示256/4=64/32=2*2+1=5项了
可以修改一下,比如步进值为1,就能显示256/1=256/32=8/2+1=17项了,当然
这绝不是效率的问题,仅仅是"手贱"了.....不过17项...又太多了,会在更新版做出合理解释。

最后,再次感谢5l提出的建议

点评

好的,LZ加油!  发表于 2012-11-26 21:28
>>猛戳>>MetalSagaR游戏主页<<这里<<
欢迎提供您的意见
回复

使用道具 举报

梦石
0
星屑
47
在线时间
253 小时
注册时间
2012-8-2
回帖
190
发表于 2012-11-26 19:54:40 | 显示全部楼层
楼主的声音

点评

还能这样干  发表于 2012-11-26 20:48
谷歌娘的声音......  发表于 2012-11-26 20:44
回复

使用道具 举报

梦石
0
星屑
2112
在线时间
436 小时
注册时间
2010-11-22
回帖
382
发表于 2013-8-23 00:02:13 | 显示全部楼层
非常棒的菜单。

点评

额,太久没关注这区,没注意发布时间········  发表于 2013-8-23 10:40
挖坟了..?  发表于 2013-8-23 03:51
回复

使用道具 举报

梦石
0
星屑
50
在线时间
11 小时
注册时间
2013-10-5
回帖
9
发表于 2013-12-1 11:22:53 | 显示全部楼层
背景是什么歌曲?很好听唉
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部