查看: 4442|回复: 7

[已经解决] 大家都是怎么解决物品排序问题的?

[复制链接]
梦石
0
星屑
429
在线时间
175 小时
注册时间
2013-11-2
回帖
83
发表于 2017-7-16 21:37:50 | 显示全部楼层 |阅读模式

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

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

×
RM系列一直都是用物品编号排的顺序。
如果事先不空出位置可能会造成位置不够顺序混乱的情况,
请问有能解决这个问题的技巧或者插件吗?
搜索是一件比发帖容易的事,因此我绝对是搜不到满意答案才来发帖的。
梦石
0
星屑
55
在线时间
407 小时
注册时间
2011-4-10
回帖
352
发表于 2017-7-16 21:56:33 | 显示全部楼层
自定义生成持有物品列表的方法,按照你需要的规则排序。

点评

嗯……是根本的解决办法,但我不会脚本。  发表于 2017-7-16 22:03
回复

使用道具 举报

梦石
0
星屑
2306
在线时间
1010 小时
注册时间
2012-4-30
回帖
1455

开拓者

发表于 2017-7-16 23:01:27 | 显示全部楼层
首先有什么实际问题嘛。。其实关于排序的话对Window_Itemlist在makeItemList时对this._data的操作修改下就行了
回复

使用道具 举报

头像被屏蔽
梦石
0
星屑
172
在线时间
935 小时
注册时间
2010-11-13
回帖
897
发表于 2020-7-12 19:29:05 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

梦石
0
星屑
7801
在线时间
683 小时
注册时间
2012-7-29
回帖
172
发表于 2020-7-13 09:25:38 | 显示全部楼层
物品排序确实是让人不爽的问题。

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

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

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

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

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

我的命名方式是前后缀之间用中文冒号 : 隔开。如果跟我一样,可以插入下面的代码,启动游戏时将数据中物品名称的前缀删除。
[pre lang="javascript"]for(var i = 1; i < $dataItems.length; i++){
    let name = $dataItems["name"];
    let index = name.indexOf(":");
    if (index != -1){
        $dataItems["name"] = name.slice(index + 1);
    }
}[/pre]
以上共列举了四种思路,分别是多留空、数据改为键值对、拓展调顺序自动改事件功能、加备注前缀。

点评

从热帖进来的,忽然发现原来是坟?Σ(⊙▽⊙"a  发表于 2020-7-13 09:27

评分

参与人数 1赞 +1 收起 理由
白嫩白嫩的 + 1 666

查看全部评分

回复

使用道具 举报

梦石
0
星屑
1282
在线时间
257 小时
注册时间
2021-2-16
回帖
229
发表于 2022-4-14 11:16:48 | 显示全部楼层
本帖最后由 tuxyin 于 2022-4-14 11:55 编辑

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

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

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

[pre lang="javascript"]Window_ItemList.prototype.makeItemList = function() {
    this._data = $gameParty.allItems().filter(item => this.includes(item));
    if (this.includes(null)) {
        this._data.push(null);
    }
   
    // 按照“x>”顺序重新排序物品
    this._data.sort((a, b) => {
        let aOrderNum = parseInt(a.name.split(">")[0]);
        let bOrderNum = parseInt(b.name.split(">")[0]);
        return aOrderNum - bOrderNum;
    });
};

Window_ItemList.prototype.drawItem = function(index) {
    const item = this.itemAt(index);
   
    // 显示物品名称时,去掉“x>”
    let newItemName = item.name.split(">")[1];
    if (newItemName) item.name = newItemName;
   
    if (item) {
        const numberWidth = this.numberWidth();
        const rect = this.itemLineRect(index);
        this.changePaintOpacity(this.isEnabled(item));
        this.drawItemName(item, rect.x, rect.y, rect.width - numberWidth);
        this.drawItemNumber(item, rect.x, rect.y, rect.width);
        this.changePaintOpacity(1);
    }
};[/pre]
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部