查看: 98|回复: 0

[转载发布] gonglinyuan版物品分类系统(一个物品可同时在多个类别中)

[复制链接]
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 37 天

    连续签到: 3 天

    [LV.5]常住居民I

    2028

    主题

    32

    回帖

    7260

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    0
    卡币
    5184
    OK点
    16
    积分
    7260
    发表于 同元一千年八月四日(秋) | 显示全部楼层 |阅读模式
    现在站上的物品分类脚本主要有自动分类(根据能否使用等物品特性分类)和手动分类(通过在物品说明、物品名称后加后缀实现分类)
    这两种分类方式各有千秋。
    学习了一些脚本之后,我也自己尝试编写了一个物品分类脚本,
    它通过物品的属性进行分类(具体见截图和范例)
    因此一个物品可以同时被分到多个类中
    由于是第一次发布脚本,难免有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在线咨询功能删除,谢谢。

    本帖子中包含更多资源

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

    x
    天天去同能,天天有童年!
    回复 论坛版权

    使用道具 举报

    ahome_bigavatar:guest
    ahome_bigavatar:welcomelogin
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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

    GMT+8, 2024-5-13 14:18 , Processed in 0.049748 second(s), 44 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

    快速回复 返回顶部 返回列表