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

Project1

 找回密码
 注册会员
搜索
查看: 3891|回复: 6
打印 上一主题 下一主题

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

[复制链接]

Lv5.捕梦者

梦石
16
星屑
12055
在线时间
1412 小时
注册时间
2020-3-21
帖子
365

极短23获奖

跳转到指定楼层
1
发表于 2020-7-28 15:55:05 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
求教如何初始化一张地图?
就是将地图初始化为最初状态,所有的事件的独立开关都关闭,所有的事件都回归未触发状态。

Lv3.寻梦者

梦石
0
星屑
1398
在线时间
157 小时
注册时间
2020-4-26
帖子
151
2
发表于 2020-7-28 17:14:01 | 只看该作者
切换地图后事件都是重新触发的,唯一不变是独立开关,所以只要处理他就好,然而不是出现条件不是独立开关的就比较难处理了

点评

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

使用道具 举报

Lv5.捕梦者

梦石
16
星屑
12055
在线时间
1412 小时
注册时间
2020-3-21
帖子
365

极短23获奖

3
 楼主| 发表于 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();

};
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
7545
在线时间
665 小时
注册时间
2012-7-29
帖子
174
4
发表于 2020-7-29 09:18:35 | 只看该作者
本帖最后由 开关关 于 2020-7-29 10:12 编辑
仇九 发表于 2020-7-29 08:46
切换地图以后一切都是重新触发的,只要把开关等都关闭即可!
这是我写的函数,当插件一样用就可以。
在脚本 ...


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



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

JAVASCRIPT 代码复制
  1. var mapId = 3;
  2. var pattern = new RegExp('(^' + mapId + ',)');
  3. for(var i in $gameSelfSwitches._data){
  4.     if(pattern.test(i)){
  5.         delete $gameSelfSwitches._data[i];
  6.     }
  7. }


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

点评

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

使用道具 举报

Lv5.捕梦者

梦石
16
星屑
12055
在线时间
1412 小时
注册时间
2020-3-21
帖子
365

极短23获奖

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

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

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-14 02:27

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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