diff --git a/_server/blockly/MotaAction.g4 b/_server/blockly/MotaAction.g4 index 917ed6e8..61bbe2a0 100644 --- a/_server/blockly/MotaAction.g4 +++ b/_server/blockly/MotaAction.g4 @@ -187,6 +187,8 @@ action | setValue_s | show_s | hide_s + | showFloorImg_s + | hideFloorImg_s | trigger_s | revisit_s | exit_s @@ -417,6 +419,68 @@ var code = '{"type": "hide"'+floorstr+IdString_0+''+Int_0+'},\n'; return code; */; +showFloorImg_s + : '显示贴图' 'x' EvalString? ',' 'y' EvalString? '楼层' IdString? Newline + + +/* showFloorImg_s +tooltip : showFloorImg: 显示一个贴图,xy为左上角坐标,可用逗号分隔表示多个点 +helpUrl : https://ckcz123.github.io/mota-js/#/event?id=showFloorImg%ef%bc%9a%e6%98%be%e7%a4%ba%e8%b4%b4%e5%9b%be +default : ["","",""] +colour : this.eventColor +var floorstr = ''; +if (EvalString_0 && EvalString_1) { + var pattern1 = /^flag:[0-9a-zA-Z_][0-9a-zA-Z_\-:]*$/; + if(pattern1.test(EvalString_0) || pattern1.test(EvalString_1)){ + EvalString_0=MotaActionFunctions.PosString_pre(EvalString_0); + EvalString_1=MotaActionFunctions.PosString_pre(EvalString_1); + EvalString_0=[EvalString_0,EvalString_1] + } else { + var pattern2 = /^([+-]?\d+)(,[+-]?\d+)*$/; + if(!pattern2.test(EvalString_0) || !pattern2.test(EvalString_1))throw new Error('坐标格式错误,请右键点击帮助查看格式'); + EvalString_0=EvalString_0.split(','); + EvalString_1=EvalString_1.split(','); + if(EvalString_0.length!==EvalString_1.length)throw new Error('坐标格式错误,请右键点击帮助查看格式'); + for(var ii=0;ii 如果写2的话,请确保图片高度是32的倍数! +楼层贴图可以被事件隐藏和显示,详见[隐藏贴图](event#hideFloorImg:隐藏贴图)的写法。 + **如果你需要让某些点不可通行(比如你建了个房子,墙壁和家具等位置不让通行),则需在`events`中指定`{"noPass": false}`,参见[自定义事件](event#自定义事件)的写法。** ``` js diff --git a/libs/core.js b/libs/core.js index fffadef6..585e3924 100644 --- a/libs/core.js +++ b/libs/core.js @@ -271,6 +271,7 @@ core.prototype.init = function (coreData, callback) { core.material.ground.src = "project/images/ground.png"; core.bigmap.tempCanvas = document.createElement('canvas').getContext('2d'); + core.getLocalForage("test"); core.loader.load(function () { console.log(core.material); diff --git a/libs/events.js b/libs/events.js index 225beb7c..1318c8d9 100644 --- a/libs/events.js +++ b/libs/events.js @@ -399,6 +399,26 @@ events.prototype.doAction = function() { } else this.doAction(); break; + case "showFloorImg": // 显示贴图 + if (!core.isset(data.loc)) + data.loc = [x,y]; + if ((typeof data.loc[0] == 'number' || typeof data.loc[0] == 'string') + && (typeof data.loc[1] == 'number' || typeof data.loc[1] == 'string')) + data.loc = [[core.calValue(data.loc[0]), core.calValue(data.loc[1])]]; + core.maps.setFloorImage("show", data.loc, data.floorId, function() { + core.events.doAction(); + }) + break; + case "hideFloorImg": // 隐藏贴图 + if (!core.isset(data.loc)) + data.loc = [x,y]; + if ((typeof data.loc[0] == 'number' || typeof data.loc[0] == 'string') + && (typeof data.loc[1] == 'number' || typeof data.loc[1] == 'string')) + data.loc = [[core.calValue(data.loc[0]), core.calValue(data.loc[1])]]; + core.maps.setFloorImage("hide", data.loc, data.floorId, function() { + core.events.doAction(); + }) + break; case "setBlock": // 设置某图块 { if (core.isset(data.loc)) { diff --git a/libs/maps.js b/libs/maps.js index dc134bb5..22d7a62a 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -361,7 +361,9 @@ maps.prototype.drawMap = function (mapName, callback) { } images.forEach(function (t) { var dx=parseInt(t[0]), dy=parseInt(t[1]), p=t[2]; - if (core.isset(dx) && core.isset(dy) && core.isset(core.material.images.images[p])) { + if (core.isset(dx) && core.isset(dy) && + !core.hasFlag("floorimg_"+mapName+"_"+dx+"_"+dy) && + core.isset(core.material.images.images[p])) { var image = core.material.images.images[p]; if (!t[3]) { if (/.*\.gif/i.test(p) && main.mode=='play') { @@ -1079,6 +1081,27 @@ maps.prototype.drawAnimate = function (name, x, y, callback) { }, 50); } +maps.prototype.setFloorImage = function (type, loc, floorId, callback) { + if (type!='show') type='hide'; + if (typeof loc[0] == 'number' && typeof loc[1] == 'number') + loc = [loc]; + floorId = floorId||core.status.floorId; + + if (loc.length==0) return; + loc.forEach(function (t) { + var x=t[0], y=t[1]; + var flag = "floorimg_"+floorId+"_"+x+"_"+y; + core.setFlag(flag, type=='show'?false:true); + }) + + if (floorId==core.status.floorId) { + core.drawMap(floorId, callback); + } + else { + if (core.isset(callback)) callback(); + } +} + maps.prototype.resetMap = function(floorId) { var floorId = floorId||core.status.floorId; core.status.maps[floorId] = this.loadFloor(floorId); diff --git a/libs/ui.js b/libs/ui.js index ed7fb0a3..f288089c 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -1842,7 +1842,9 @@ ui.prototype.drawThumbnail = function(floorId, canvas, blocks, x, y, size, cente } images.forEach(function (t) { var dx=parseInt(t[0]), dy=parseInt(t[1]), p=t[2]; - if (core.isset(dx) && core.isset(dy) && core.isset(core.material.images.images[p])) { + if (core.isset(dx) && core.isset(dy) && + !core.hasFlag("floorimg_"+floorId+"_"+dx+"_"+dy) && + core.isset(core.material.images.images[p])) { var image = core.material.images.images[p]; if (!t[3]) tempCanvas.drawImage(image, 32 * dx, 32 * dy, image.width, image.height); @@ -1880,7 +1882,9 @@ ui.prototype.drawThumbnail = function(floorId, canvas, blocks, x, y, size, cente // draw fg images.forEach(function (t) { var dx=parseInt(t[0]), dy=parseInt(t[1]), p=t[2]; - if (core.isset(dx) && core.isset(dy) && core.isset(core.material.images.images[p])) { + if (core.isset(dx) && core.isset(dy) && + !core.hasFlag("floorimg_"+floorId+"_"+dx+"_"+dy) && + core.isset(core.material.images.images[p])) { var image = core.material.images.images[p]; if (t[3]==1) tempCanvas.drawImage(image, 32*dx, 32*dy, image.width, image.height); diff --git a/更新说明.txt b/更新说明.txt index ac87791a..95f29b75 100644 --- a/更新说明.txt +++ b/更新说明.txt @@ -3,6 +3,7 @@ 大地图的支持 突破了5M的存档空间大小限制 同点多事件的颜色块绘制 +可以隐藏和显示楼层贴图 录像播放时可以按PgUp/PgDn浏览地图 录像播放时对于瞬间移动绘制箭头 增加激光属性