Project1

标题: 怎么样使一些物品,在物品栏里面不会出现? [打印本页]

作者: 煌龙的夜袭    时间: 2012-9-25 23:02
标题: 怎么样使一些物品,在物品栏里面不会出现?
本帖最后由 delv25 于 2012-9-27 13:49 编辑

有一些物品是用来触发剧情的……,在物品栏里堆起来很难看,所以问一下有没有什么办法让那些物品在物品栏里也不显示。

我现在用的一个物品分类的脚本,不知道能不能修改使用。


#==============================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#==============================================================================

module RPG
  class Weapon
    def description
      description = @description.split(/@/)[0]
      return description != nil ? description : ''
    end
    def desc
      desc = @description.split(/@/)[1]
      return desc != nil ? desc : "普通物品"
    end
  end
  class Item
    def description
      description = @description.split(/@/)[0]
      return description != nil ? description : ''
    end
    def desc
      desc = @description.split(/@/)[1]
      return desc != nil ? desc : "普通物品"
    end
  end
  class Armor
    def description
      description = @description.split(/@/)[0]
      return description != nil ? description : ''
    end
    def desc
      desc = @description.split(/@/)[1]
      return desc != nil ? desc : "普通物品"
    end
  end
end

class Harts_Window_ItemTitle < Window_Base
  def initialize
    super(0, 0, 160, 64)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.contents.clear
    self.contents.font.color = normal_color
    self.contents.draw_text(4, 0, 120, 32, Vocab::item, 1)
  end
end

class Harts_Window_ItemCommand < Window_Selectable
  attr_accessor :commands
  def initialize
    super(0, 64, 160, 296)
    self.index = 0
    refresh
  end
  
def addcommand
   @commands = []
   for i in 1...$data_items.size
     if $game_party.item_number($data_items) > 0
       push = true
       for com in @commands
         if com == $data_items.desc
           push = false
         end
       end
       if push == true
         @commands.push($data_items.desc)
       end
     end
   end
   for i in 1...$data_weapons.size
     if $game_party.item_number($data_weapons) > 0
       push = true
       for com in @commands
         if com == $data_weapons.desc
           push = false
           end
         end
         if push == true
           @commands.push($data_weapons.desc)
         end
       end
     end
     for i in 1...$data_armors.size
       if $game_party.item_number($data_armors) > 0
         push = true
         for com in @commands
           if com == $data_armors.desc
             push = false
           end
         end
         if push == true
           @commands.push($data_armors.desc)
         end
       end
     end
     if @commands == []
       @commands.push("普通物品")
     end      
     @item_max = @commands.size
  end
  
def refresh
    addcommand
    create_contents
    for i in 0...@item_max
      draw_item(i, normal_color)
    end
  end
  
  def draw_item(index, color)
    y = index * WLH
    self.contents.font.color = color
    if @commands[index] != nil
      self.contents.draw_text(4,y, 172, WLH, @commands[index])
    end
  end

  def update_help
    @help_window.set_text(@commands[self.index])
  end
end

class Harts_Window_ItemList < Window_Selectable
  
  def initialize
    super(160, 0, 384, 360)
    self.index = 0
    refresh
  end
  
  def item
    return @data[self.index]
  end
  
  def refresh
    @data = []
  end
  
  def set_item(command)
    refresh
    for i in 1...$data_items.size
      if $game_party.item_number($data_items) > 0  and $data_items.desc == command
        @data.push($data_items)
      end
    end
    for i in 1...$data_weapons.size
      if $game_party.item_number($data_weapons) > 0  and $data_weapons.desc == command
        @data.push($data_weapons)
      end
    end
    for i in 1...$data_armors.size
      if $game_party.item_number($data_armors) > 0  and $data_armors.desc == command
        @data.push($data_armors)
      end
    end
    @item_max = @data.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * 32)
      self.contents.clear
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end
  
  def item_number
    return @item_max
  end
  
  def draw_item(index)
    rect = item_rect(index)
    self.contents.clear_rect(rect)
    item = @data[index]
    if item != nil
      number = $game_party.item_number(item)
      enabled = $game_party.item_can_use?(item)
      rect.width -= 4
      draw_item_name(item, rect.x, rect.y, enabled)
      self.contents.draw_text(rect, sprintf(":%2d", number), 2)
    end
  end
  
  def update_help
    @help_window.set_text(self.item == nil ? "" : self.item.description)
  end
end
class Harts_Window_Help < Window_Base
  
  def initialize
    super(0, 360, 544, WLH + 32)
  end

  def set_text(text, align = 0)
    if text != @text or align != @align
      self.contents.clear
      self.contents.font.color = normal_color
      self.contents.draw_text(4, 0, self.width - 40, WLH , text, align)
      @text = text
      @align = align
    end
  end
end

class Harts_Window_MenuStatus < Window_Selectable

  def initialize(x, y)
    super(x, y, 288, 416)
    refresh
    self.active = false
    self.index = -1
  end

  def refresh
    self.contents.clear
    @item_max = $game_party.members.size
    for actor in $game_party.members
      x = 8
      y = actor.index * 96 + WLH / 2
      draw_actor_name(actor, x, y)
      draw_actor_class(actor, x + 120, y)
      draw_actor_level(actor, x, y + WLH * 1)
      draw_actor_state(actor, x, y + WLH * 2)
      draw_actor_hp(actor, x + 120, y + WLH * 1)
      draw_actor_mp(actor, x + 120, y + WLH * 2)
    end
  end

  def update_cursor
    if @index < 0               
      self.cursor_rect.empty
    elsif @index < @item_max  
      self.cursor_rect.set(0, @index * 96, contents.width, 96)
    elsif @index >= 100        
      self.cursor_rect.set(0, (@index - 100) * 96, contents.width, 96)
    else                       
      self.cursor_rect.set(0, 0, contents.width, @item_max * 96)
    end
  end
end

class Scene_Item < Scene_Base
  def start
    super
    create_menu_background
    @viewport = Viewport.new(0, 0, 544, 416)
    @itemtitle_window = Harts_Window_ItemTitle.new
    @itemcommand_window = Harts_Window_ItemCommand.new
    @command_index = @itemcommand_window.index
    @itemcommand_window.refresh
    @itemlist_window = Harts_Window_ItemList.new
    @itemlist_window.active = false
    @help_window = Harts_Window_Help.new
    @help_window.viewport = @viewport
    @target_window = Harts_Window_MenuStatus.new(96, 0)
    @itemcommand_window.help_window = @help_window
    @itemlist_window.help_window = @help_window
    @itemlist_window.set_item(@itemcommand_window.commands[@command_index])
    hide_target_window
  end

  def terminate
    super
    dispose_menu_background
    @viewport.dispose
    @itemtitle_window.dispose
    @itemcommand_window.dispose
    @itemlist_window.dispose
    @help_window.dispose
    @target_window.dispose
  end

  def return_scene
    $scene = Scene_Menu.new(0)
  end

  def update
    super
    update_menu_background
    @help_window.update
    @itemlist_window.update
    @itemcommand_window.update
    @target_window.update
    @itemcommand_window.refresh
    if @command_index != @itemcommand_window.index
      @itemlist_window.index = 0
      @command_index = @itemcommand_window.index
      @itemcommand_window.update_help
      @itemlist_window.set_item(@itemcommand_window.commands[@command_index])
    end
    if @itemcommand_window.active
      @itemcommand_window.update_help
      update_itemcommand
    elsif @itemlist_window.active
      update_itemlist
    elsif @target_window.active
      update_target_selection
    end
  end

  def update_itemcommand
    if Input.trigger?(Input::B)
      Sound.play_cancel
      return_scene
      return
    end
    if Input.trigger?(Input::C)
      if @itemlist_window.item_number == 0
        Sound.play_buzzer
        return
      end
      Sound.play_decision
      @itemcommand_window.active = false
      @itemlist_window.index = 0
      @itemlist_window.active = true
      return
    end
  end

  def update_itemlist
    if Input.trigger?(Input::B)
      Sound.play_cancel
      @itemcommand_window.active = true
      @itemlist_window.active = false
      @itemcommand_window.index = @command_index
    elsif Input.trigger?(Input::C)
      @item = @itemlist_window.item
      if @item != nil
        $game_party.last_item_id = @item.id
      end
      if $game_party.item_can_use?(@item)
        Sound.play_decision
        determine_item
      else
        Sound.play_buzzer
      end
    end
  end

  def determine_item
    if @item.for_friend?
      show_target_window(@itemlist_window.index % 2 == 0)
      if @item.for_all?
        @target_window.index = 99
      else
        if $game_party.last_target_index < @target_window.item_max
          @target_window.index = $game_party.last_target_index
        else
          @target_window.index = 0
        end
      end
    else
      use_item_nontarget
    end
  end

  def update_target_selection
    if Input.trigger?(Input::B)
      Sound.play_cancel
      if $game_party.item_number(@item) == 0
        @itemlist_window.refresh                 
      end
      @itemlist_window.active = true
      @itemlist_window.set_item(@itemcommand_window.commands[@command_index])
      hide_target_window
      @itemlist_window.active = true
    elsif Input.trigger?(Input::C)
      if not $game_party.item_can_use?(@item)
        Sound.play_buzzer
      else
        determine_target
      end
    end
  end

  def determine_target
    used = false
    if @item.for_all?
      for target in $game_party.members
        target.item_effect(target, @item)
        used = true unless target.skipped
      end
    else
      $game_party.last_target_index = @target_window.index
      target = $game_party.members[@target_window.index]
      target.item_effect(target, @item)
      used = true unless target.skipped
    end
    if used
      use_item_nontarget
    else
      Sound.play_buzzer
    end
  end

  def show_target_window(right)
    @itemlist_window.active = false
    width_remain = 544 - @target_window.width
    @target_window.x = right ? width_remain : 0
    @target_window.visible = true
    @target_window.active = true
    if right
      @viewport.rect.set(0, 0, width_remain, 416)
      @viewport.ox = 0
    else
      @viewport.rect.set(@target_window.width, 0, width_remain, 416)
      @viewport.ox = @target_window.width
    end
  end

  def hide_target_window
    @target_window.visible = false
    @target_window.active = false
    @itemlist_window.set_item(@itemcommand_window.commands[@command_index])
    @viewport.rect.set(0, 0, 544, 416)
    @viewport.ox = 0
  end

  def use_item_nontarget
    Sound.play_use_item
    $game_party.consume_item(@item)
    @itemlist_window.draw_item(@itemlist_window.index)
    @itemlist_window.set_item(@itemcommand_window.commands[@command_index])
    @target_window.refresh
    if $game_party.all_dead?
      $scene = Scene_Gameover.new
    elsif @item.common_event_id > 0
      $game_temp.common_event_id = @item.common_event_id
      $scene = Scene_Map.new
    end
  end
end

#==============================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#==============================================================================

作者: feizhaodan    时间: 2012-9-25 23:02
本帖最后由 feizhaodan 于 2012-9-26 18:46 编辑

请使用
  1. [code][\code]
复制代码
把脚本包上。不然都被转换成论坛代码了囧

  1. def set_item(command)
  2.     refresh
  3.     for i in 1...$data_items.size
  4.       if $game_party.item_number($data_items[i]) > 0  and $data_items[i].desc == command
  5.         @data.push($data_items[i]) unless $data_items[i].note.match("<剧情物品>")
  6.       end
  7.     end
  8.     for i in 1...$data_weapons.size
  9.       if $game_party.item_number($data_weapons[i]) > 0  and $data_weapons[i].desc == command
  10.         @data.push($data_weapons[i]) unless $data_weapons[i].note.match("<剧情物品>")
  11.       end
  12.     end
  13.     for i in 1...$data_armors.size
  14.       if $game_party.item_number($data_armors[i]) > 0  and $data_armors[i].desc == command
  15.         @data.push($data_armors[i]) unless $data_armors[i].note.match("<剧情物品>")
  16.       end
  17.     end
  18.     @item_max = @data.size
  19.     if @item_max > 0
  20.       self.contents = Bitmap.new(width - 32, row_max * 32)
  21.       self.contents.clear
  22.       for i in 0...@item_max
  23.         draw_item(i)
  24.       end
  25.     end
  26.   end
复制代码
覆盖掉原来的脚本的相同部分(def set_item(command))
然后,在不想让他显示的道具的备注部分输入
  1. <剧情物品>
复制代码

作者: a364774426    时间: 2012-9-25 23:25
这简单啊,不设置物品,给一个标记开关就可以了。
作者: 煌龙的夜袭    时间: 2012-9-26 00:27
a364774426 发表于 2012-9-25 23:25
这简单啊,不设置物品,给一个标记开关就可以了。

主要是已经设置物品了……大概有两百多个吧。。重新去改太累了。
作者: 怪蜀黍    时间: 2012-9-26 10:35
不显示也有弊端,比如已经得到了剧情物品,却没有显示,还以为没得到呢。
可以考虑添加一个类,叫做“剧情道具”,把所有剧情道具放到该类即可。
还有,这次的奖励很丰厚,问题又极容易,所以依旧是留给大家解答。
作者: 煌龙的夜袭    时间: 2012-9-26 10:39
protosssonny 发表于 2012-9-26 10:35
不显示也有弊端,比如已经得到了剧情物品,却没有显示,还以为没得到呢。
可以考虑添加一个类,叫 ...

说起来我确实是有这样的脚本。。只要加 @剧情道具,就可以了……其实也不是剧情道具,是类似于开关一样启动事件的
作者: 怪蜀黍    时间: 2012-9-26 10:47
煌龙的夜袭 发表于 2012-9-26 10:39
说起来我确实是有这样的脚本。。只要加 @剧情道具,就可以了……其实也不是剧情道具,是类似于开 ...

P叔只是建议,如果你坚持要“让那些物品在物品栏里也不显示”,那改起来也是相当简单的。主要是你悬赏了那么多,P叔就不回答了,毕竟P叔已经有那么多积分了,所以还是留给大家好了
@a364774426是很热心的高手,LZ可以向他请求帮助。
如果3天之后问题依然没解决,LZ可以再让P叔来回答。不过这基本是不可能的
作者: 煌龙的夜袭    时间: 2012-9-26 10:51
protosssonny 发表于 2012-9-26 10:47
P叔只是建议,如果你坚持要“让那些物品在物品栏里也不显示”,那改起来也是相当简单的。主要是你悬赏了 ...

那我把悬赏改了你就会回答了是不是= =!
作者: zhengxinwu    时间: 2012-9-26 18:13
触发剧情 不一定值能用物品啊
那只是之一啊
开关啊 变量开关啊 都可以用的
如果是必须用到物品...
不过鄙人也没觉得难看啊
事件道具不是很正常的东西 至于要不要留下来
事件完成后会不会收 不是作者自己说的算
如果只是难看 东西多 又有事件道具收集癖
那道具分类是能用到的 那是老脚本了 而且分类什么的 脚本白痴研究一会都会
直接弄一类事件道具 物品备注里 关键词填上
世界和平了...
作者: 煌龙的夜袭    时间: 2012-9-27 17:21
feizhaodan 发表于 2012-9-26 01:02
请使用把脚本包上。不然都被转换成论坛代码了囧

覆盖掉原来的脚本的相同部分(def set_item(command)) ...

替换了,但是还是不行……
作者: feizhaodan    时间: 2012-9-27 17:26
煌龙的夜袭 发表于 2012-9-27 17:21
替换了,但是还是不行……
  1. class Harts_Window_ItemList < Window_Selectable
  2. def set_item(command)
  3.     refresh
  4.     for i in 1...$data_items.size
  5.       if $game_party.item_number($data_items[i]) > 0  and $data_items[i].desc == command
  6.         @data.push($data_items[i]) unless $data_items[i].note.match("<剧情物品>")
  7.       end
  8.     end
  9.     for i in 1...$data_weapons.size
  10.       if $game_party.item_number($data_weapons[i]) > 0  and $data_weapons[i].desc == command
  11.         @data.push($data_weapons[i]) unless $data_weapons[i].note.match("<剧情物品>")
  12.       end
  13.     end
  14.     for i in 1...$data_armors.size
  15.       if $game_party.item_number($data_armors[i]) > 0  and $data_armors[i].desc == command
  16.         @data.push($data_armors[i]) unless $data_armors[i].note.match("<剧情物品>")
  17.       end
  18.     end
  19.     @item_max = @data.size
  20.     if @item_max > 0
  21.       self.contents = Bitmap.new(width - 32, row_max * 32)
  22.       self.contents.clear
  23.       for i in 0...@item_max
  24.         draw_item(i)
  25.       end
  26.     end
  27.   end
  28. end
复制代码
做了个直接插入的版本。要放到那个脚本下面。
注意不是往名字上添加@剧情物品
而是往备注里添加<剧情物品>(包括<>)
作者: 煌龙的夜袭    时间: 2012-9-27 17:41
feizhaodan 发表于 2012-9-27 19:26
做了个直接插入的版本。要放到那个脚本下面。
注意不是往名字上添加@剧情物品
而是往备注里添加(包括) ...

恩。我试试看
作者: 煌龙的夜袭    时间: 2012-9-27 18:02
feizhaodan 发表于 2012-9-27 19:26
做了个直接插入的版本。要放到那个脚本下面。
注意不是往名字上添加@剧情物品
而是往备注里添加(包括) ...

好像可以了,不过在商店里卖东西的时候还会显示出来。。不过没关系,我把剧情物品都搞成无法卖的了

作者: 怪蜀黍    时间: 2012-9-27 19:22
本帖最后由 protosssonny 于 2012-9-27 19:27 编辑
煌龙的夜袭 发表于 2012-9-27 18:02
好像可以了,不过在商店里卖东西的时候还会显示出来。。不过没关系,我把剧情物品都搞成无法卖的了
...


嗷呜,P叔来吃点剩菜剩饭让这个问题完美解决,顺便帮助feizhaodan分担部分压力。
DE君@delv25尼桑@Luciffer,赏点吃的吧,好饿呀
其实商店不显示出来也容易的,找到Window_ShopSell类下的def include?(item)改成这样即可:
  1.   #--------------------------------------------------------------------------
  2.   # ● 判断是否为商品
  3.   #     item : 项目
  4.   #--------------------------------------------------------------------------
  5.   def include?(item)
  6.     case item
  7.     when RPG::Item
  8.       return item != nil unless $data_items[item.id].note.match("<剧情物品>")
  9.     when RPG::Weapon
  10.       return item != nil unless $data_weapons[item.id].note.match("<剧情物品>")
  11.     when RPG::Armor
  12.       return item != nil unless $data_armors[item.id].note.match("<剧情物品>")
  13.     end  
  14.   end
复制代码

作者: 煌龙的夜袭    时间: 2012-9-27 19:39
protosssonny 发表于 2012-9-27 21:22
嗷呜,P叔来吃点剩菜剩饭让这个问题完美解决,顺便帮助feizhaodan分担部分压力。
DE君@delv25尼 ...

Soga原来有方法哈哈哈,3Q




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1