diff --git a/libs/maps.js b/libs/maps.js index 71f8cf36..d926b8df 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -939,53 +939,161 @@ maps.prototype._drawFloorImage = function (ctx, name, type, image, offsetX, widt ////// 绘制Autotile ////// maps.prototype._drawAutotile = function (ctx, mapArr, block, size, left, top, status) { - var indexArrs = [ //16种组合的图块索引数组; - // 将autotile分割成48块16*16的小块; 数组索引即对应各个小块 - // +----+----+----+----+----+----+ - [10, 9, 4, 3], //0 bin:0000 | 1 | 2 | 3 | 4 | 5 | 6 | - [10, 9, 4, 13], //1 bin:0001 +----+----+----+----+----+----+ - [10, 9, 18, 3], //2 bin:0010 | 7 | 8 | 9 | 10 | 11 | 12 | - [10, 9, 16, 15], //3 bin:0011 +----+----+----+----+----+----+ - [10, 43, 4, 3], //4 bin:0100 | 13 | 14 | 15 | 16 | 17 | 18 | - [10, 31, 4, 25], //5 bin:0101 +----+----+----+----+----+----+ - [10, 43, 18, 3], //6 bin:0110 | 19 | 20 | 21 | 22 | 23 | 24 | - [10, 31, 16, 5], //7 bin:0111 +----+----+----+----+----+----+ - [48, 9, 4, 3], //8 bin:1000 | 25 | 26 | 27 | 28 | 29 | 30 | - [48, 9, 4, 13], //9 bin:1001 +----+----+----+----+----+----+ - [36, 9, 30, 3], //10 bin:1010 | 31 | 32 | 33 | 34 | 35 | 36 | - [36, 9, 6, 15], //11 bin:1011 +----+----+----+----+----+----+ - [46, 45, 4, 3], //12 bin:1100 | 37 | 38 | 39 | 40 | 41 | 42 | - [46, 11, 4, 25], //13 bin:1101 +----+----+----+----+----+----+ - [12, 45, 30, 3], //14 bin:1110 | 43 | 44 | 45 | 46 | 47 | 48 | - [20, 23, 38, 41] //15 bin:1111 +----+----+----+----+----+----+ - ]; + var xx = block.x, yy = block.y; + var autotile = core.material.images['autotile'][block.event.id]; + status = status || 0; + status %= parseInt(autotile.width / 96); + var done = {}; + function drawAutotile(canvas, x, y, size, autotile, index) { + var data = []; + switch (index) { + case 0: + data.push([96 * status + 0, 0, 32, 32, x, y, size, size]); + break; + case 1: + data.push([96 * status + 0, 3 * 32, 16, 32, x, y, size / 2, size]); + data.push([96 * status + 2 * 32 + 16, 3 * 32, 16, 32, x + size / 2, y, size / 2, size]); + break; + case 2: + data.push([96 * status + 2 * 32, 32, 32, 16, x, y, size, size / 2]); + data.push([96 * status + 2 * 32, 3 * 32 + 16, 32, 16, x, y + size / 2, size, size / 2]); + break; + case 3: + data.push([96 * status + 2 * 32, 3 * 32, 32, 32, x, y, size, size]); + break; + case 4: + data.push([96 * status + 0, 1 * 32, 16, 32, x, y, size / 2, size]); + data.push([96 * status + 2 * 32 + 16, 1 * 32, 16, 32, x + size / 2, y, size / 2, size]); + break; + case 5: + data.push([96 * status + 0, 2 * 32, 16, 32, x, y, size / 2, size]); + data.push([96 * status + 2 * 32 + 16, 2 * 32, 16, 32, x + size / 2, y, size / 2, size]); + break; + case 6: + data.push([96 * status + 2 * 32, 1 * 32, 32, 32, x, y, size, size]); + break; + case 7: + data.push([96 * status + 2 * 32, 2 * 32, 32, 32, x, y, size, size]); + break; + case 8: + data.push([96 * status + 0, 32, 32, 16, x, y, size, size / 2]); + data.push([96 * status + 0, 3 * 32 + 16, 32, 16, x, y + size / 2, size, size / 2]); + break; + case 9: + data.push([96 * status + 0, 3 * 32, 32, 32, x, y, size, size]); + break; + case 10: + data.push([96 * status + 32, 32, 32, 16, x, y, size, size / 2]); + data.push([96 * status + 32, 3 * 32 + 16, 32, 16, x, y + size / 2, size, size / 2]); + break; + case 11: + data.push([96 * status + 32, 3 * 32, 32, 32, x, y, size, size]); + break; + case 12: + data.push([96 * status + 0, 32, 32, 32, x, y, size, size]); + break; + case 13: + data.push([96 * status + 0, 2 * 32, 32, 32, x, y, size, size]); + break; + case 14: + data.push([96 * status + 32, 32, 32, 32, x, y, size, size]); + break; + case 15: + data.push([96 * status + 32, 2 * 32, 32, 32, x, y, size, size]); + break; + case 16: + //canvas.clearRect(x, y, size / 2, size / 2); + data.push([96 * status + 2 * 32, 0, 16, 16, x, y, size / 2, size / 2]); + break; + case 17: + //canvas.clearRect(x, y, size / 2, size / 2); + data.push([96 * status + 2 * 32 + 16, 0, 16, 16, x, y, size / 2, size / 2]); + break; + case 18: + //canvas.clearRect(x, y, size / 2, size / 2); + data.push([96 * status + 2 * 32 + 16, 16, 16, 16, x, y, size / 2, size / 2]); + break; + case 19: + data.push([96 * status + 2 * 32, 16, 16, 16, x, y, size / 2, size / 2]); + break; + } + if(index>=16){ + canvas.drawImage(autotile, data[0][0], data[0][1], data[0][2], data[0][3], data[0][4], data[0][5], size/2, size/2); + return; + } + var drawData = []; + if(data.length == 2){ + var idx = 0; + var cut = 0; + for(var i in data){ + if(data[i][2] % 32){ // 是否纵切 + cut = 0; + } + else if(data[i][3] % 32){ // 是否横切 + cut = 1; + } + if(data[i][0] % 32 || data[i][1] % 32){ // right down + idx = 1; + }else{ // left top + idx = 0; + } + if(cut){ + idx *= 2; + if(!done[idx])drawData[idx] = [data[i][0], data[i][1]]; + if(!done[idx + 1])drawData[idx + 1] = [parseInt(data[i][0]) + 16, data[i][1]]; + }else{ + if(!done[idx])drawData[idx] = [data[i][0], data[i][1]]; + if(!done[idx + 2])drawData[idx + 2] = [data[i][0], parseInt(data[i][1]) + 16]; + } + + } + }else{ + if(!done[0])drawData[0] = [data[0][0], data[0][1]]; + if(!done[1])drawData[1] = [data[0][0] + 16, data[0][1]]; + if(!done[2])drawData[2] = [data[0][0], data[0][1] + 16]; + if(!done[3])drawData[3] = [data[0][0] + 16, data[0][1] + 16]; + } + [0,1,2,3].forEach(function(i){ + var dt = drawData[i];if(!dt)return; + canvas.drawImage(autotile, dt[0], dt[1], 16, 16, x + (i % 2) * size / 2, y + parseInt(i / 2) * size / 2, size/2, size/2); + }); - // 开始绘制autotile - var x = block.x, y = block.y; - var pieceIndexs = this._drawAutotile_getAutotileIndexs(x, y, mapArr, indexArrs); - - //修正四个边角的固定搭配 - if (pieceIndexs[0] == 13) { - if (pieceIndexs[1] == 16) pieceIndexs[1] = 14; - if (pieceIndexs[2] == 31) pieceIndexs[2] = 19; } - if (pieceIndexs[1] == 18) { - if (pieceIndexs[0] == 15) pieceIndexs[0] = 17; - if (pieceIndexs[3] == 36) pieceIndexs[3] = 24; + var isGrass = function(x,y){ + if(core.maps._drawAutotile_getAutotileAroundId(mapArr[yy][xx],x,y,mapArr)){ + return 1; + }else{ + return 0; + } } - if (pieceIndexs[2] == 43) { - if (pieceIndexs[0] == 25) pieceIndexs[0] = 37; - if (pieceIndexs[3] == 46) pieceIndexs[3] = 44; + var grass = function (ii, x, y) { + //ctx.clearRect(x * size, y * size, size, size); + drawAutotile(ctx, x * size, y * size, size, autotile, ii); } - if (pieceIndexs[3] == 48) { - if (pieceIndexs[1] == 30) pieceIndexs[1] = 42; - if (pieceIndexs[2] == 45) pieceIndexs[2] = 47; + var iG = []; + [-1,0,1].forEach(function(_x){ + iG[_x] = []; + [-1,0,1].forEach(function(_y){ + iG[_x][_y] = isGrass(xx + _x, yy + _y); + })}); + var _id = iG[0][-1] + 2 * iG[-1][0] + 4 * iG[0][1] + 8 * iG[1][0]; + if(iG[-1][-1] + iG[0][-1] + iG[0][0] + iG[-1][0] == 3 && !iG[-1][-1]){ + drawAutotile(ctx, xx * size + left, yy * size + top, size, autotile, 16); + done[0] = true; } - for (var i = 0; i < 4; i++) { - var index = pieceIndexs[i]; - var dx = x * size + size / 2 * (i % 2), dy = y * size + size / 2 * (~~(i / 2)); - this._drawAutotile_drawBlockByIndex(ctx, dx + left, dy + top, core.material.images['autotile'][block.event.id], index, size, status); + if(iG[0][-1] + iG[1][-1] + iG[1][0] + iG[0][0] == 3 && !iG[1][-1]){ + drawAutotile(ctx, xx * size + left + size/2, yy * size + top, size, autotile, 17); + done[1] = true; } + if(iG[0][0] + iG[1][0] + iG[1][1] + iG[0][1] == 3 && !iG[1][1]){ + drawAutotile(ctx, xx * size + left+size/2, yy * size + top + size/2, size, autotile, 18); + done[3] = true; + } + if(iG[0-1][0] + iG[0][0] + iG[0][1] + iG[-1][1] == 3 && !iG[-1][1]){ + drawAutotile(ctx, xx * size + left, yy * size + top + size/2, size, autotile, 19); + done[2] = true; + } + grass(_id, xx, yy); } maps.prototype._drawAutotile_drawBlockByIndex = function (ctx, dx, dy, autotileImg, index, size, status) {