设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 5259|回复: 11

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

[复制链接]

Lv1.梦旅人

梦石
0
星屑
60
在线时间
705 小时
注册时间
2007-12-23
帖子
874
发表于 2013-8-20 14:17:43 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 gonglinyuan 于 2013-8-20 14:45 编辑

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

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

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

截图:
1.png
2.png
3.png

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

ItemSortByGonglinyuan.rar

350.99 KB, 下载次数: 148

评分

参与人数 2星屑 +165 收起 理由
feizhaodan + 120 下次可以挑战使用alias减少冲突。虽然XP很.
end55rpg + 45 塞糖,目测lz可以写出更简洁兼容更强的代码.

查看全部评分

买了正版RMMV的同学进来看一下,谢谢~
https://rpg.blue/thread-393237-1-1.html

Lv1.梦旅人

梦石
0
星屑
49
在线时间
7 小时
注册时间
2013-8-7
帖子
32
发表于 2013-8-21 17:21:38 | 显示全部楼层
对了,脚本怎么做你们知道吧。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
76
在线时间
1379 小时
注册时间
2012-7-5
帖子
1698

开拓者

发表于 2013-8-22 15:28:24 | 显示全部楼层
LS纯水吧。。。
有关脚本的教程确实塞满了,,很多人都会改脚本。
话说我也是纯水么。。

  -fk: -azogi:
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9273
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

发表于 2013-8-22 15:59:53 | 显示全部楼层
其实还有比这种更好的= =
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
60
在线时间
705 小时
注册时间
2007-12-23
帖子
874
 楼主| 发表于 2013-8-22 16:08:25 | 显示全部楼层
chd114 发表于 2013-8-22 15:59
其实还有比这种更好的= =

汗。。。。
本来就是新手练习,
还没达到登峰造极的地步吧。。
买了正版RMMV的同学进来看一下,谢谢~
https://rpg.blue/thread-393237-1-1.html
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9273
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

发表于 2013-8-22 16:14:30 | 显示全部楼层
gonglinyuan 发表于 2013-8-22 16:08
汗。。。。
本来就是新手练习,
还没达到登峰造极的地步吧。。

基本上新手练习作都是这个布局= =万年不变啊
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
136 小时
注册时间
2012-7-25
帖子
339
发表于 2013-8-25 19:57:25 | 显示全部楼层
chd114 发表于 2013-8-22 16:14
基本上新手练习作都是这个布局= =万年不变啊

LZ好厉害……话说这位仁兄怎么跟我在同一个网吧……
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9273
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

发表于 2013-8-25 20:36:08 | 显示全部楼层
玄胄武甲 发表于 2013-8-25 19:57
LZ好厉害……话说这位仁兄怎么跟我在同一个网吧……

我在家里···你在哪个网吧?
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
136 小时
注册时间
2012-7-25
帖子
339
发表于 2013-8-26 19:05:55 | 显示全部楼层
chd114 发表于 2013-8-25 20:36
我在家里···你在哪个网吧?

之前你签名档那个,凤凰路的浪漫满屋
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9273
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

发表于 2013-8-26 19:29:33 | 显示全部楼层
玄胄武甲 发表于 2013-8-26 19:05
之前你签名档那个,凤凰路的浪漫满屋

重庆长寿凤凰路?我没找到这个地方···
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-3-29 19:13

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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