Project1

标题: 【关于物品排列】大家一般用什么方法整理items排序 [打印本页]

作者: 纯属小虫    时间: 2023-4-27 15:31
标题: 【关于物品排列】大家一般用什么方法整理items排序
本帖最后由 纯属小虫 于 2023-4-27 15:32 编辑

XP的默认物品排序方式是按照 物品or技能 的id大小来依次排列的,
如果要在游戏中营造比较好的物品栏视觉效果,同类物品的相邻排序则显得十分重要


比如,如果要让消耗品排列在物品栏的最前端,那么就需要让消耗物品的ID排前,并且在游戏制作的时候就确定好可能的物品类型,如:药品、食品、宝石、皮毛。。。。。
如果处理得恰当,并且物品类型比较确定,那么在游戏中将会有比较好的排列效果,找物品的时候也相对容易。

不过,这种处理方式的缺点就是灵活性缺失。如果制作初期没有将数据库中的内容定好框架,或是在后期某一类型的物品过多,导致留空不足,就只能放在之后,没法按照始定的排列逻辑添加新品了。



如图,我在制作之初忘记给数据库留出足够的空位来放置同类武器。如果我还想添加新的匕首类武器,那便只能在后面的数据库添加,游戏背包中匕首类武器的位置便不是相邻的,如果背包里的武器很多,那找武器将是一件很头疼的事。


处理物品排列最简单的方式莫过于使用背包分类脚本了
为每一件物品定义类型,那么在类型背包中,同类的物品自然会被排列在一起;此外,有分类标签的加持,找物品将是一件很简单的事情。数据库中添加新物品的时候也不用太过考虑顺序的问题了。
物品分类脚本——复制自RMXP图书馆


对于技能而言,也是同理。当角色技能过多时,可以将技能分类为  【回复】 【进攻】 【加持】 等...

但是,分类能够解决整体问题,却没办法解决更细致的问题。
比如,我将背包分为了 【素材】【消耗品】【情报】【武器】【头盔】【护甲】【饰品】....
但事实上,【素材】里还有 (宝石)(植物)(皮革)......   【武器】里还有(匕首)(剑)(钝器).....
如果把大类再进行子类划分,则会显得很复杂。而且在名字后面添加一个类别备注已经很麻烦了,如果再添加一个子类备注,想想就头疼。

或许,我们便可以找到跟物品排序直接关联的脚本,在窗口中的items描绘上对其直接篡改:

以 背包 窗口  为例


for i in 1...$data_items.size
意思是从 1 开始检索,检索到items数据库的末尾,将数量>0的物品进行描绘

我们可以使用一种简单粗暴的方法,在脚本中手写数组,直接让物品强行按照我们所写的id号来进行先后排列::
强排


直接手写的方式简单粗暴,直接把要相邻放置的物品ID填写在一个个数组里即可,且顺序完全可控。脚本后文添加防漏代入,也能够避免强排过程中漏填物品导致背包中的物品消失。
而麻烦点也显而易见,那就是填入排列数组时,每一个物品都得手动添加,如果物品不是相邻的,那还得到数据库一个一个找ID号,然后一个一个填入。


后面有几种别的排列方法我没有实际落入脚本当中,不过可能也具有一定的可行性。
1、按照@data 中item的各种字段属性进行排序;可以是其中对象的 name 的首字母 (这个太粗暴了),name的字数(看起来很舒服,但逻辑上没啥关系)
2、按照item名称中的关键字进行排序;比如,如果物品的名称含有“宝石”,那么就将其排列在一起;含有“药水”,就将其排列在一起。(很方便,但是对物品的命名比较严格;毕竟同样是剑类武器,我可以叫它铜剑、铁剑,也可以叫它镇天、开天...)
3、按照item的描述中的关键词进行排序;比如,在描述的开头或结尾写上【药水】【宝石】【剑】【弓】...然后同上逻辑进行排列。
4、按照item的属性&属性防御进行排序;我新添加若干的【属性】,将序号>**的属性名字命名为【药水】【宝石】【剑】【弓】.....然后在对应处打勾就好了。排列时检索 该物品的属性中,序号>** 的属性中,哪个是打勾的,它就属于哪个类。然后依次同类合并排序


以上是本人对物品排序的理解和一些经验,欢迎大家讨论分享新的items排序方法和理念。
作者: 灯笼菜刀王    时间: 2023-4-27 15:51


让玩家自己排.....
作者: 灯笼菜刀王    时间: 2023-4-29 17:52
本帖最后由 灯笼菜刀王 于 2023-4-29 17:55 编辑

物品分类是一个挺好的做法,  而且二级菜单也没啥, 以上下左右的方式来进行一二级菜单的切换即可减少操作



不过, 物品分类有一个雷区, 即: 玩家不知道你是根据啥来分类

毕竟每个人的"常识"不同,  像琥珀, 你认为它是"宝石"还是"矿物" 笑。

这种"常识差异"就会导致刚开始玩时根本不知道我拿到什么玩意~ 鬼知道你把它丢在哪个分类里, 尤其是分类项目固定显示的时候。 这里要点名批评下《军官之歌》, 它的技能分类固定显示5个, 不一个一个去翻你根本不知道角色会啥技能,  结果呢, 我打到第二章才发现, 原来主角会恢复法术啊......

因此, 分类虽然方便,但是能不用尽量别用最好, 毕竟它会造成玩家额外的记忆负担, 包包技能打开有什么东西一目了然多清爽, 笑

至于分类设置, 备注法最普遍的, 而我更推荐"自动分类法" 就是去定义下分类规则, 例如 recover_hp/sp_rate或者recover_hp/sp 不为0 就自动分到"恢复品"类去, 负数就自动分类到"攻击道具"里, parameter_type > 0 就分类到"强化药品" 里 这样, 自动分类的好处就是不至于受"你设置道具时的主观想法影响"

另外, "属性标志法"要注意, XP默认的伤害结算公式, 复数属性修正系数取最高值哦

---

除了分类法和玩家自己去排法, 我还用过三个方法
1, 给道具定义个"序号", 然后显示的时候按序号sort 。这样数据库怎么塞都不会影响物品界面的整齐了,笑   缺点是数据库强迫症患者不爽, 笑

2, 常数法:  直接把每个道具的ID用常数对应, 获取道具, 判断道具时全部写常数, 这样,当需要改变道具ID的时候, 去把对应的常数换一下即可, 不用去返工旧工程, 妈妈再也不用担心我预留的位置不够用了,笑   缺点是涉及道具ID的地方要用脚本写, 不能一键点事件

3, 直接抛弃数据库, 用脚本或者TXT来输入数据, 一了百了, 优点是直接解决了排序,破限,数值限制,参数不够,碍手碍脚等问题, 笑, 缺点是比较不好浏览

目前我采用的做法是 3
这样设置道具

作者: 89444640    时间: 2023-4-30 16:16
本帖最后由 89444640 于 2023-4-30 16:19 编辑

很难不手欠扩充道具,除非规划好后绝对不动了,只减少不增加
要嘛就跟脚本里单独弄个地方去处理排列。
当然要用默认的道具取得方式,还是种类效果接近的道具放一起更方便。
直接用脚本获得道具好处就是,道具一旦过多,不用每次都拉那个大长条去选择,直接 获得 脚本“获得\D[I]草药*3”就行了,效率高
然后我觉得其实也可以给玩家一个自定义功能,比如爱用
单独列个条目顺序在新品后面,然后爱用的道具 比如草药就可以放这里,比如有人喜欢打个怪就换把武器 没关系,爱用——武器、爱用——防具


作者: soulsaga    时间: 2023-4-30 17:20
本帖最后由 soulsaga 于 2023-4-30 17:21 编辑

用脚本定义物品数据库
用事件增减物品
@parameters[0]=你定义的道具名称
修改获得道具相关脚本
作者: 纯属小虫    时间: 2023-5-3 18:56
灯笼菜刀王 发表于 2023-4-29 17:52
物品分类是一个挺好的做法,  而且二级菜单也没啥, 以上下左右的方式来进行一二级菜单的切换即可减少操作

在物品分类中添加 【新品】和【全部】倒是能够改良找不到物品的问题。
话说,【新品】类的脚本要怎么写呀?新建一个对应所有物品的开关组,然后获取物品(gain_item)的时候把对应获取物品的开关打开吗?
作者: soulsaga    时间: 2023-5-3 19:10
纯属小虫 发表于 2023-5-3 18:56
在物品分类中添加 【新品】和【全部】倒是能够改良找不到物品的问题。
话说,【新品】类的脚本要怎么写呀 ...

89大大的工程已经有新品功能
你可以请教菜刀大大
作者: 微妙夏伤_    时间: 2025-7-7 14:27
大佬们问一下,我看了下,这里的代码把不能使用的物品归为特殊物品,我想自定义特殊物品怎么搞,就是把某些物品归类到特殊物品,但是一样可以使用
作者: 微妙夏伤_    时间: 2025-7-7 23:21
soulsaga 发表于 2023-5-3 19:10
89大大的工程已经有新品功能
你可以请教菜刀大大

大佬问一下,我看了下,这里的代码把不能使用的物品归为特殊物品,我想自定义特殊物品怎么搞,就是把某些物品归类到特殊物品,但是一样可以使用
作者: 灯笼菜刀王    时间: 2025-7-8 11:02
微妙夏伤_ 发表于 2025-7-7 23:21
大佬问一下,我看了下,这里的代码把不能使用的物品归为特殊物品,我想自定义特殊物品怎么搞,就是把某些 ...

把脚本 163 行替换成这一句

  1.         if ([10086,10087].include?(i) or $data_items[i].occasion == 3) and $game_party.item_number(i) > 0
复制代码


然后在10086, 10087的那个中括号里, 把10086,10087替换成你要当做特殊物品的id就行, 栗子 [1,2,3,4]  这样写就是1号到4号道具都是特殊物品, 不管它能不能使用
-
PS: 如果你需要更多"自定义分类"的功能, 可以找其他的脚本, 有那种完全自定义名称和分类的
作者: 微妙夏伤_    时间: 2025-7-8 13:06
灯笼菜刀王 发表于 2025-7-8 11:02
把脚本 163 行替换成这一句

谢谢大佬,不过我找deepseek解决了,他给的是这样的,不过你这个看起来更简单
  1. when 7  # 特殊物品分类
  2.       # 使用名称前缀识别特殊物品
  3.       special_prefix = "★"  # 自定义前缀符号
  4.       
  5.       # 检查物品
  6.       for i in 1...$data_items.size
  7.         item = $data_items[i]
  8.         if item && item.name.include?(special_prefix) && $game_party.item_number(i) > 0
  9.           @data.push(item)
  10.         end
  11.       end
  12.       
  13.       # 检查武器
  14.       for i in 1...$data_weapons.size
  15.         weapon = $data_weapons[i]
  16.         if weapon && weapon.name.include?(special_prefix) && $game_party.weapon_number(i) > 0
  17.           @data.push(weapon)
  18.         end
  19.       end
  20.       
  21.       # 检查防具
  22.       for i in 1...$data_armors.size
  23.         armor = $data_armors[i]
  24.         if armor && armor.name.include?(special_prefix) && $game_party.armor_number(i) > 0
  25.           @data.push(armor)
  26.         end
  27.       end
  28.     end
  29.     # 項目数が 0 でなければビットマップを作成し、全項目を描画
  30.     @item_max = @data.size
  31.     if @item_max > 0
  32.       self.contents = Bitmap.new(width - 32, row_max * 32)
  33.       self.contents.clear
  34.       for i in 0...@item_max
  35.         draw_item(i)
  36.       end
  37.     end
  38.   end

  39. 然后还有这一种

  40. class Harts_Window_ItemList < Window_Selectable
  41.   # 特殊物品ID列表 [类型, ID]
  42.   # 类型: 0=物品, 1=武器, 2=防具
  43.   SPECIAL_ITEMS = [
  44.     [0, 23],  # 物品ID 23
  45.     [0, 45],  # 物品ID 45
  46.     [1, 12],  # 武器ID 12
  47.     [2, 8]    # 防具ID 8
  48.   ]
  49.   
  50.   def set_item(command)
  51.     refresh
  52.     case command
  53.     # ... 其他分类保持不变 ...
  54.     when 7  # 特殊物品分类
  55.       SPECIAL_ITEMS.each do |type, id|
  56.         case type
  57.         when 0  # 物品
  58.           if $game_party.item_number(id) > 0
  59.             @data.push($data_items[id])
  60.           end
  61.         when 1  # 武器
  62.           if $game_party.weapon_number(id) > 0
  63.             @data.push($data_weapons[id])
  64.           end
  65.         when 2  # 防具
  66.           if $game_party.armor_number(id) > 0
  67.             @data.push($data_armors[id])
  68.           end
  69.         end
  70.       end
  71.     end
  72.     # ... 后续代码 ...
  73.   end
  74. end
复制代码





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