我需要一些关于我制作的谜题的帮助,涉及伤害方块。
简单来说,我想制作一个类似这样的谜题:你需要把一块巨石推到毒气方块上,使其变成桥梁方块,然后你可以安全通过而不会受到伤害。但无论我怎么做,我的角色在通过时仍然会受到伤害。
我尝试查找如何解决这个问题的教程,但大多数找到的内容并不完全符合我的需求。有人能帮帮我吗?
我需要一些关于我制作的谜题的帮助,涉及伤害方块。
简单来说,我想制作一个类似这样的谜题:你需要把一块巨石推到毒气方块上,使其变成桥梁方块,然后你可以安全通过而不会受到伤害。但无论我怎么做,我的角色在通过时仍然会受到伤害。
我尝试查找如何解决这个问题的教程,但大多数找到的内容并不完全符合我的需求。有人能帮帮我吗?
rpg_objects.js,第 5987 行。这是我们需要弄清楚如何修改的代码:
Game_Map.prototype.isDamageFloor = function(x, y) {
return this.isValid(x, y) && this.checkLayeredTilesFlags(x, y, 0x100);
};
你可以将上述代码保存为一个 .js 文件,并将其作为插件安装。这样,它将根据你在插件中编写的内容覆盖正常功能。
现在的关键是弄清楚如何告诉游戏该毒气地块不再具有毒性。如果添加检查该地块下方是否有事件,将与你恰好放置在毒气地块上方的过场事件不兼容。当然,你也可以避免在毒气地块上放置任何事件,以防止出现这种疏漏。
因此,如果你希望游戏实现“只要毒气地块上有任何事件,它就不再具有毒性”的效果,你可以将以下代码保存为 .js 文件并作为插件安装。请注意,这可能会导致在事件数量较多的地图上出现卡顿!
_aliasIsDamageFloor = Game_Map.prototype.isDamageFloor;
Game_Map.prototype.isDamageFloor = function(x, y) {
return _aliasIsDamageFloor.call(this, x, y) && this.eventsXy(x, y).length == 0;
};
我觉得我基本上是通过事件来模拟伤害区域的。从VXAce开始,你可以设置一个事件来检测你是否处于特定区域,如果是的话就施加伤害。然后,在你想要放置桥梁的地方,将这部分逻辑整合到桥梁的处理中。如果桥梁已放置且你掉落在该处,就不造成伤害;否则就施加伤害。
我相信你可以通过代码实现更好的方案,但当我需要一个快速且粗略的解决方案时,我就直接这样做。
为该“桥-巨石-等等”事件设置一个自定义的移动路线,在事件页面中,当巨石放置到位时使用该路线。将频率设置为最高。
在路线中复制并粘贴以下脚本调用:
$dataMap.data[(0 * $dataMap.height + this.y) * $dataMap.width + this.x] = this._tileId
这会将事件所在位置的地图图块更改为其他图块。在此示例中,事件的图块 ID 是一个桥图块(80),但也可以是任何没有伤害标志的图块 ID。请注意,如果事件图形设置为非图块图形,则 “this._tileId” 将为 “0”,这可能不允许通行。我假设伤害图块位于底部——我们正在更改的就是这个图块。
更改 $dataMap 的图块只是暂时的。如果你更新或刷新场景,例如打开菜单或转移玩家,图块将恢复原状。因此,事件的移动路线会持续更改它。由于频率设置为最高,在事件移动再次替换图块 ID 之前,延迟应仅为 1-2 帧。
我觉得这个说法有点误导人。从技术上讲确实如此,但场景并不会频繁刷新——据我所知,只有在你进入其他场景再返回时才会刷新(例如战斗、打开菜单等)。
在实际操作中,这意味着如果你之后需要把桥变回伤害瓦片,可能无法正常工作。但如果只需要一次性转换,这种方法应该是可行的。
我们无法预测可能会刷新地图的插件或并行进程。关键在于,如果玩家保存、退出并重新加载游戏,移动路线会确保事件所在的地块在玩家返回时被覆盖。
如果你想将地块推开并将 $dataMap 恢复到初始状态,最简单的方法是使用转移命令(移动到无位置且无淡入淡出效果)。这也会刷新地图地块。不过,如果有队伍跟随者,它们会坍缩到玩家的位置,因此会存在一些不流畅的现象。