Project1

标题: 【小工具插件】mv地图输出为图片 [打印本页]

作者: 汪汪    时间: 2018-4-9 09:52
标题: 【小工具插件】mv地图输出为图片
本帖最后由 汪汪 于 2018-4-9 12:59 编辑



JAVASCRIPT 代码复制下载
  1. //=============================================================================
  2. //  tilemapOut.js
  3. //=============================================================================
  4.  
  5. /*:
  6.  * @plugindesc  
  7.  * tilemapOut ,地图输出图片
  8.  * @author wangwang
  9.  *   
  10.  * @param  tilemapOut
  11.  * @desc 插件 地图输出图片 ,作者:汪汪
  12.  * @default 汪汪
  13.  *
  14.  *
  15.  * @help
  16.  *   
  17.  * ww.tilemapOut(地图id , 最大宽(单位:图块),最大高(单位:图块),x缩放比例 ,y缩放比例 )
  18.  * 地图id 为0 时 为 输出所有
  19.  * 最大宽高 为0 时 为 地图的宽或高
  20.  * 缩放比例为 0 时默认为 1
  21.  * 只绘制地图部分
  22.  *
  23.  *
  24.  */
  25.  
  26.  
  27.  
  28.  
  29. var ww = ww || {}
  30. ww.tilemapOut = function (mapId, tx, ty, sx, sy) {
  31.     var sx = sx||1
  32.     var sy = sy||1
  33.     if (mapId) {
  34.         ww.tilemapOut.loadMap(mapId, tx, ty, sx, sy)
  35.     } else {
  36.  
  37.         for (var i = 0; i < $dataMapInfos.length; i++) {
  38.             var info = $dataMapInfos[i]
  39.             if (info) {
  40.                 ww.tilemapOut.loadMap(info.id, tx, ty, sx, sy)
  41.             }
  42.         }
  43.     }
  44. }
  45.  
  46. ww.tilemapOut._tileMaps = {}
  47. ww.tilemapOut._dataMaps = {}
  48. ww.tilemapOut._event = {}
  49.  
  50. ww.tilemapOut.loadMap = function (mapId, tx, ty, sx, sy) {
  51.     if (mapId > 0 && $dataMapInfos && $dataMapInfos[mapId]) {
  52.  
  53.         if (ww.tilemapOut._dataMaps[mapId]) {
  54.             ww.tilemapOut.onLoad(mapId, tx, ty, sx, sy)
  55.         } else {
  56.             var filename = 'Map%1.json'.format(mapId.padZero(3));
  57.             var xhr = new XMLHttpRequest();
  58.             var url = 'data/' + filename;
  59.             xhr.open('GET', url);
  60.             xhr.overrideMimeType('application/json');
  61.             xhr.onload = function () {
  62.                 if (xhr.status < 400) {
  63.                     ww.tilemapOut._dataMaps[mapId] = JSON.parse(xhr.responseText);
  64.                     ww.tilemapOut.onLoad(mapId, tx, ty, sx, sy)
  65.                 }
  66.             };
  67.             xhr.send();
  68.         }
  69.     }
  70. }
  71.  
  72. ww.tilemapOut.onLoad = function (mapId, tx, ty, sx, sy) {
  73.     var gmap = ww.tilemapOut._dataMaps[mapId]
  74.  
  75.     if (gmap) {
  76.         if (!this._tileMaps[mapId]) {
  77.             //图块地图 = 新 图块地图()
  78.             var tilemap = new Tilemap();
  79.             //图块地图 图块宽 = 游戏地图 图块宽()
  80.             tilemap.tileWidth = $gameMap.tileWidth();
  81.             //图块地图 图块高 = 游戏地图 图块高()
  82.             tilemap.tileHeight = $gameMap.tileHeight();
  83.             //图块地图 设置地图(游戏地图 宽() ,游戏地图 高(),游戏地图 数据())
  84.             tilemap.setData(gmap.width, gmap.height, gmap.data);
  85.             //图块地图 横循环 = 游戏地图 是横循环()
  86.             tilemap.horizontalWrap = gmap.scrollType === 2 || gmap.scrollType === 3;
  87.             //图块地图 纵循环 = 游戏地图 是纵循环()
  88.             tilemap.verticalWrap = gmap.scrollType === 1 || gmap.scrollType === 3;;
  89.  
  90.             var tileset = $dataTilesets[gmap.tilesetId];
  91.             //如果(摊图块设置)
  92.             if (tileset) {
  93.                 //读取图块设置名字组 = 图块设置 图块设置名称组
  94.                 var tilesetNames = tileset.tilesetNames;
  95.                 //循环 (开始时 i = 0 ; 当 i <  图块设置名称组 长度 ;每一次 i++)
  96.                 for (var i = 0; i < tilesetNames.length; i++) {
  97.                     //图块地图 位图[i] = 图像管理器 读取图块设置(图块设置名称组[i])
  98.                     tilemap.bitmaps[i] = ImageManager.loadTileset(tilesetNames[i]);
  99.                 }
  100.                 tilemap.flags = tileset.flags;
  101.             }
  102.             this._tileMaps[mapId] = tilemap
  103.         }
  104.  
  105.         this._event[mapId] = [tx, ty, sx, sy]
  106.         !this._wait && ww.tilemapOut.waitRead()
  107.     }
  108.  
  109. }
  110.  
  111.  
  112. ww.tilemapOut.waitRead = function () {
  113.     this._wait = false
  114.     for (var i in this._event) {
  115.         var l = this._event[i]
  116.         var tilemap = this._tileMaps[i]
  117.         var tx = l[0]
  118.         var ty = l[1]
  119.         var sx = l[2]
  120.         var sy = l[3]
  121.         if (tilemap.isReady()) {
  122.             tilemap.update()
  123.             tilemap._paintAllTiles2(i, tx, ty, sx, sy)
  124.             delete this._event[i]
  125.         } else {
  126.             this._wait = true
  127.         }
  128.     }
  129.     if (this._wait) {
  130.         requestAnimationFrame(this.waitRead.bind(this))
  131.     }
  132. }
  133.  
  134.  
  135.  
  136.  
  137. Tilemap.prototype._paintAllTiles2 = function (mapId, tx, ty, sx, sy) {
  138.     var width = this._mapWidth
  139.     var height = this._mapHeight
  140.     var tileCols = tx || width;
  141.     var tileRows = ty || height;
  142.  
  143.     var bitmaps = {}
  144.     for (var mx = 0, startX = 0; startX < width; mx += 1, startX = mx * tileCols) {
  145.         for (var my = 0, startY = 0; startY < height; my += 1, startY = my * tileRows) {
  146.  
  147.             var w = width - startX
  148.             w = tileCols < w ? tileCols : w
  149.             var h = height - startY
  150.             h = tileRows < h ? tileRows : h
  151.  
  152.  
  153.             var bitmap0 = new Bitmap(w * this._tileWidth, h * this._tileHeight)
  154.             for (var y = 0; y <= h; y++) {
  155.                 for (var x = 0; x < w; x++) {
  156.                     this._paintTiles2(bitmap0, startX, startY, x, y);
  157.                 }
  158.             }
  159.  
  160.  
  161.             if (sx == 1 && sy == 1) {
  162.                 var bitmap = bitmap0
  163.                 var sxy = ""
  164.  
  165.  
  166.             } else {
  167.  
  168.                 var w1 = bitmap0.width
  169.                 var h1 = bitmap0.height
  170.                 var w2 = w1 * sx
  171.                 var h2 = h1 * sy
  172.  
  173.                 var bitmap = new Bitmap(w2, h2)
  174.                 bitmap.blt(bitmap0, 0, 0, w1, h1, 0, 0, w2, h2)
  175.                 var sxy = "," + sx +"x"+sy
  176.             }
  177.             bitmaps[mx + "," + my] = bitmap
  178.  
  179.             var name = $dataMapInfos[mapId].name
  180.             if (tileCols == width && tileRows == height) {
  181.                 var big = ""
  182.                 var index = ""
  183.             } else {
  184.                 var big = "," + tileCols + "x" + tileRows + ""
  185.                 var index = "," + mx + "-" + my
  186.             }
  187.  
  188.             ww.tilemapOut.savePng(bitmap, mapId + "," + name + big +sxy + index + ".png", "tilemapOut/")
  189.         }
  190.     }
  191.     console.log(mapId, bitmaps)
  192.     return bitmaps
  193. };
  194.  
  195.  
  196.  
  197. Tilemap.prototype._paintTiles2 = function (bitmap, startX, startY, x, y) {
  198.     var tableEdgeVirtualId = 10000;
  199.     //现在x = 开始x + x
  200.     var mx = startX + x;
  201.     //现在y = 开始y + y
  202.     var my = startY + y;
  203.     //dx = 现在x * 图块宽(48)  除 层宽(912)的余数  -- 以层宽为基础的 现在图块坐标 x
  204.     var dx = x * this._tileWidth;
  205.     //dy = 现在y * 图块高(48)  除 层高(720)的余数  -- 以层宽为基础的 现在图块坐标 y
  206.     var dy = y * this._tileHeight;
  207.     //层x
  208.     var lx = x;
  209.     //层y
  210.     var ly = y;
  211.     //0层图块
  212.     var tileId0 = this._readMapData(mx, my, 0);
  213.     //1层图块
  214.     var tileId1 = this._readMapData(mx, my, 1);
  215.     //2层图块
  216.     var tileId2 = this._readMapData(mx, my, 2);
  217.     //3层图块
  218.     var tileId3 = this._readMapData(mx, my, 3);
  219.     //阴影
  220.     var shadowBits = this._readMapData(mx, my, 4);
  221.     //y的上面图块
  222.     var upperTileId1 = this._readMapData(mx, my - 1, 1);
  223.     //下面的图块组
  224.     var lowerTiles = [];
  225.     //上面的图块组
  226.     var upperTiles = [];
  227.     //是较高图块
  228.     if (this._isHigherTile(tileId0)) {
  229.         upperTiles.push(tileId0);
  230.     } else {
  231.         lowerTiles.push(tileId0);
  232.     }
  233.     //是较高图块
  234.     if (this._isHigherTile(tileId1)) {
  235.         upperTiles.push(tileId1);
  236.     } else {
  237.         lowerTiles.push(tileId1);
  238.     }
  239.     //下面的图块组 添加 阴影
  240.     lowerTiles.push(-shadowBits);
  241.  
  242.     //如果 y的上面图块 是平台图块 并且  不是 1层图块 是平台图块
  243.     if (this._isTableTile(upperTileId1) && !this._isTableTile(tileId1)) {
  244.         // 如果 不是  0层图块 是遮蔽图块(建筑,墙壁)
  245.         if (!Tilemap.isShadowingTile(tileId0)) {
  246.             //下面的图块组 添加 10000 +  y的上面图块
  247.             lowerTiles.push(tableEdgeVirtualId + upperTileId1);
  248.         }
  249.     }
  250.  
  251.     //如果 是立交桥的位置
  252.     if (this._isOverpassPosition(mx, my)) {
  253.         upperTiles.push(tileId2);
  254.         upperTiles.push(tileId3);
  255.     } else {
  256.         //如果是较高图块
  257.         if (this._isHigherTile(tileId2)) {
  258.             upperTiles.push(tileId2);
  259.         } else {
  260.             lowerTiles.push(tileId2);
  261.         }
  262.         //如果是较高图块
  263.         if (this._isHigherTile(tileId3)) {
  264.             upperTiles.push(tileId3);
  265.         } else {
  266.             lowerTiles.push(tileId3);
  267.         }
  268.     }
  269.  
  270.     //之前下面的图块组
  271.     //var lastLowerTiles = this._readLastTiles(0, lx, ly);
  272.     //如果 下面的图块组 不等于 之前下面的图块组
  273.  
  274.     // bitmap.clearRect(dx, dy, this._tileWidth, this._tileHeight);
  275.     for (var i = 0; i < lowerTiles.length; i++) {
  276.         var lowerTileId = lowerTiles[i];
  277.         if (lowerTileId < 0) {
  278.             this._drawShadow(bitmap, shadowBits, dx, dy);
  279.         } else if (lowerTileId >= tableEdgeVirtualId) {
  280.             this._drawTableEdge(bitmap, upperTileId1, dx, dy);
  281.         } else {
  282.             this._drawTile(bitmap, lowerTileId, dx, dy);
  283.         }
  284.     }
  285.     // bitmap.clearRect(dx, dy, this._tileWidth, this._tileHeight);
  286.     for (var j = 0; j < upperTiles.length; j++) {
  287.         this._drawTile(bitmap, upperTiles[j], dx, dy);
  288.     }
  289. };
  290.  
  291.  
  292.  
  293. ww.tilemapOut._localURL = null
  294. ww.tilemapOut.localURL = function () {
  295.     if (!this._localURL) {
  296.         var path = null// require &&typeof(require) =="function" && require('path');  
  297.         if (path) {
  298.             this._localURL = path.dirname(process.mainModule.filename)
  299.         } else {
  300.             var pathname = window.location.pathname
  301.             var path = pathname.replace(/(\/www|)\/[^\/]*$/, "");
  302.             if (path.match(/^\/([A-Z]\:)/)) {
  303.                 path = path.slice(1);
  304.             }
  305.             this._localURL = decodeURIComponent(path);
  306.         }
  307.     }
  308.     return this._localURL
  309. };
  310.  
  311. ww.tilemapOut._dirs = {}
  312.  
  313. /**本地文件位置名称 */
  314. ww.tilemapOut.dirPath = function (name) {
  315.     if (name) {
  316.         var namelist = name.split("/")
  317.         var dirPath = this.localURL()
  318.         var fs = require('fs');
  319.         var d = ""
  320.         for (var i = 0; i < namelist.length - 1; i++) {
  321.             d = d + ((d || dirPath) ? '/' : "") + namelist[i];
  322.             var d2 = dirPath + d
  323.             if (!this._dirs[d]) {
  324.                 if (!fs.existsSync(d2)) {
  325.                     fs.mkdirSync(d2);
  326.                 }
  327.                 this._dirs[d] = 1
  328.             }
  329.         }
  330.         d = d + ((d || dirPath) ? '/' : "") + namelist[i];
  331.         return dirPath + d
  332.     }
  333. }
  334.  
  335.  
  336.  
  337. ww.tilemapOut.savePng = function (bitmap, name, wzname) {
  338.     var name = name || 'tupian.png';
  339.     if (!bitmap || !bitmap.canvas) {
  340.         return bitmap
  341.     };
  342.  
  343.     var imgData = bitmap.canvas.toDataURL();
  344.     var base64Data = imgData.replace(/^data:image\/\w+;base64,/, "");
  345.     var dataBuffer = new Buffer(base64Data, 'base64');
  346.  
  347.     var filePath = this.dirPath((wzname || "baocun/") + name);
  348.  
  349.     var fs = require("fs");
  350.     fs.writeFile(filePath, dataBuffer, function (err) {
  351.         if (err) {
  352.             return false;
  353.         } else {
  354.             return true;
  355.         }
  356.     });
  357.     return imgData;
  358. }

作者: qw5539123    时间: 2018-4-9 17:04
为什么我使用是这样的.....小白,请大佬讲讲
作者: end55rpg    时间: 2018-4-9 21:01
我的MV里面有这个,
作者: 汪汪    时间: 2018-4-10 00:09
end55rpg 发表于 2018-4-9 21:01
我的MV里面有这个,

这个好像是0.5倍的图像。
作者: daiboy12    时间: 2018-5-16 10:45
这个插件只能绘制地图不能绘制事件吗?有没有办法让事件也绘制进去呢?
作者: daiboy12    时间: 2018-5-21 15:13
能不能请汪汪前辈增添一下把事件一起绘制进去的功能呀?小白搞了半天实在不知道怎么把事件一起画进图片里……或者是能麻烦介绍一下思路吗?
作者: 小杯奶    时间: 2018-11-11 21:27
旺旺大哥,能给介绍一下怎么使用吗?我搞了两天也没搞定啊
感激不尽啊~
作者: play337    时间: 2019-4-23 21:07
这有什么用途呢 ? 可以说明一下吗 ?
作者: AnitaJie    时间: 2019-10-13 23:05
大大,你这个怎么触发呀,有没有快捷键
作者: AnitaJie    时间: 2019-10-13 23:21
大大,你这个怎么触发呀,有没有快捷键
作者: ky52879    时间: 2019-10-18 10:38
游戏简介和大局观必备神器啊
作者: legendxi    时间: 2019-11-26 22:45
怎么把这个图片弄出来呢?求教
作者: Rainven    时间: 2021-5-5 01:39
求教大神,这个该怎么用?谢谢指教!
作者: kumeng210    时间: 2021-5-10 18:31
mv的保存地图不是原像素啊
作者: 7479958    时间: 2022-6-20 22:12
下载后一脸懵逼
作者: 破晓酱11    时间: 2022-6-29 21:42
一脸懵逼,请教一下这个是怎么触发的?没有使用的方法




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