Project1

标题: 有没有能够将置换地图元件/图块的脚本或者方法? [打印本页]

作者: yuxuan1177    时间: 2020-6-10 22:48
标题: 有没有能够将置换地图元件/图块的脚本或者方法?


我想要把第二个图块替换成第一个图块,然后第三个图块也一起替换成第一个图块,实现开图的方法
因为比较大量,所以没办法用事件来实行
这个单独的地图图块/元件替换在RPOMAKER2003之前都有,但是在MV里面似乎只能通过脚本实现
但如何将图块2替换成图块1呢?
作者: yuxuan1177    时间: 2020-6-10 23:01
不懂编程
大概的想法是
定义一下图块编号的代码
然后定义tile的编号,将2变成1,应该是这样实现的
但完全不懂,想写都没办法,只知道大概这个样子……
看过帮助文档,图块只有图块组的ID,没有单独的图块ID,也不知道咋改……
作者: yuxuan1177    时间: 2020-6-11 00:29
本帖最后由 yuxuan1177 于 2020-6-11 00:37 编辑

例如我需要将1537的图块置换为1536的图块
刚刚临时看了一点,照猫画虎的弄了一下,但是没用
var 当前地图 = SceneManager._scene._spriteset._tilemap;
$dataMap.data[1537] = 1536;
当前地图.refresh();
是不是不能是1537,而是需要先var定义?我想要用开关批量将1537或者1538、1539的瓦块替换成1536编号的瓦块
作者: yuxuan1177    时间: 2020-6-11 00:57
dataMap.data[1,1,1] = 1536;
这样倒是可以
所以逻辑应该是获取所有1537的X、Y,然后替换么
那如何获取1537号图块的xy呢……我想想……
作者: yuxuan1177    时间: 2020-6-11 03:13
http://himeworks.com/2013/02/tile-swap/
这是ACE的,其中将A3替换成A2图块,就是我需要的功能
奈何没有MV的
MV有类似的,但只能是一个个的坐标调整,就是我上面写的一样……
作者: play337    时间: 2020-6-11 06:56
本帖最后由 play337 于 2020-6-11 07:00 编辑

把圖用出來變成事件不就好了....
作者: yuxuan1177    时间: 2020-6-11 11:35
play337 发表于 2020-6-11 06:56
把圖用出來變成事件不就好了....

太多了,不好做,ACE有这个脚本,但是MV没有,RGSS3看不懂,JS也看不懂,更别提移植了……
作者: moonyoulove    时间: 2020-6-11 12:13
整個圖塊組都換?例如野外1換成野外2,1、2是複製的圖塊組,只是圖塊1、2、3不一樣
作者: yuxuan1177    时间: 2020-6-11 12:26
moonyoulove 发表于 2020-6-11 12:13
整個圖塊組都換?例如野外1換成野外2,1、2是複製的圖塊組,只是圖塊1、2、3不一樣 ...

试过,排列组合的逻辑太多了
替换的图块可能是有十几个,而且需要调整组合,结果就是很难搞
作者: yuxuan1177    时间: 2020-6-11 12:32
var 地图 = SceneManager._scene._spriteset._tilemap;
var 地图宽度 = $gameMap.width();
var 地图高度 = $gameMap.height();
var 图块编号 = 1536;
var 图层 = 3;
var X = ???;
var Y = ???;
var 图块位置 = (图层 * 地图高度 + Y)*地图宽度+X;
$dataMap.data[图块位置] = 图块编号;
地图.refresh();


学了一点,大概是这种感觉?
不太清楚

大概是X和Y是坐标?
假设需要替换所有的1537的图块成为1536,那就是XY分别get所有的1537的坐标,然后置换?
可具体咋做?
如果能够执行替换,将DATA里面的MAP.JSON里面的1537全部替换成1536也成啊……
作者: yuxuan1177    时间: 2020-6-11 13:24
实在不行,就只能$dataMap.data[X,Y,Z]这样一个一个修改了
一个地图的格子是25×14=350,替换一个格子执行一次……
如果能直接替换图块的话,1537换成1536,1538换成1536,这样可能最多10次
等于工作量翻倍35倍……
作者: Zeldashu    时间: 2020-6-11 14:08
这样的话使用“战争迷雾”作为一种开图方法会不会更好了?
作者: yuxuan1177    时间: 2020-6-11 14:28
Zeldashu 发表于 2020-6-11 14:08
这样的话使用“战争迷雾”作为一种开图方法会不会更好了?

战争迷雾不太行,因为图块同时也需要充当边界的作用,而且战争迷雾反而不方便使用开关分层
作者: moonyoulove    时间: 2020-6-11 17:25
你看這兩個函數會返回xyz座標的圖塊ID,你這邊可以做一個攔截當ID為多少時,返回另外的值,最後有需要的話得研究一下立即刷新的辦法

作者: yuxuan1177    时间: 2020-6-11 18:04
moonyoulove 发表于 2020-6-11 17:25
你看這兩個函數會返回xyz座標的圖塊ID,你這邊可以做一個攔截當ID為多少時,返回另外的值,最後有需要的話 ...

不懂代码,这个是啥意思……?
而且现在不是需要图块ID,而是根据图块ID返回XYZ坐标,然后用新的图块ID将其覆盖
作者: yuxuan1177    时间: 2020-6-11 18:11
Zeldashu 发表于 2020-6-11 14:08
这样的话使用“战争迷雾”作为一种开图方法会不会更好了?

不知道MZ的新特性是不是支持
听说有分层地图,如果能够实现双层地图,将第二层下降之类的,应该会简单很多。
作者: Zeldashu    时间: 2020-6-11 20:10
yuxuan1177 发表于 2020-6-11 18:11
不知道MZ的新特性是不是支持
听说有分层地图,如果能够实现双层地图,将第二层下降之类的,应该会简单很 ...

MZ现在还没有确切的情报公布。只是知道多了一个“层”功能,还不知道具体是应用在哪里的。
另外内存要求8G,不支持window7也挺奇怪的……
作者: moonyoulove    时间: 2020-6-11 20:22

作者: yuxuan1177    时间: 2020-6-11 20:59
moonyoulove 发表于 2020-6-11 20:22

啊啊啊啊,这个功能是咋实现的?
就是这个!就是这个哒!
作者: yuxuan1177    时间: 2020-6-11 21:12
moonyoulove 发表于 2020-6-11 20:22

大神,请问这个功能是用什么插件或者代码实现的……?
现在在做一个废都物语类别的游戏,就需要用这个方式替换遮挡的图块来进行开图,以前有过各种方法,但都有缺陷,也就是替换图块是最好的,但一直都实现不了,现在只有一个一格格替换的超慢方法……
作者: yuxuan1177    时间: 2020-6-11 22:08
moonyoulove 发表于 2020-6-11 20:22

是不是把上面那段代码调整一下就可以了?
我去试试看
作者: tseyik    时间: 2020-6-11 22:56
本帖最后由 tseyik 于 2020-6-11 23:03 编辑

https://forums.rpgmakerweb.com/i ... change-tiles.90437/

Tile Changer (Copy Tiles and Change Tiles)



https://forums.rpgmakerweb.com/i ... tile-swapping.9396/
Easy tile swapping
作者: yuxuan1177    时间: 2020-6-12 02:53
tseyik 发表于 2020-6-11 22:56
https://forums.rpgmakerweb.com/index.php?threads/tile-changer-copy-tiles-and-change-tiles.90437/

Ti ...

Tile Changer 我现在正在用
但这个插件有一个问题在于只能一个坐标一个坐标的更换,不能直接把1537号的地图瓦块换成1536号的瓦块
作者: moonyoulove    时间: 2020-6-12 12:22
本帖最后由 moonyoulove 于 2020-6-12 12:29 编辑

好像不能下載只能複製到文字檔裡儲存為MULI_ReplaceTile.js
JAVASCRIPT 代码复制
  1. //=============================================================================
  2. // MULI_ReplaceTile.js
  3. //=============================================================================
  4.  
  5. /*:
  6.  * @plugindesc 替換地圖上ID為n的圖塊
  7.  * @author moonyoulove
  8.  *
  9.  * @help
  10.  * 有一個新的全域變量:$gameReplacedTiles,遊戲存檔裡會保存替換的狀態
  11.  *
  12.  * 插件命令:
  13.  * ReplaceTile Replace z tileId1 tileId2 //將z層的圖塊1都換成圖塊2
  14.  * ReplaceTile Restore z tileId //將z層的圖塊1還原成原本的數據
  15.  * ReplaceTile Clear All //將所有地圖的替換都還原
  16.  * ReplaceTile Clear Map //將當前地圖的替換都還原
  17.  * ReplaceTile Refresh //立即刷新圖塊更變
  18.  *
  19.  * Z coordinate:
  20.  * 0 : Lower tiles
  21.  * 1 : Lower characters
  22.  * 3 : Normal characters
  23.  * 4 : Upper tiles
  24.  * 5 : Upper characters
  25.  * 6 : Airship shadow
  26.  * 7 : Balloon
  27.  * 8 : Animation
  28.  * 9 : Destination
  29.  */
  30.  
  31. function RpcTile() {
  32.     throw new Error('This is a static class');
  33. }
  34.  
  35. RpcTile.parameters = PluginManager.parameters("MULI_ReplaceTile");
  36. RpcTile.hasPlugin = {
  37.     // "SomePlugin": PluginManager._scripts.includes("SomePlugin")
  38. };
  39. RpcTile.globalThis = self || window || global;
  40.  
  41. function Game_ReplacedTiles() {
  42.     this.initialize.apply(this, arguments);
  43. }
  44.  
  45. Game_ReplacedTiles.prototype.initialize = function() {
  46.     this.clear();
  47.     this._needRepaint = false;
  48. };
  49.  
  50. Game_ReplacedTiles.prototype.clear = function(mapId) {
  51.     if (mapId > 0) {
  52.         delete this._data[mapId];
  53.     } else {
  54.         this._data = {};
  55.     }
  56. };
  57.  
  58. Game_ReplacedTiles.prototype.replace = function(mapId, z, tileId1, tileId2) {
  59.     this._data[mapId] = this._data[mapId] || {};
  60.     this._data[mapId][z] = this._data[mapId][z] || {};
  61.     this._data[mapId][z][tileId1] = tileId2;
  62. };
  63.  
  64. Game_ReplacedTiles.prototype.restore = function(mapId, z, tileId) {
  65.     if (this._data[mapId] && this._data[mapId][z]) {
  66.         delete this._data[mapId][z][tileId];
  67.         if (Object.keys(this._data[mapId][z]).length === 0) {
  68.             delete this._data[mapId][z];
  69.             if (Object.keys(this._data[mapId]).length === 0) {
  70.                 delete this._data[mapId];
  71.             }
  72.         }
  73.     }
  74. };
  75.  
  76. Game_ReplacedTiles.prototype.value = function(mapId, z, tileId) {
  77.     if (this._data[mapId] && this._data[mapId][z] && this._data[mapId][z][tileId]) {
  78.         return this._data[mapId][z][tileId];
  79.     }
  80.     return 0;
  81. };
  82.  
  83. Game_ReplacedTiles.prototype.isNeedRepaint = function() {
  84.     return this._needRepaint;
  85. };
  86.  
  87. Game_ReplacedTiles.prototype.needRepaint = function() {
  88.     this._needRepaint = true;
  89. };
  90.  
  91. Game_ReplacedTiles.prototype.repainted = function() {
  92.     this._needRepaint = false;
  93. };
  94.  
  95. (function() {
  96.     let _DataManager_createGameObjects = DataManager.createGameObjects;
  97.     DataManager.createGameObjects = function() {
  98.         _DataManager_createGameObjects.call(this);
  99.         $gameReplacedTiles = new Game_ReplacedTiles();
  100.     };
  101.  
  102.     let _DataManager_makeSaveContents = DataManager.makeSaveContents;
  103.     DataManager.makeSaveContents = function() {
  104.         let contents = _DataManager_makeSaveContents.call(this);
  105.         contents.replacedTiles = $gameReplacedTiles;
  106.         return contents;
  107.     };
  108.  
  109.     let _DataManager_extractSaveContents = DataManager.extractSaveContents;
  110.     DataManager.extractSaveContents = function(contents) {
  111.         _DataManager_extractSaveContents.call(this, contents);
  112.         $gameReplacedTiles = contents.replacedTiles || $gameReplacedTiles;
  113.     };
  114.  
  115.     _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
  116.     Game_Interpreter.prototype.pluginCommand = function(command, args) {
  117.         _Game_Interpreter_pluginCommand.call(this, command, args);
  118.         if (command === "ReplaceTile") {
  119.             switch (args[0]) {
  120.                 case "Replace": {
  121.                     let z = Number(args[1]);
  122.                     let tileId1 = Number(args[2]);
  123.                     let tileId2 = Number(args[3]);
  124.                     if (z >= 0 && tileId1 > 0 && tileId2 > 0) {
  125.                         $gameReplacedTiles.replace(this._mapId, z, tileId1, tileId2);
  126.                     }
  127.                     break;
  128.                 }
  129.                 case "Restore": {
  130.                     let z = Number(args[1]);
  131.                     let tileId = Number(args[2]);
  132.                     if (z >= 0 && tileId > 0) {
  133.                         $gameReplacedTiles.restore(this._mapId, z, tileId);
  134.                     }
  135.                     break;
  136.                 }
  137.                 case "Clear": {
  138.                     if (args[1] === "All") {
  139.                         $gameReplacedTiles.clear();
  140.                     } else if (args[1] === "Map") {
  141.                         $gameReplacedTiles.clear(this._mapId);
  142.                     }
  143.                     break;
  144.                 }
  145.                 case "Refresh": {
  146.                     $gameReplacedTiles.needRepaint();
  147.                     break;
  148.                 }
  149.             }
  150.         }
  151.     };
  152.  
  153.     let _Game_Map_tileId = Game_Map.prototype.tileId;
  154.     Game_Map.prototype.tileId = function(x, y, z) {
  155.         let tileId = _Game_Map_tileId.call(this, x, y, z);
  156.         if (tileId > 0) {
  157.             let replacedId = $gameReplacedTiles.value(this._mapId, z, tileId);
  158.             if (replacedId > 0) {
  159.                 return replacedId;
  160.             }
  161.         }
  162.         return tileId;
  163.     };
  164.  
  165.     let _Tilemap__readMapData = Tilemap.prototype._readMapData;
  166.     Tilemap.prototype._readMapData = function(x, y, z) {
  167.         let tileId = _Tilemap__readMapData.call(this, x, y, z);
  168.         if (tileId > 0) {
  169.             let replacedId = $gameReplacedTiles.value($gameMap.mapId(), z, tileId);
  170.             if (replacedId > 0) {
  171.                 return replacedId;
  172.             }
  173.         }
  174.         return tileId;
  175.     };
  176.  
  177.     let _Spriteset_Map_updateTilemap = Spriteset_Map.prototype.updateTilemap;
  178.     Spriteset_Map.prototype.updateTilemap = function() {
  179.         _Spriteset_Map_updateTilemap.call(this);
  180.         if ($gameReplacedTiles.isNeedRepaint()) {
  181.             this._tilemap.refresh();
  182.             $gameReplacedTiles.repainted();
  183.         }
  184.     };
  185. })();

作者: yuxuan1177    时间: 2020-6-12 13:09
moonyoulove 发表于 2020-6-12 12:22
好像不能下載只能複製到文字檔裡儲存為MULI_ReplaceTile.js
//========================================== ...

非常感谢!已经成功!
我这两天做一个DEMO看看效果
现在这正是我需要的效果,太赞了!太赞了!




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