Project1

标题: 大家都是怎么解决物品排序问题的? [打印本页]

作者: zy652301    时间: 2017-7-16 21:37
标题: 大家都是怎么解决物品排序问题的?
RM系列一直都是用物品编号排的顺序。
如果事先不空出位置可能会造成位置不够顺序混乱的情况,
请问有能解决这个问题的技巧或者插件吗?
作者: sutao80216    时间: 2017-7-16 21:56
自定义生成持有物品列表的方法,按照你需要的规则排序。
作者: 铅笔描绘的思念    时间: 2017-7-16 23:01
首先有什么实际问题嘛。。其实关于排序的话对Window_Itemlist在makeItemList时对this._data的操作修改下就行了
作者: 574656549    时间: 2020-7-12 19:29
提示: 作者被禁止或删除 内容自动屏蔽
作者: 开关关    时间: 2020-7-13 09:25
物品排序确实是让人不爽的问题。

对于差异巨大的物品,一个比较简单粗暴的方式,就是楼主所说的留空,每种物品都留100个空,基本用不完,就是翻找起来麻烦点。

曾经有个思路,前提是游戏执行物品的操作全部放弃事件改用脚本。启动游戏时,遍历物品数据,以物品名称为键,物品对象为值,生成一个全新的物品数据键值对。调用物品数据时不使用id,而是使用物品名称。也可以用物品的其他属性作为键,非常灵活。这样一来,在编辑器数据库里就可以随意改变物品顺序而不影响游戏执行了。配合数据库里按Shift批量复制,可以使浏览变得非常方便。

纯事件党用不了上面的方法。如果编辑器能实现这样的功能就好了——可以在数据库调整物品顺序,并且所有该物品相关的事件也全部自动修改编号id。很多IDE都有这功能,可惜MV暂时没有(mvUCCU或许可以做到?)。

虽然个人能力不足,没有实现上述功能,但是我有个自用的小技巧,也可以方便在编辑器中浏览。实现这个技巧的过程比上面两种思路都简单,不过相应的效果不如上面两种思路明显。

在编辑器中为物品命名时,按照类别加个前缀,如“HP药:私酿药酒”、“主线1-1:父亲烧了一半的信”。这样在数据库中浏览时会更加方便,用Ctrl+F查找,可以一个接一个浏览具有相同前缀的物品。进入游戏时,直接操作$dataItems,将所有前缀去掉。

我的命名方式是前后缀之间用中文冒号 : 隔开。如果跟我一样,可以插入下面的代码,启动游戏时将数据中物品名称的前缀删除。
JAVASCRIPT 代码复制
  1. for(var i = 1; i < $dataItems.length; i++){
  2.     let name = $dataItems[i]["name"];
  3.     let index = name.indexOf(":");
  4.     if (index != -1){
  5.         $dataItems[i]["name"] = name.slice(index + 1);
  6.     }
  7. }

以上共列举了四种思路,分别是多留空、数据改为键值对、拓展调顺序自动改事件功能、加备注前缀。
作者: tuxyin    时间: 2022-4-14 11:16
本帖最后由 tuxyin 于 2022-4-14 11:55 编辑

根据 铅笔描绘的思念 的提示,提供一种方法:

重写下面两个方法,在数据库中的所有物品乱序的情况下,物品名称前加上“x>”,比如:10>手机;3>手表;5>衣服。然后物品就可以按照:手表,衣服,手机的顺序排列显示。

PS:下方的代码是在MZ中测试通过的,MV的话仅供参考。

JAVASCRIPT 代码复制
  1. Window_ItemList.prototype.makeItemList = function() {
  2.     this._data = $gameParty.allItems().filter(item => this.includes(item));
  3.     if (this.includes(null)) {
  4.         this._data.push(null);
  5.     }
  6.  
  7.     // 按照“x>”顺序重新排序物品
  8.     this._data.sort((a, b) => {
  9.         let aOrderNum = parseInt(a.name.split(">")[0]);
  10.         let bOrderNum = parseInt(b.name.split(">")[0]);
  11.         return aOrderNum - bOrderNum;
  12.     });
  13. };
  14.  
  15. Window_ItemList.prototype.drawItem = function(index) {
  16.     const item = this.itemAt(index);
  17.  
  18.     // 显示物品名称时,去掉“x>”
  19.     let newItemName = item.name.split(">")[1];
  20.     if (newItemName) item.name = newItemName;
  21.  
  22.     if (item) {
  23.         const numberWidth = this.numberWidth();
  24.         const rect = this.itemLineRect(index);
  25.         this.changePaintOpacity(this.isEnabled(item));
  26.         this.drawItemName(item, rect.x, rect.y, rect.width - numberWidth);
  27.         this.drawItemNumber(item, rect.x, rect.y, rect.width);
  28.         this.changePaintOpacity(1);
  29.     }
  30. };





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