mota-js/drawMapGUI.html
2017-12-21 01:11:36 +08:00

1022 lines
29 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<style>
html,body,div,img{margin:0;padding:0;}
body{
font-family:Roboto,Helvetica,Arial,sans-serif;
background-color: #F5F5F5;
}
.main {
max-width: 100%;
min-height: 500px;
margin: 0 auto;
}
#left, #mid, #right{
border-radius: 2px;
box-sizing: border-box;
box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 3px 1px -2px rgba(0,0,0,.2), 0 1px 5px 0 rgba(0,0,0,.12);
}
#left{
position: absolute;
left: 5px;
top: 10px;
width: 430px;
height: 400px;
/* border: 1px solid rgb(238, 13, 13); */
}
#left span{
display: block;
position: absolute;
color: red;
}
#left .col{
top: 2px;
left: 20px;
font-size: 13px;
color: blue;
}
#left .row{
width: 10px;
left: 0px;
top: 25px;
font-size: 13px;
text-align: right;
}
#editArea{
position: absolute;
width: 100%;
height: 70%;
left: 0;
top: 0;
/* padding: 10px 5px; */
box-sizing: border-box;
}
#pout{
display: block;
width: 408px;
height: 100%;
box-sizing: border-box;
margin-left: 15px;
margin-top: 20px;
}
#editTip{
position: absolute;
width: 50%;
height: 80px;
bottom:10px;
right: 10px;
}
#editTip p{
margin: 10px 0;
/* display: block; */
line-height: 30px;
text-align: right;
font-size: 14px;
}
#editTip .btn{
margin-left: 60%;
margin-top: 0;
}
#mid{
position: absolute;
left: 448px;
top: 0;
width: 416px;
height: 620px;
/* border: 1px solid rgb(238, 13, 13); */
}
#mid .tools{
position: absolute;
width: 400px;
height: 195px;
left: 0;
top: 425px;
border-top: 1px solid #ccc;
padding: 10px 5px;
margin-left: 8px;;
box-sizing: border-box;
}
#tip{
float: right;
width: 50%;
height: 95%;
padding: 10px;
margin-right: 5px;
box-sizing: border-box;
border: 1px solid #ccc;
border-radius: 2px;
font-size: 15px;
}
.files {
width: 50%;
height: 120px;
/* padding: 10px; */
margin-top: 15px;
}
.files .input{
display: block;
max-width: 150px;
height: 20px;
padding: 6px 12px;
font-size: 14px;
margin-top: 10px;
color: #555;
background-color: #fff;
border: 1px solid #ccc;
border-radius: 3px;
box-shadow: inset 0 1px 1px rgba(0,0,0,.075);
}
#printOut{
margin-top: 10px;
height: 20px;
}
.btn {
width: 80px;
border-radius: 2px;
line-height: 30px;
margin: 0;
min-width: 50px;
padding: 0 5px;
display: inline-block;
font-size: 11px;
font-weight: 400;
text-transform: uppercase;
letter-spacing: 0;
overflow: hidden;
cursor: pointer;
text-decoration: none;
text-align: center;
vertical-align: middle;
border: 0;
background: rgba(158,158,158,.2);
box-shadow: 0 1px 1px 0 rgba(0,0,0,.14), 0 2px 1px -1px rgba(0,0,0,.2), 0 1px 3px 0 rgba(0,0,0,.12);
color: #fff;
background-color: #26A69A;
}
.btn:hover {
background-color: #009688;
box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 3px 1px -2px rgba(0,0,0,.2), 0 1px 5px 0 rgba(0,0,0,.12);
}
#right{
position: absolute;
left: 896px;
top: 0;
width: 450px;
height: 620px;
/* border: 1px solid rgb(238, 13, 13); */
overflow:auto;
}
.gameCanvas {
position: absolute;
}
#dataSelection{
position: absolute;
top:0;
left:320px;
z-index:75;
width:32px;height:32px;
margin:-2px 0 0 -2px;
padding:0;
/* display: none; */
background-color:rgba(255, 255, 255, 0.0);
border: 2px solid rgb(87, 198, 232);
box-shadow: 0px 0px 2px rgb(87, 198, 232);
}
.warnText{
color: #D50000;
font-weight: 700;
}
.infoText{
color: #2196F3;
}
.successText{
color: #00897B
}
/* for vue dom */
[v-cloak] {
display: none !important;
}
</style>
</head>
<body>
<div class="main">
<div id="left">
<div id="editArea">
<span class="col" id='numMark'></span>
<span class="row">0 1 2 3 4 5 6 7 8 9 10 11 12</span>
<textarea cols="10" rows="10" id="pout" v-model="mapArr"></textarea>
<p class="warnText" v-cloak>{{ errormsg }}</p>
</div>
<div id="editTip" v-cloak>
<input class='btn' type="button" value="copyMap" v-on:click="copyMap"/>
<!-- <p v-bind:class="[ hasError ? 'warnText' : 'infoText']" v-show="isShow">{{ message }}</p> -->
</div>
</div>
<div id="mid">
<div class="map">
<canvas class='gameCanvas' id='bg' width='416' height='416' style='z-index:1'></canvas>
<canvas class='gameCanvas' id='eventLayer' width='416' height='416' style='z-index:2'></canvas>
<canvas class='gameCanvas' id='ui' width='416' height='416' style='z-index:100'></canvas>
</div>
<div class="tools">
<div id="tip" v-cloak >
<div v-if="isSelectedBlock" >
<p v-if="hasId">图块编号:<span class="infoText">{{ infos['idnum'] }}</span></p>
<p v-if="hasId">图块ID<span class="infoText">{{ infos['id'] }}</span></p>
<p v-else class="warnText">该图块无对应的数字或ID存在请先前往icons.js和maps.js中进行定义</p>
<p>图块所在素材:<span class="infoText">{{ infos['images'] }}</span></p>
<p>图块索引:<span class="infoText">{{ infos['y'] }}</span></p>
</div>
<div v-else>
<p v-if="whichShow" v-bind:class="[ (whichShow%2) ? 'warnText' : 'successText']" >{{ mapMsg }}</p>
</div>
</div>
<input class='btn' id='clear' type="button" value="clearMap" v-on:click="clearMap"/>
<input class='btn' type="button" value="exportMap" id="exportM" v-on:click="exportMap"/>
<div class="files">
<input class='btn' type="button" value="read" onclick="readUTF8file(pin.value)" />
<input class='btn' type="button" value="write" onclick="writeUTF8file(pin.value,pout.innerText)" />
<input class='input' id='pin' placeholder="请输入文件名"/>
<div id="printOut"></div>
</div>
</div>
</div>
<div id="right">
<canvas class='gameCanvas' id='data' width='416' height='416' style='z-index:0'></canvas>
<div id="selectBox">
<div id='dataSelection' v-show="isSelected"></div>
</div>
</div>
</div>
<script>main={'instance':{}}</script>
<script src='libs/icons.js'></script>
<script src='libs/maps.js'></script>
<!-- <script src='ibs/vendor/vue.min.js'></script> -->
<script src="https://unpkg.com/vue"></script>
<script>
main.instance.icons.init();//不知道为什么,需要手动init,明明maps是正常的
icons=main.instance.icons.getIcons();
var ids = [], indexs = []
ids.push({'idnum':0,'id':'ground','images':'terrains','y':0});
var point = 0
for(var i=0; i<400; i++){
var indexBlock = main.instance.maps.getBlock(0,0,i);
indexs[i] = [];
if('event' in indexBlock){
var id = indexBlock.event.id;
var indexId = indexBlock.id;
if(id=='autotile'){
ids.push({'idnum':indexId,'id':'autotile','images':'autotile','y':0});
point++;
indexs[i].push(point);
continue;
}
var allCls = Object.keys(icons);
for(var j=0; j<allCls.length; j++){
if(id in icons[allCls[j]] ){
ids.push({'idnum':indexId,'id':id,'images':allCls[j],'y':icons[allCls[j]][id]});
point++;
indexs[i].push(point);
}
}
}
}
// 生成数组定位编号
var str = ' ';
for(var i=0; i<13; i++){
var strNum = String(i);
str += Array(8-strNum.length).join('&nbsp;') + strNum;
}
numMark.innerHTML = str;
</script>
<script>
(function(){
core={};
core.material={};
core.material.images = {};
core.images=['terrains','animates', 'enemys', 'items', 'npcs', ];
var loadedImageNum=0;
core.loadImage = function (imgName, callback) {
try {
var image = new Image();
image.src = 'images/' + imgName + '.png';
if (image.complete) {
callback(imgName, image);
return;
}
image.onload = function () {
callback(imgName, image);
}
}
catch (e) {
alert(e);
}
}
for (var i = 0; i < core.images.length; i++) {
core.loadImage(core.images[i], function (imgName, image) {
imgName = imgName.split('-');
imgName = imgName[0];
core.material.images[imgName] = image;
loadedImageNum++;
if (loadedImageNum == core.images.length) {importGrass();}
});
}
})();
//context.drawImage(img,sx,sy,swidth,sheight,x,y,width,height)
</script>
<script type="text/javascript">
//预处理草的源图片
importGrass=function(){
autotile = new Image();
autotile.src = "images/autotile.png"
autotile.onload = function () {
console.log("loaded")
drawInitData();
};
function drawAutotile(canvas, x, y, size, autotile, index) {
switch (index) {
case 0:
canvas.drawImage(autotile, 0, 0, 32, 32, x, y, size, size);
break;
case 1:
canvas.drawImage(autotile, 0, 3 * 32, 16, 32, x, y, size / 2, size);
canvas.drawImage(autotile, 2 * 32 + 16, 3 * 32, 16, 32, x + size / 2, y, size / 2, size);
break;
case 2:
canvas.drawImage(autotile, 2 * 32, 32, 32, 16, x, y, size, size / 2);
canvas.drawImage(autotile, 2 * 32, 3 * 32 + 16, 32, 16, x, y + size / 2, size, size / 2);
break;
case 3:
canvas.drawImage(autotile, 2 * 32, 3 * 32, 32, 32, x, y, size, size);
break;
case 4:
canvas.drawImage(autotile, 0, 1 * 32, 16, 32, x, y, size / 2, size);
canvas.drawImage(autotile, 2 * 32 + 16, 1 * 32, 16, 32, x + size / 2, y, size / 2, size);
break;
case 5:
canvas.drawImage(autotile, 0, 2 * 32, 16, 32, x, y, size / 2, size);
canvas.drawImage(autotile, 2 * 32 + 16, 2 * 32, 16, 32, x + size / 2, y, size / 2, size);
break;
case 6:
canvas.drawImage(autotile, 2 * 32, 1 * 32, 32, 32, x, y, size, size);
break;
case 7:
canvas.drawImage(autotile, 2 * 32, 2 * 32, 32, 32, x, y, size, size);
break;
case 8:
canvas.drawImage(autotile, 0, 32, 32, 16, x, y, size, size / 2);
canvas.drawImage(autotile, 0, 3 * 32 + 16, 32, 16, x, y + size / 2, size, size / 2);
break;
case 9:
canvas.drawImage(autotile, 0, 3 * 32, 32, 32, x, y, size, size);
break;
case 10:
canvas.drawImage(autotile, 32, 32, 32, 16, x, y, size, size / 2);
canvas.drawImage(autotile, 32, 3 * 32 + 16, 32, 16, x, y + size / 2, size, size / 2);
break;
case 11:
canvas.drawImage(autotile, 32, 3 * 32, 32, 32, x, y, size, size);
break;
case 12:
canvas.drawImage(autotile, 0, 32, 32, 32, x, y, size, size);
break;
case 13:
canvas.drawImage(autotile, 0, 2 * 32, 32, 32, x, y, size, size);
break;
case 14:
canvas.drawImage(autotile, 32, 32, 32, 32, x, y, size, size);
break;
case 15:
canvas.drawImage(autotile, 32, 2 * 32, 32, 32, x, y, size, size);
break;
case 16:
canvas.clearRect(x, y, size / 2, size / 2);
canvas.drawImage(autotile, 2 * 32, 0, 16, 16, x, y, size / 2, size / 2);
break;
case 17:
canvas.clearRect(x, y, size / 2, size / 2);
canvas.drawImage(autotile, 2 * 32 + 16, 0, 16, 16, x, y, size / 2, size / 2);
break;
case 18:
canvas.clearRect(x, y, size / 2, size / 2);
canvas.drawImage(autotile, 2 * 32 + 16, 16, 16, 16, x, y, size / 2, size / 2);
break;
case 19:
canvas.clearRect(x, y, size / 2, size / 2);
canvas.drawImage(autotile, 2 * 32, 16, 16, 16, x, y, size / 2, size / 2);
break;
}
}
//根据状态画图
var cxt = eventLayer.getContext("2d");
grass = function (ii, x, y) {
cxt.clearRect(x * 32, y * 32, 32, 32);
// cxt.putImageData(grassImageData[ii], x * 32, y * 32);
drawAutotile(cxt, x * 32, y * 32, 32, autotile, ii);
}
//function clearGrass() { cxt.clearRect(0, 0, 416, 416); }
fullX = 12;
fullY = 12;
map = [];//-2表示边界,0表示空地,其他对象对应实体
map[fullX + 1 + fullY * (fullX + 1)] = -2;
for(var ii=0;ii<fullX + 1 + fullY * (fullX + 1);ii++)map[ii]=0;
m = function (x, y) {
if (x < 0 || x > fullX || y < 0 || y > fullY) return fullX + 1 + fullY * (fullX + 1);
return x + y * (fullX + 1);
}
isGrass = function (xx, yy) {
var mapxy=map[m(xx,yy)];
if (typeof(mapxy) == typeof(-1) || typeof(mapxy) == typeof([][0]))return 0;
if (mapxy.images=='autotile')return 1;
return 0;
}
updateMap = function () {
//clearGrass();
// console.log(map)
for (var xx = 0; xx <= fullX; xx++) {
for (var yy = 0; yy <= fullY; yy++) {
if (!isGrass(xx, yy)) continue;
var _id = 0;
_id += isGrass(xx, yy - 1) + 2 * isGrass(xx - 1, yy) + 4 * isGrass(xx, yy + 1) + 8 * isGrass(xx + 1, yy);
//1上2左4下8右
grass(_id, xx, yy);
}
}
for (var xx = 0; xx < fullX; xx++) {
for (var yy = 0; yy < fullY; yy++) {
if (isGrass(xx, yy) + isGrass(xx + 1, yy) + isGrass(xx + 1, yy + 1) + isGrass(xx, yy + 1) != 3) continue;
if (!isGrass(xx, yy)) {
// cxt.clearRect(xx * 32 + 32, yy * 32 + 32, 16, 16);
// cxt.putImageData(grassImageData[16], xx * 32 + 32, yy * 32 + 32);
drawAutotile(cxt, xx * 32 + 32, yy * 32 + 32, 32, autotile, 16);
}
if (!isGrass(xx + 1, yy)) {
// cxt.clearRect(xx * 32 + 16, yy * 32 + 32, 16, 16);
//cxt.putImageData(grassImageData[17], xx * 32 + 16, yy * 32 + 32);
drawAutotile(cxt, xx * 32 + 16, yy * 32 + 32, 32, autotile, 17);
}
if (!isGrass(xx + 1, yy + 1)) {
// cxt.clearRect(xx * 32 + 16, yy * 32 + 16, 16, 16);
// cxt.putImageData(grassImageData[18], xx * 32 + 16, yy * 32 + 16);
drawAutotile(cxt, xx * 32 + 16, yy * 32 + 16, 32, autotile, 18);
}
if (!isGrass(xx, yy + 1)) {
// cxt.clearRect(xx * 32 + 32, yy * 32 + 16, 16, 16);
// cxt.putImageData(grassImageData[19], xx * 32 + 32, yy * 32 + 16);
drawAutotile(cxt, xx * 32 + 32, yy * 32 + 16, 32, autotile, 19);
}
}
}
for (var xx = 0; xx <= fullX; xx++) {
for (var yy = 0; yy <= fullY; yy++) {
if (isGrass(xx, yy)) continue;
var mapxy=map[m(xx,yy)];
if (typeof(mapxy) == typeof(-1))continue;
else if(typeof(mapxy) == typeof([][0])) {//未定义块画红块
cxt.fillStyle = 'red';
cxt.fillRect(xx*32, yy*32, 32, 32);
continue;
}
//context.drawImage(img,sx,sy,swidth,sheight,x,y,width,height)
cxt.clearRect(xx*32, yy*32, 32, 32);
cxt.drawImage(core.material.images[mapxy.images], 0, mapxy.y*32, 32, 32, xx*32, yy*32, 32, 32);
}
}
}
}
</script>
<script>
//画背景以及拖拽相关的支持
printf = function(str,weak) {
var prefix='<span class="result">',postfix='</span>';
if (weak){prefix='<span class="weakresult">';}
if (typeof(str)==="undefined")str='';
printOut.innerHTML=prefix+String(str)+postfix;
}
drawInitData = function(){
var ratio=1;
var images=core.material.images;
maxHeight=700;
sumWidth=0;
widthsX={};
for(var ii=0;ii<core.images.length;ii++){
var img=core.images[ii];
widthsX[img]=[img,sumWidth/32,(sumWidth+images[img].width)/32];
sumWidth+=images[img].width;
maxHeight=Math.max(maxHeight,images[img].height);
}
widthsX['autotile']=['autotile',sumWidth/32,(sumWidth+3*32)/32];
sumWidth+=3*32;
var fullWidth=~~(sumWidth*ratio);
var fullHeight=~~(maxHeight*ratio);
// data.style.width = (data.width = fullWidth)/ratio + 'px';
data.style.height = (data.height = fullHeight)/ratio + 'px';
var dc = data.getContext('2d');
var bgc = bg.getContext('2d');
//var colorA = ["#f8f8f8", "#cccccc"];
//var colorIndex = 1;
//在data内画一个13*13的灰白相间的格子
for (var ii = 0; ii < 13; ii++)
for (var jj = 0; jj < 13; jj++) {
//dc.fillStyle = colorA[colorIndex];
//colorIndex = 1 - colorIndex;
//dc.fillRect(ii * 32, jj * 32, 32, 32);
bgc.drawImage(core.material.images['terrains'], 0, 0, 32, 32, ii*32, jj*32, 32, 32);
}
var nowx=0;
for(var ii=0;ii<core.images.length;ii++){
var img=core.images[ii];
dc.drawImage(images[img], nowx, 0)
nowx+=images[img].width;
}
dc.drawImage(autotile, nowx, 0)
};
(function () {
var uc = ui.getContext('2d');
function fillPos(pos) {
uc.fillStyle = '#' + ~~(Math.random() * 8) + ~~(Math.random() * 8) + ~~(Math.random() * 8);
uc.fillRect(pos.x * 32 + 12, pos.y * 32 + 12, 8, 8);
}//在格子内画一个随机色块
function eToLoc(e) {
var loc = {
'x': document.documentElement.scrollLeft+e.clientX - mid.offsetLeft,
'y': document.documentElement.scrollTop+e.clientY - mid.offsetTop,
'size': 32
};
return loc; }//返回可用的组件内坐标
function locToPos(loc) {
pos = { 'x': ~~(loc.x / loc.size), 'y': ~~(loc.y / loc.size) }
return pos;
}
var holdingPath = 0;
var stepPostfix = null;//用于存放寻路检测的第一个点之后的后续移动
var mouseOutCheck = 2;
function clear1() {
if (mouseOutCheck > 1) {
mouseOutCheck--;
setTimeout(clear1, 1000);
return;
}
holdingPath = 0;
stepPostfix = [];
uc.clearRect(0, 0, 416, 416);
}//用于鼠标移出canvas时的自动清除状态
ui.onmousedown = function (e) {
if(!selectBox.isSelected) {
tip.whichShow = 1;
return;
}
holdingPath = 1;
mouseOutCheck = 2;
setTimeout(clear1);
e.stopPropagation();
uc.clearRect(0, 0, 416, 416);
var loc = eToLoc(e);
pos = locToPos(loc)
stepPostfix = [];
stepPostfix.push(pos);
fillPos(pos);
}
ui.onmousemove = function (e) {
if(!selectBox.isSelected) {
// tip.whichShow = 1;
return;
}
if (holdingPath == 0) { return; }
mouseOutCheck = 2;
e.stopPropagation();
var loc = eToLoc(e);
var pos = locToPos(loc);
var pos0 = stepPostfix[stepPostfix.length - 1]
var directionDistance = [pos.y - pos0.y, pos0.x - pos.x, pos0.y - pos.y, pos.x - pos0.x]
var max = 0, index = 4;
for (var i = 0; i < 4; i++) {
if (directionDistance[i] > max) {
index = i;
max = directionDistance[i];
}
}
pos = [{ 'x': 0, 'y': 1 }, { 'x': -1, 'y': 0 }, { 'x': 0, 'y': -1 }, { 'x': 1, 'y': 0 }, false][index]
if (pos) {
pos.x += pos0.x;
pos.y += pos0.y;
stepPostfix.push(pos);
fillPos(pos);
}
}
ui.onmouseup = function (e) {
if(!selectBox.isSelected) {
tip.whichShow = 1;
return;
}
holdingPath = 0;
e.stopPropagation();
var loc = eToLoc(e);
if (stepPostfix.length) {
// console.log(stepPostfix);
for (var ii = 0; ii < stepPostfix.length; ii++)
map[m(stepPostfix[ii].x, stepPostfix[ii].y)] = info;
map[fullX + 1 + fullY * (fullX + 1)] = -2;
// console.log(map);
updateMap();
holdingPath = 0;
stepPostfix = [];
uc.clearRect(0, 0, 416, 416);
}
}
// info=ids[indexs[20][0]];//autotile
data.onmousedown = function (e) {
e.stopPropagation();
var loc = {
'x': document.documentElement.scrollLeft + e.clientX - right.offsetLeft,
'y': document.documentElement.scrollTop + right.scrollTop+e.clientY - right.offsetTop,
'size': 32
};
pos = locToPos(loc);
// console.log(pos);
for (var spriter in widthsX){
if(pos.x>=widthsX[spriter][1] && pos.x<widthsX[spriter][2]){
pos.x=widthsX[spriter][1];
pos.images=widthsX[spriter][0];
if(pos.images=='autotile'){
pos.y=0;
}else if((pos.y+1)*32>core.material.images[pos.images].height)
pos.y=~~(core.material.images[pos.images].height/32)-1;
selectBox.isSelected = true;
// console.log(pos,core.material.images[pos.images].height)
dataSelection.style.left=pos.x*32+'px';
dataSelection.style.top=pos.y*32+'px';
info={'images':pos.images,'y':pos.y};
for (var ii=0;ii<ids.length;ii++){
if(pos.images==ids[ii].images && pos.y==ids[ii].y)
info = JSON.parse(JSON.stringify(ids[ii]));
}
tip.infos = info;
}
}
}
})();
</script>
<script type="text/javascript">
//var timecheck=0;
postsomething = function (data,callback) {
//if(timecheck!==0)return;
//timecheck=1;
setTimeout(function(){timecheck=0},5000);
var xhr = function(){
if (window.XMLHttpRequest) {
return new XMLHttpRequest();
}else{
return new ActiveObject('Micrsorf.XMLHttp');
}
}();
xhr.onreadystatechange = function(){
switch(xhr.readyState){
case 0 :
printf('waiting... ','weak');
break;
case 1 :
printf('waiting ...','weak');
break;
case 2 :
printf('waiting... ','weak');
break;
case 3 :
printf('waiting ...','weak');
break;
case 4 :
if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {
printf(xhr.responseText);
if (Boolean(callback))callback(xhr.responseText);
}else{
printf('error:' + xhr.status+'<br>'+(xhr.responseText||''),'weak');
}
//timecheck=0;
break;
}
}
xhr.open('post','http://127.0.0.1');
xhr.setRequestHeader('Content-Type','text/plain');
if(typeof(data)==typeof([][0]) || data==null)data=JSON.stringify({1:2});
xhr.send(data);
}
function readUTF8file(filename,callback){
data={};
data.name='readUTF8file';
data.func='open';
data.args=[String(filename)];
postsomething(JSON.stringify(data),callback);
}
function writeUTF8file(filename,filestr,callback){
data={};
data.name='writeUTF8file';
data.func='open';
data.args=[String(filename),String(filestr)];
postsomething(JSON.stringify(data),callback);
}
</script>
<script type="text/javascript">
document.body.onmousedown = function(e){
selectBox.isSelected = false;
info = {};
}
var exportM = new Vue({
el: '#exportM',
methods: {
exportMap: function(){
var filestr='';
for (var yy = 0; yy < 13; yy++){
filestr+='['
for (var xx = 0; xx < 13; xx++) {
var mapxy=map[m(xx,yy)];
if(typeof(mapxy)==typeof({})){
if ('idnum' in mapxy)mapxy=mapxy.idnum;
else {
// mapxy='!!?';
tip.whichShow = 3;
return;
}
}else if(typeof(mapxy)=='undefined'){
tip.whichShow = 3;
return;
}
mapxy=String(mapxy);
mapxy=Array(Math.max(4-mapxy.length,0)).join(' ')+mapxy;
filestr+=mapxy+(xx==12?'':',')
}
filestr+=(']'+(yy==12?'':',')+'\n')
}
pout.value = filestr;
tip.whichShow = 2;
}
}
})
var editArea = new Vue({
el: '#editArea',
data: {
mapArr: '',
errormsg: '',
errors: [ // 编号1,2,3,4
"格式错误,请使用正确格式",
"当前ID未定义在地图区域显示红块请修改ID或者到icons.js和maps.js中进行定义",
"编号错误当前编辑器暂时支持编号小于400请修改编号"
],
error: 0,
timer: null,
},
watch: {
mapArr: function () {
var self = this;
setTimeout(function(){
self.drawMap();
tip.whichShow = 8
}, 1000);
},
error: function(){
var that = this;
that.errormsg = '';
if(that.error)
that.errormsg = that.errors[that.error-1];
clearTimeout(that.timer);
that.timer = setTimeout(function() {
tip.error = 0;
}, 5000); //5秒后自动清除
}
},
methods: {
drawMap: function(){
var that = this;
if(that.formatArr){
var mapArray;
var arr = that.mapArr.replace(/\s/g, '');
var mapJson = '{"mapArr":['+arr+']}';
try{
mapArray = JSON.parse(mapJson).mapArr;
}catch (e) {
that.errors[3] = '发生错误!'+e;
that.error = 4;
return;
}
for(var y=0; y<mapArray.length; y++)
for(var x=0; x<mapArray[y].length; x++){
var num = mapArray[y][x];
if(num == 0 )
map[m(x, y)] = 0;
else if(num >= 400){
that.error = 3;
map[m(x, y)] = 'undefined';
}else if(indexs[num][0] == ''){
that.error = 2;
map[m(x, y)] = 'undefined';
}else map[m(x, y)] = ids[[indexs[num][0]]];
}
updateMap();
}else{
that.error = 1;
}
},
formatArr: function(){
var formatArr = '';
var arr = this.mapArr.replace(/\s/g, '').split('],[');
if(arr.length != 13) return false;
else {
for(var i =0; i<13; i++){
var a = [];
formatArr +='[';
if(i==0||i==12) a = arr[i].split(/\D/).join(' ').trim().split(' ');
else a = arr[i].split(/\D/);
if(a.length != 13){
formatArr = '';
return false;
}
else {
for(var k=0; k<13; k++){
formatArr = Array(Math.max(4-mapxy.length,0)).join(' ')+a[k];
filestr+=a[k]+(k==12?'':',')
}
}
formatArr += (']'+(i==12?'':',')+'\n');
}
this.mapArr = formatArr;
return true;
}
}
}
});
var editTip = new Vue({
el: '#editTip',
data: {
// message: ''
},
methods: {
copyMap: function(){
this.message = '';
tip.whichShow = 0;
if(pout.value.trim() != ''){
try{
pout.select();
document.execCommand("Copy");
tip.whichShow = 6;
}catch(e){
this.error= e;
tip.whichShow = 5;
}
}else{
tip.whichShow = 7;
}
}
},
})
var clear = new Vue({
el: '#clear',
methods: {
clearMap: function(){
map[fullX + 1 + fullY * (fullX + 1)] = -2;
for(var ii=0;ii<fullX + 1 + fullY * (fullX + 1);ii++)map[ii]=0;
ec = eventLayer.getContext('2d');
ec.clearRect(0, 0, 416, 416);
pout.value = '';
tip.whichShow = 4;
}
}
})
var tip = new Vue({
el: '#tip',
data: {
infos: ids[indexs[20][0]],
hasId: true,
isSelectedBlock: false,
geneMapSuccess: false,
timer: null,
msgs: [ //分别编号1,2,3,4,5,6奇数警告偶数成功
"当前未选择任何图块,请先在右边选择要画的图块!",
"生成地图成功!可点击复制按钮复制地图数组到剪切板",
"生成失败! 地图中有未定义的图块,建议先用其他有效图块覆盖或点击清除地图!",
"地图清除成功!",
"复制失败!"+editTip.error,
"复制成功!可直接粘贴到楼层文件的地图数组中。",
"复制失败!当前还没有数据",
"修改成功!可点击复制按钮复制地图数组到剪切板"
],
mapMsg: '',
whichShow: 0,
},
watch: {
infos: {
handler: function(val, oldval){
if(typeof(val) != 'undefined'){
this.infos = val;
if('id' in val){
this.hasId = true;
}else{
this.hasId = false;
}
}
},
deep: true
},
whichShow: function(){
var that = this;
that.mapMsg = '';
if(that.whichShow)
that.mapMsg = that.msgs[that.whichShow-1];
clearTimeout(that.timer);
that.timer = setTimeout(function() {
tip.whichShow = 0;
}, 5000); //5秒后自动清除
}
}
})
var selectBox = new Vue({
el: '#selectBox',
data: {
isSelected: false
},
watch: {
isSelected: function(){
tip.isSelectedBlock = this.isSelected;
}
}
})
</script>
</body>
</html>