搜索附件  
同能RPG制作大师 附件中心 同能RM技术讨论区 RPG Maker XP 讨论区 gonglinyuan版物品分类系统(一个物品可同时在多个类别中): d1.jpg

gonglinyuan版物品分类系统(一个物品可同时在多个类别中): d1.jpg

 

gonglinyuan版物品分类系统(一个物品可同时在多个类别中):
现在站上的物品分类脚本主要有自动分类(根据能否使用等物品特性分类)和手动分类(通过在物品说明、物品名称后加后缀实现分类)
这两种分类方式各有千秋。
学习了一些脚本之后,我也自己尝试编写了一个物品分类脚本,
它通过物品的属性进行分类(具体见截图和范例)
因此一个物品可以同时被分到多个类中
由于是第一次发布脚本,难免有BUG,望大家及时指正。

鸣谢:@癫狂侠客 的《脚本不是高手的专利》系列教程,如果有人想要学习脚本,可以去看看

现在发脚本的人越来越少了,是大家都会了,还是。。

截图:




RUBY 代码
  1. #==============================================================================
  2. # ■ 物品手动分类 By gonglinyuan
  3. #==============================================================================
  4. #==============================================================================
  5. # 以下是用户设定区
  6. #==============================================================================
  7. # 物品分类表;最后两个分别是武器和防具,不要动
  8. $Item_Sort_Table = ["道具类","剧情类","武器类","防具类"]
  9. # 设定用于物品分类的第一个属性,默认是从17号属性开始
  10. $Item_Sort_Start = 17
  11. #==============================================================================
  12. # 物品的类别数目(不要动)
  13. $Item_Sort_Size = $Item_Sort_Table.size - 2
  14. #==============================================================================
  15. # ■ Scene_Item
  16. #------------------------------------------------------------------------------
  17. #  处理物品画面的类。
  18. #==============================================================================
  19. class Scene_Item
  20.   #--------------------------------------------------------------------------
  21.   # ● 主处理
  22.   #--------------------------------------------------------------------------
  23.   def main
  24.     # 生成帮助窗口、物品窗口
  25.     @help_window = Window_Help.new
  26.     @item_window = Window_MenuItem.new
  27.     @item_window.active = false
  28.     @item_window.index = -1
  29.     # 生成分类窗口
  30.     @sort_window = Window_Command.new(160,$Item_Sort_Table)
  31.     @sort_window.y = 64
  32.     @sort_window.active = true
  33.     # 生成金钱窗口
  34.     @gold_window = Window_Gold.new
  35.     @gold_window.x = 0
  36.     @gold_window.y = 416
  37.     # 关联帮助窗口
  38.     @item_window.help_window = @help_window
  39.     # 生成目标窗口 (设置为不可见・不活动)
  40.     @target_window = Window_Target.new
  41.     @target_window.visible = false
  42.     @target_window.active = false
  43.     # 执行过度
  44.     Graphics.transition
  45.     # 主循环
  46.     loopdo
  47.       # 刷新游戏画面
  48.       Graphics.update
  49.       # 刷新输入信息
  50.       Input.update
  51.       # 刷新画面
  52.       update
  53.       # 如果画面切换就中断循环
  54.       if$scene != self
  55.         break
  56.       end
  57.     end
  58.     # 装备过渡
  59.     Graphics.freeze
  60.     # 释放窗口
  61.     @help_window.dispose
  62.     @item_window.dispose
  63.     @target_window.dispose
  64.     @sort_window.dispose
  65.     @gold_window.dispose
  66.   end
  67.   #--------------------------------------------------------------------------
  68.   # ● 刷新画面
  69.   #--------------------------------------------------------------------------
  70.   def update
  71.     # 刷新窗口
  72.     @help_window.update
  73.     @item_window.update
  74.     @target_window.update
  75.     @sort_window.update
  76.     @gold_window.update
  77.     # 分类窗口被激活的情况下: 调用 update_sort
  78.     if@sort_window.active
  79.       update_sort
  80.       return
  81.     end
  82.     # 物品窗口被激活的情况下: 调用 update_item
  83.     if@item_window.active
  84.       update_item
  85.       return
  86.     end
  87.     # 目标窗口被激活的情况下: 调用 update_target
  88.     if@target_window.active
  89.       update_target
  90.       return
  91.     end
  92.   end
  93.   #--------------------------------------------------------------------------
  94.   # ● 刷新画面 (分类窗口被激活的情况下)
  95.   #--------------------------------------------------------------------------
  96.   def update_sort
  97.     if Input.trigger?(Input::B)
  98.       # 演奏取消 SE
  99.       $game_system.se_play($data_system.cancel_se)
  100.       # 切换到菜单画面
  101.       $scene = Scene_Menu.new(0)
  102.       return
  103.     end
  104.     if Input.trigger?(Input::C)
  105.       # 演奏确定 SE
  106.       $game_system.se_play($data_system.decision_se)
  107.       # 激活物品窗口
  108.       @sort_window.active = false
  109.       @item_window.active = true
  110.       @item_window.index = 0
  111.       @item_window.set_kind(@sort_window.index)
  112.       @item_window.refresh
  113.     end
  114.   end
  115.   #--------------------------------------------------------------------------
  116.   # ● 刷新画面 (物品窗口被激活的情况下)
  117.   #--------------------------------------------------------------------------
  118.   def update_item
  119.     # 按下 B 键的情况下
  120.     if Input.trigger?(Input::B)
  121.       # 演奏取消 SE
  122.       $game_system.se_play($data_system.cancel_se)
  123.       # 清空物品窗口
  124.       if@item_window.contents != nil
  125.         @item_window.contents.dispose
  126.         @item_window.contents = nil
  127.       end
  128.       # 激活分类窗口
  129.       @item_window.active = false
  130.       @item_window.index = -1
  131.       @item_window.set_kind(-1)
  132.       @sort_window.active = true
  133.       return
  134.     end
  135.     # 按下 C 键的情况下
  136.     if Input.trigger?(Input::C)
  137.       # 获取物品窗口当前选中的物品数据
  138.       @item = @item_window.item
  139.       # 不使用物品的情况下
  140.       unless@item.is_a?(RPG::Item)
  141.         # 演奏冻结 SE
  142.         $game_system.se_play($data_system.buzzer_se)
  143.         return
  144.       end
  145.       # 不能使用的情况下
  146.       unless$game_party.item_can_use?(@item.id)
  147.         # 演奏冻结 SE
  148.         $game_system.se_play($data_system.buzzer_se)
  149.         return
  150.       end
  151.       # 演奏确定 SE
  152.       $game_system.se_play($data_system.decision_se)
  153.       # 效果范围是我方的情况下
  154.       if@item.scope >= 3
  155.         # 激活目标窗口
  156.         @item_window.active = false
  157.         @target_window.x = (@item_window.index + 1) % 2 * 304
  158.         @target_window.visible = true
  159.         @target_window.active = true
  160.         # 设置效果范围 (单体/全体) 的对应光标位置
  161.         if@item.scope == 4 || @item.scope == 6
  162.           @target_window.index = -1
  163.         else
  164.           @target_window.index = 0
  165.         end
  166.       # 效果在我方以外的情况下
  167.       else
  168.         # 公共事件 ID 有效的情况下
  169.         if@item.common_event_id > 0
  170.           # 预约调用公共事件
  171.           $game_temp.common_event_id = @item.common_event_id
  172.           # 演奏物品使用时的 SE
  173.           $game_system.se_play(@item.menu_se)
  174.           # 消耗品的情况下
  175.           if@item.consumable
  176.             # 使用的物品数减 1
  177.             $game_party.lose_item(@item.id, 1)
  178.             # 再描绘物品窗口的项目
  179.             @item_window.draw_item(@item_window.index)
  180.           end
  181.           # 切换到地图画面
  182.           $scene = Scene_Map.new
  183.           return
  184.         end
  185.       end
  186.       return
  187.     end
  188.   end
  189. end
  190. #==============================================================================
  191. # ■ Window_MenuItem
  192. #------------------------------------------------------------------------------
  193. #  物品画面显示浏览物品的窗口。
  194. #==============================================================================
  195. class Window_MenuItem < Window_Selectable
  196.   #--------------------------------------------------------------------------
  197.   # ● 初始化对像
  198.   #--------------------------------------------------------------------------
  199.   def initialize
  200.     super(160, 64, 480, 416)
  201.     @column_max = 2
  202.     self.index = 0
  203.     @data = []
  204.     @kind = -1# 0 = 物品;1 = 武器;2 = 防具
  205.     refresh
  206.   end
  207.   #--------------------------------------------------------------------------
  208.   # ● 设置物品种类
  209.   #--------------------------------------------------------------------------
  210.   def set_kind(item_kind)
  211.     @kind = item_kind
  212.   end
  213.   #--------------------------------------------------------------------------
  214.   # ● 获取物品
  215.   #--------------------------------------------------------------------------
  216.   def item
  217.     return@data[self.index]
  218.   end
  219.   #--------------------------------------------------------------------------
  220.   # ● 刷新
  221.   #--------------------------------------------------------------------------
  222.   def refresh
  223.     ifself.contents != nil
  224.       self.contents.dispose
  225.       self.contents = nil
  226.     end
  227.     @data = []
  228.     # 添加物品
  229.     case@kind
  230.     when0...$Item_Sort_Size
  231.       for i in1...$data_items.size
  232.         if$data_items[i].element_set.include?($Item_Sort_Start + @kind)
  233.           if$game_party.item_number(i) > 0
  234.             @data.push($data_items[i])
  235.           end
  236.         end
  237.       end
  238.     when$Item_Sort_Size
  239.       for i in1...$data_weapons.size
  240.         if$game_party.weapon_number(i) > 0
  241.           @data.push($data_weapons[i])
  242.         end
  243.       end
  244.     when$Item_Sort_Size + 1
  245.       for i in1...$data_armors.size
  246.         if$game_party.armor_number(i) > 0
  247.           @data.push($data_armors[i])
  248.         end
  249.       end
  250.     end
  251.     # 如果项目数不是 0 就生成位图、重新描绘全部项目
  252.     @item_max = @data.size
  253.     if@item_max > 0
  254.       self.contents = Bitmap.new(width - 32, row_max * 32)
  255.       for i in0...@item_max
  256.         draw_item(i)
  257.       end
  258.     end
  259.   end
  260.   #--------------------------------------------------------------------------
  261.   # ● 描绘项目
  262.   #     index : 项目编号
  263.   #--------------------------------------------------------------------------
  264.   def draw_item(index)
  265.     item = @data[index]
  266.     case item
  267.     whenRPG::Item
  268.       number = $game_party.item_number(item.id)
  269.     whenRPG::Weapon
  270.       number = $game_party.weapon_number(item.id)
  271.     whenRPG::Armor
  272.       number = $game_party.armor_number(item.id)
  273.     end
  274.     if item.is_a?(RPG::Item)and
  275.        $game_party.item_can_use?(item.id)
  276.       self.contents.font.color = normal_color
  277.     else
  278.       self.contents.font.color = disabled_color
  279.     end
  280.     x = 4 + index % 2 * 240
  281.     y = index / 2 * 32
  282.     rect = Rect.new(x, y, self.width / @column_max - 32, 32)
  283.     self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
  284.     bitmap = RPG::Cache.icon(item.icon_name)
  285.     opacity = self.contents.font.color == normal_color ? 255 : 128
  286.     self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
  287.     self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
  288.     self.contents.draw_text(x + 160, y, 16, 32, ":", 1)
  289.     self.contents.draw_text(x + 176, y, 24, 32, number.to_s, 2)
  290.   end
  291.   #--------------------------------------------------------------------------
  292.   # ● 刷新帮助文本
  293.   #--------------------------------------------------------------------------
  294.   def update_help
  295.     @help_window.set_text(self.item == nil ? "" : self.item.description)
  296.   end
  297. end
复制代码

             本帖来自P1论坛作者gonglinyuan,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=328345  若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
gonglinyuan版物品分类系统(一个物品可同时在多个类别中): d1.jpg
Loading...

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

GMT+8, 2024-11-24 06:27 , Processed in 0.049857 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

返回顶部