查看: 4537|回复: 6

[有事请教] 求教如何初始化一张地图

[复制链接]
梦石
18
星屑
13378
在线时间
1525 小时
注册时间
2020-3-21
回帖
334

MZ评测员极短23获奖

发表于 2020-7-28 15:55:05 | 显示全部楼层 |阅读模式

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

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

×
求教如何初始化一张地图?
就是将地图初始化为最初状态,所有的事件的独立开关都关闭,所有的事件都回归未触发状态。
梦石
0
星屑
1343
在线时间
153 小时
注册时间
2020-4-26
回帖
146
发表于 2020-7-28 17:14:01 | 显示全部楼层
切换地图后事件都是重新触发的,唯一不变是独立开关,所以只要处理他就好,然而不是出现条件不是独立开关的就比较难处理了

点评

嗯!我理解了!昨天我仔细查看了rpg_sprites,rpg_managers等文件,现在更懂了。的确,切换地图以后一切都是重新触发的,只要把开关等都关闭即可!  发表于 2020-7-29 08:42
回复

使用道具 举报

梦石
18
星屑
13378
在线时间
1525 小时
注册时间
2020-3-21
回帖
334

MZ评测员极短23获奖

 楼主| 发表于 2020-7-29 08:46:46 | 显示全部楼层
切换地图以后一切都是重新触发的,只要把开关等都关闭即可!
这是我写的函数,当插件一样用就可以。
在脚本里执行$gameMap.SX(mapid)就可以将指定的地图中的独立开关都关掉。
但是很明显,其80%的内容都只是为了读取指定地图的事件总数而已。如何化简这80%?




Game_Map.prototype.SX = function(value) {
    var mapId = value.toString();
    while (mapId.length < 3) {
        mapId = '0' + mapId;
    }
    var dataread = new XMLHttpRequest();
    dataread.open('GET', 'data/' + 'Map%1.json'.format(mapId));
    dataread.overrideMimeType('application/json');
    var length = 0;
    dataread.onload = function() {
        datareadText = dataread.response;
        length = JSON.parse(datareadText).events.length;
        for (var i=1;i<length;i++){
        $gameSelfSwitches.setValue([value, i, "A"], false);
        $gameSelfSwitches.setValue([value, i, "B"], false);

        $gameSelfSwitches.setValue([value, i, "C"], false);
        $gameSelfSwitches.setValue([value, i, "D"], false);
    }
    }
    dataread.send();

};
回复

使用道具 举报

梦石
0
星屑
7801
在线时间
683 小时
注册时间
2012-7-29
回帖
172
发表于 2020-7-29 09:18:35 | 显示全部楼层
本帖最后由 开关关 于 2020-7-29 10:12 编辑
仇九 发表于 2020-7-29 08:46
切换地图以后一切都是重新触发的,只要把开关等都关闭即可!
这是我写的函数,当插件一样用就可以。
在脚本 ...


存储独立开关的对象是一个全局对象,可以看看它的结构:

gameSelfSwitches结构.PNG

这个结构非常简单,直接存放独立开关状态的就是个名为 _data 的键值对。其中键的格式是“地图id,事件id,独立开关名”。从中还能发现一个规律,只要独立开关是关闭的,这个键值就不存在。而且看 Game_SelfSwitches 类的 clear 方法,它还原所有独立开关的方式就是把 _data 的成员删光。找到规律就好办了,只要你的全局变量总数并不多,就建议采用下面这种更加简洁的写法:

[pre lang="javascript"]var mapId = 3;
var pattern = new RegExp('(^' + mapId + ',)');
for(var i in $gameSelfSwitches._data){
    if(pattern.test(i)){
        delete $gameSelfSwitches._data;
    }
}[/pre]

将符合地图id为3这个条件的成员直接删光。亲测有效。

点评

啊!谢谢大佬!  发表于 2020-7-29 13:28
回复

使用道具 举报

梦石
18
星屑
13378
在线时间
1525 小时
注册时间
2020-3-21
回帖
334

MZ评测员极短23获奖

 楼主| 发表于 2020-7-29 13:48:05 | 显示全部楼层
开关关 发表于 2020-7-29 09:18
存储独立开关的对象是一个全局对象,可以看看它的结构:

已经测试,的确可用,非常感谢!我本来在阅读js时已经明白:独立开关实际上不是和事件绑定的(我这说法不专业……),而且我在rpg_objects里发现了“关闭一个独立开关就是把相关的数据删除而不是转为false”这件事。但是我自以为得一个一个删,需要得到这个地图的事件id最大值,所以我才照搬写了那么麻烦的脚本。现在看来只要把对应mapid里的数据全删除即可。
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部