注册会员 登录
Project1 返回首页

蒟蒻果冻 https://rpg.blue/?293757 [收藏] [复制] [分享] [RSS] blog: http://sxysxy.org

日志

扩展物品界面

已有 176 次阅读2015-8-12 12:26 |个人分类:脚本

脚本:

#encoding:utf-8
# 物品界面扩展,v1.0 for rmva(RGSS3)
#分类定义方法:
# 数据库中,注释部分 itemclass:类型:end
#使用说明:
# 常量ITEM_CLASS_LIST,这是一个Hash表,分类名称对应一个标号,标号决定了当这些
# 分类同时存在时列表上显示的先后顺序
# 对于使用范围为我方单体的物品,会出现一个选择框选择使用目标
# 对于使用范围为我方全体的物品,会直接使用,不显示选择框
#   注意看一下调用本界面的方法
# 如有bug请及时联系我,66rpg上或者我qq 1441157749
#                          浮云半仙 2015.8.12完工
#偷偷地在这里加个命名空间 O(∩_∩)O
module FYBX
#----
#物品全部分类列表,名称 => 序号 (序号影响显示先后顺序)
ITEM_CLASS_LIST = {
  "回复类"            => 0,
  "治愈类"            => 1,
  "能力提升"          => 2,
  "贵重物品"          => 3,
  "信件文档"          => 4,
  "武器"              => 5,
  "防具"              => 6,
  "饰品"              => 7
}

#如果你的菜单使用的是va原先自带的菜单,则可以去掉下面这段代码的注释(删掉=begin和=end),
#这段代码能够使得菜单调用物品界面时进入 FYBX::Scene_Item
=begin
Scene_Menu.send :define_method, :command_item do
  SceneManager.call(FYBX::Scene_Item)
end
=end
#如果你的游戏菜单用的不是va自带的,最好不要去掉注释,否则可能会出错
#这种情况下请自行修改物品界面调用

class Window_ItemClassList < Window_Selectable
  attr_reader :have_classes       #已有的项目
  def initialize
    super(0,40,140,320)
    @have_classes = Array.new
    make_item_class_list
    open
    select(0)
    activate
  end
  #生成物品分类列表
  def make_item_class_list
    contents.clear
    @have_classes = []
    $game_party.all_items.each do |each_item|
      full_desc = each_item.note[/(itemclass:).+(:end)/]
      #msgbox(full_desc)                                 #测试通过
      #msgbox(full_desc[9..full_desc.length-5])          #测试通过
      type = full_desc[10..full_desc.length-5]
      @have_classes.push(type)
    end
    @have_classes.uniq!
    @have_classes.sort! do
      |a,b| ITEM_CLASS_LIST[a] <=> ITEM_CLASS_LIST[b]
    end
    #绘制出所有项目
    idx = 0
    @have_classes.each do |each_itemclassname|
      draw_item(idx,each_itemclassname)
      idx += 1
    end
    update
  end
  #绘制项目
  def draw_item(index,text)
    draw_text(item_rect_for_text(index), text)
  end
  def item_max
    return @have_classes? @have_classes.size : 1
  end
  #获取当前分类
  def current_class
    return @have_classes[@index] if [0...@have_classes.size] === @index
    return nil
  end
  #刷新列表
  def refresh_list
    make_item_class_list
  end
end

class Window_ItemList < Window_Selectable
  attr_reader :items  
  attr_reader :current_class
  def initialize(x,y,w,h)
    super(x,y,w,h)
    @@last_select = 0
    @items = Array.new
    open
  end
  #生成当前分类下的物品列表
  def make_item_list(current_class)
    return if current_class == nil
    @current_class = current_class
    @items = []
    contents.clear
    $game_party.all_items.each do |each_item|
      full_desc = each_item.note[/(itemclass:).+(:end)/]
      type = full_desc[10..full_desc.length-5]
      next if type != current_class
      @items.push(each_item)
    end
    if @items == []
      call_handler(:cancel)
    end
    idx = 0
    @items.each do|each_item|
      draw_item(idx,each_item)
      idx += 1
    end
  end
  def draw_item(index,item)
    rect = item_rect(index)
    rect.width -= 4
    draw_item_name(item, rect.x, rect.y,
          item.is_a?(RPG::Item)? item.menu_ok? : false, width/2)
    draw_item_number(rect,item)
  end
  #绘制物品个数 O(∩_∩)O~好吧我承认这个方法是我从va自带脚本Window_ItemList复制来的
  def draw_item_number(rect, item)
    draw_text(rect, sprintf(":%2d", $game_party.item_number(item)), 2)
  end 
  def item_max
    return @items? @items.size : 1
  end
  #刷新列表
  def refresh_list
    make_item_list(@current_class)
  end
end

class Window_SelectActor < Window_Selectable
  attr_reader :cur_item
  def initialize(cur_item)
    super(0,0,220,Graphics.height)
    @cur_item = cur_item
    make_list
  end
  #生成角色列表
  def make_list
    idx = 0
    $game_party.members.size.times do
      draw_item(idx)
      idx += 1
    end
  end
  def item_height 
    return (Graphics.height-standard_padding*2)/4
  end
  def item_max
    return $game_party.members.size
  end
  #这个draw_item来自原va自带脚本Scene_MenuStatus.并做了些修改
  def draw_item(index)
    actor = $game_party.members[index]
    rect = item_rect(index)
    draw_actor_face(actor, rect.x + 1, rect.y + 1, true)
    draw_actor_simple_status(actor, rect.x + 108, rect.y + line_height / 2)
  end
  #绘制人物状态
  def draw_actor_simple_status(actor, x, y)
    draw_actor_name(actor, x, y)
    draw_actor_hp(actor, x , y + line_height * 1, 80)
    draw_actor_mp(actor, x , y + line_height * 2, 80)
  end
end

class Scene_Item < Scene_Base
  def start
    super
    @itemclslist_last_select = 0
    @useitem_last_select = 0
    @current_item = nil
    @window_useitem = nil
   
    @window_itemclslist = Window_ItemClassList.new
    @window_itemclslist.set_handler(:cancel        , method(:return_scene))
    @window_itemclslist.set_handler(:ok            , method(:itemclslist_onok))
    @window_itemclslist.set_handler(:moved , method(:refresh_itemclslist_moved))
   
    @window_itemlist = Window_ItemList.new(@window_itemclslist.width,
            @window_itemclslist.y,Graphics.width - @window_itemclslist.width,
              @window_itemclslist.height)
    @window_itemlist.make_item_list(@window_itemclslist.have_classes[0])
    @window_itemlist.set_handler(:cancel , method(:item_list_cancel))
    @window_itemlist.set_handler(:moved  , method(:refresh_itemlist_moved))
    @window_itemlist.set_handler(:ok     , method(:item_list_ok))
   
    @window_classtip = Window_Help.new(1)
    @window_classtip.set_text("物品:"+(@window_itemclslist.have_classes[@window_itemclslist.index] != nil ? @window_itemclslist.have_classes[@window_itemclslist.index] : ""))
    @window_classtip.open
   
    @window_itemdesc = Window_Help.new
    @window_itemdesc.x = 0
    @window_itemdesc.y = @window_itemlist.y+@window_itemlist.height
    @window_itemdesc.width = Graphics.width
    @window_itemdesc.height = Graphics.height - @window_itemdesc.y
    @window_itemdesc.set_text("")
    @window_itemdesc.open
  end
 
  #在物品分类列表内按下确定键的处理
  def itemclslist_onok
    Sound.play_ok
    @window_itemclslist.unselect
   
    @window_itemlist.activate
    @window_itemlist.select(0)
    @window_itemdesc.set_text(@window_itemlist.items[@window_itemlist.index]? @window_itemlist.items[@window_itemlist.index].description : "")
  end
 
 
  #在物品列表内按下取消键的处理
  def item_list_cancel
    Sound.play_cancel
    @window_itemlist.unselect
   
    @window_itemclslist.select(@itemclslist_last_select)
    @window_itemclslist.activate
  end
 
  #在物品列表内按下确定键时的处理
  def item_list_ok
    if !current_item_enabled?
      Sound.play_buzzer
      @window_itemlist.activate
      return
    end
    Sound.play_ok
    current_item = @window_itemlist.items[@window_itemlist.index]? @window_itemlist.items[@window_itemlist.index] : nil
    return if current_item == nil
    #msgbox(current_item.name)         #测试 结果 正确
    @window_itemlist.active = false
   
    if current_item.scope == 7              #物品使用范围为我方单体
      @window_useitem = Window_SelectActor.new(current_item)
      @window_useitem.set_handler(:cancel     ,method(:select_actor_cancel))
      @window_useitem.set_handler(:ok         ,method(:select_actor_ok))
      @window_useitem.select(@useitem_last_select)
      @window_useitem.activate
    elsif current_item.scope == 8           #物品使用范围为我方全体
      use_item($game_party.members[0],current_item)
      @window_itemlist.activate
    end
  end
 
  #当前物品是否可用?
  def current_item_enabled?
    $game_party.usable?(@window_itemlist.items[@window_itemlist.index])
  end
 
  #物品分类列表,光标移动时的处理
  def refresh_itemclslist_moved
    @itemclslist_last_select = @window_itemclslist.index
   
    @window_classtip.set_text("物品:"+(@window_itemclslist.have_classes[@window_itemclslist.index] != nil ? @window_itemclslist.have_classes[@window_itemclslist.index] : ""))
   
    @window_itemlist.make_item_list(@window_itemclslist.have_classes[@window_itemclslist.index])
  end
 
  #物品列表,光标移动时的处理
  def refresh_itemlist_moved
    @window_itemdesc.set_text(@window_itemlist.items[@window_itemlist.index]? @window_itemlist.items[@window_itemlist.index].description : "")
  end
 
  #选择角色的窗口内按下取消键
  def select_actor_cancel
    Sound.play_cancel
    @window_useitem.close
   
    @window_itemlist.activate
  end
 
  #选择角色的窗口内按下确定键
  def select_actor_ok
    @useitem_last_select = @window_useitem.index
    @window_useitem.activate
    user = $game_party.members[@window_useitem.index]
    item = @window_useitem.cur_item
    use_item(user,item)
  end
 
  #下面三个方法是从Scene_ItemBase里面复制来的 \(^o^)/~ 略做改动
  def item_target_actors(item)
    if !item.for_friend?
      []
    elsif item.for_all?
      $game_party.members
    else
      [$game_party.members[@window_useitem.index]]
    end
  end
  def use_item_to_actors(user,item)
    item_target_actors(item).each do |target|
      item.repeats.times { target.item_apply(user, item) }
    end
  end
  def use_item(user,item)
    Sound.play_use_item
    user.use_item(item)
    use_item_to_actors(user,item)
    check_common_event
    check_gameover
    @window_useitem.refresh if @window_useitem != nil && @window_useitem.open?
    @window_itemclslist.refresh_list
    @window_itemlist.refresh_list
  end
 
  def check_common_event
    SceneManager.goto(Scene_Map) if $game_temp.common_event_reserved?
  end
 
  def update
    super
    if @window_itemclslist.active &&(Input.trigger?(:UP) || Input.trigger?(:DOWN))
      @window_itemclslist.call_handler(:moved)
    end
    if @window_itemlist.active &&(Input.trigger?(:UP) || Input.trigger?(:DOWN))
      @window_itemlist.call_handler(:moved)
    end
  end
end


#-----------------------
end   #命名空间结束
#-----------------------


鸡蛋

鲜花

全部作者的其他最新日志

评论 (0 个评论)

facelist doodle 涂鸦笔

您需要登录后才可以评论 登录 | 注册会员

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

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

GMT+8, 2024-4-26 01:57

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

返回顶部