function editor() { this.version = "2.0"; this.material = {}; } editor.prototype.init = function(callback){ var afterCoreReset = function(){ main.editor.disableGlobalAnimate=false;//允许GlobalAnimate /* core.setHeroMoveTriggerInterval(); */ editor.reset(function(){ editor.drawMapBg(); var mapArray = core.maps.save(core.status.maps,core.status.floorId); editor.map = mapArray.map(function(v){return v.map(function(v){return editor.ids[[editor.indexs[parseInt(v)][0]]]})}); editor.updateMap(); editor.currentFloorId=core.status.floorId; editor.currentFloorData = core.floors[core.status.floorId]; if (Boolean(callback))callback(); }); } var afterMainInit = function(){ core.floors=JSON.parse(JSON.stringify(core.floors,function(k,v){if(v instanceof Function){return v.toString()}else return v})); editor.main=main; editor.core=core; editor.fs=fs; editor_file = editor_file(editor, function() { editor.file=editor_file; editor_mode = editor_mode(editor); editor.mode=editor_mode; editor.material.images=core.material.images; editor.listen(); // 开始监听事件 core.resetStatus(core.firstData.hero, null, core.firstData.floorId, null, core.initStatus.maps); core.changeFloor(core.status.floorId, null, core.firstData.hero.loc, null, function() { afterCoreReset(); }, true); core.events.setInitData(null); }); } afterMainInit(); } editor.prototype.reset = function(callback){ editor.idsInit(core.maps, core.icons.icons); // 初始化图片素材信息 editor.drawInitData(core.icons.icons); // 初始化绘图 if(Boolean(callback))callback(); } editor.prototype.idsInit = function(maps, icons){ editor.ids = [0]; editor.indexs = []; var MAX_NUM = 400; var getInfoById = function(id){ var block = maps.initBlock(0, 0, id); if(hasOwnProp(block, 'event')){ return block; } } var point = 0; for(var i=0; i edata.width) edata.style.width = (edata.width = fullWidth)/ratio + 'px'; edata.style.height = (edata.height = fullHeight)/ratio + 'px'; var dc = edata.getContext('2d'); var nowx = 0; var nowy = 0; for(var ii=0; ii=0 && y >=0 && x<13 && y<13 && isAutotile(editor.map[y][x]) && editor.map[y][x].idnum == currId) return 1; else if(x<0 || y<0 || x>12 || y>12) return 1; //边界外视为通用autotile,这样好看些 else return 0; } var checkAround = function(x, y){ // 得到周围四个32*32块(周围每块都包含当前块的1/4,不清楚的话画下图你就明白)的数组索引 var currId = editor.map[y][x].idnum; var pointBlock = []; for(var i=0; i<4; i++){ var bsum = 0; var offsetx = i%2, offsety = ~~(i/2); for(var j=0; j<4; j++){ var mx = j%2, my = ~~(j/2); var b = getAutotileAroundId(currId, x+offsetx+mx-1, y+offsety+my-1); bsum += b*(Math.pow(2, 3-j)); } pointBlock.push(bsum); } return pointBlock; } var addIndexToAutotileInfo = function(x, y){ var indexArr = []; var pointBlocks = checkAround(x, y); for(var i=0; i<4; i++){ var arr = indexArrs[pointBlocks[i]] indexArr.push(arr[3-i]); } editor.map[y][x].blockIndex = indexArr; } var drawAutotile = function(ctx, x, y, info){ // 绘制一个autotile ctx.clearRect(x*32, y*32, 32, 32); //修正四个边角的固定搭配 if(info.blockIndex[0] == 13){ if(info.blockIndex[1] == 16) info.blockIndex[1] = 14; if(info.blockIndex[2] == 31) info.blockIndex[2] = 19; } if(info.blockIndex[1] == 18){ if(info.blockIndex[0] == 15) info.blockIndex[0] = 17; if(info.blockIndex[3] == 36) info.blockIndex[3] = 24; } if(info.blockIndex[2] == 43){ if(info.blockIndex[0] == 25) info.blockIndex[0] = 37; if(info.blockIndex[3] == 46) info.blockIndex[3] = 44; } if(info.blockIndex[3] == 48){ if(info.blockIndex[1] == 30) info.blockIndex[1] = 42; if(info.blockIndex[2] == 45) info.blockIndex[2] = 47; } for(var i=0; i<4; i++){ var index = info.blockIndex[i]; var dx = x*32 + 16*(i%2), dy = y*32 + 16*(~~(i/2)); drawBlockByIndex(ctx, dx, dy, editor.material.images[info.images][info.id], index); } } */ // 绘制地图 start var eventCtx = document.getElementById('event').getContext("2d"); for(var y=0; y<13; y++) for(var x=0; x<13; x++){ var tileInfo = editor.map[y][x]; if(false && isAutotile(tileInfo)){ addIndexToAutotileInfo(x, y); drawAutotile(eventCtx, x, y, tileInfo); }else drawTile(eventCtx, x, y, tileInfo); } // 绘制地图 end } editor.prototype.changeFloor = function(floorId,callback) { editor.currentFloorData.map = editor.map.map(function(v){return v.map(function(v){return v.idnum||v||0})}); core.changeFloor(floorId, null, core.firstData.hero.loc, null, function(){ editor.drawMapBg(); var mapArray = core.maps.save(core.status.maps,core.status.floorId); editor.map = mapArray.map(function(v){return v.map(function(v){return editor.ids[[editor.indexs[parseInt(v)][0]]]})}); editor.updateMap(); editor.currentFloorId=core.status.floorId; editor.currentFloorData = core.floors[core.status.floorId]; editor_mode.floor(); if (core.isset(callback))callback(); }); } editor.prototype.guid = function() { return 'id_'+'xxxxxxxx_xxxx_4xxx_yxxx_xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); return v.toString(16); }); } editor.prototype.listen = function() { var uc = eui.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 scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft var scrollTop = document.documentElement.scrollTop || document.body.scrollTop editor.loc = { 'x': scrollLeft+e.clientX - mid.offsetLeft-mapEdit.offsetLeft, 'y': scrollTop+e.clientY - mid.offsetTop-mapEdit.offsetTop, 'size': 32 }; return editor.loc; }//返回可用的组件内坐标 function locToPos(loc) { editor.pos = { 'x': ~~(loc.x / loc.size), 'y': ~~(loc.y / loc.size) } return editor.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时的自动清除状态 eui.onmousedown = function (e) { if(!selectBox.isSelected) { var loc = eToLoc(e); var pos = locToPos(loc); editor_mode.onmode('nextChange'); editor_mode.onmode('loc'); editor_mode.loc(); tip.whichShow = 1; return; } holdingPath = 1; mouseOutCheck = 2; setTimeout(clear1); e.stopPropagation(); uc.clearRect(0, 0, 416, 416); var loc = eToLoc(e); var pos = locToPos(loc); stepPostfix = []; stepPostfix.push(pos); fillPos(pos); } eui.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]; } } var 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); } } eui.onmouseup = function (e) { if(!selectBox.isSelected) { tip.whichShow = 1; return; } holdingPath = 0; e.stopPropagation(); var loc = eToLoc(e); if (stepPostfix.length) { preMapData = JSON.parse(JSON.stringify(editor.map)); currDrawData.pos = JSON.parse(JSON.stringify(stepPostfix)); currDrawData.info = JSON.parse(JSON.stringify(editor.info)); reDo = null; // console.log(stepPostfix); for (var ii = 0; ii < stepPostfix.length; ii++) editor.map[stepPostfix[ii].y][stepPostfix[ii].x] = editor.info; // console.log(editor.map); editor.updateMap(); holdingPath = 0; stepPostfix = []; uc.clearRect(0, 0, 416, 416); } } var preMapData = {}; var currDrawData = { pos: [], info: {} }; var reDo = null; document.body.onkeydown = function(e) { // 禁止快捷键的默认行为 if( e.ctrlKey && ( e.keyCode == 90 || e.keyCode == 89 ) ) e.preventDefault(); //Ctrl+z 撤销上一步undo if(e.keyCode == 90 && e.ctrlKey && preMapData && currDrawData.pos.length){ editor.map = JSON.parse(JSON.stringify(preMapData)); editor.updateMap(); reDo = JSON.parse(JSON.stringify(currDrawData)); currDrawData = {pos: [],info: {}}; preMapData = null; } //Ctrl+y 重做一步redo if(e.keyCode == 89 && e.ctrlKey && reDo && reDo.pos.length){ preMapData = JSON.parse(JSON.stringify(editor.map)); for(var j=0; j=editor.widthsX[spriter][1] && pos.x editor.widthsX[spriter][3]) pos.y = ~~(editor.widthsX[spriter][3]/32)-4; else{ for(var i=0; i= 4*i && pos.y < 4*(i+1)){ pos.images = imNames[i]; pos.y = 4*i; } } } }else if((pos.y+1)*32 > editor.widthsX[spriter][3]) pos.y = ~~(editor.widthsX[spriter][3]/32)-1; selectBox.isSelected = true; // console.log(pos,editor.material.images[pos.images].height) dataSelection.style.left = pos.x*32 +'px'; dataSelection.style.top = pos.y*32 +'px'; if(pos.x==0&&pos.y==0){ // editor.info={idnum:0, id:'empty','images':'清除块', 'y':0}; editor.info=0; }else{ if(hasOwnProp(autotiles, pos.images)) editor.info={'images':pos.images, 'y':0}; else if(pos.images == 'terrains') editor.info={'images':pos.images, 'y':pos.y-1}; else editor.info={'images':pos.images, 'y':pos.y}; for (var ii=0;ii