2016-01-18 1 views
4

Я пытаюсь отобразить свою карту для игры под некоторым углом ctx.setTransform(1, -0.5, 1, 0.5, 0, 200); (стандарт ctx.setTransform(1, 0, 0, 1, 0, 0);).Картинка для JavaScript, рендеринга map

Но у меня есть несколько строк:

like a border.

Вот код:

var canvas = document.getElementById('canvas'); 
 
var ctx = canvas.getContext('2d'), \t 
 
\t cellSize = 50,         
 
\t pic  = new Image(),       
 
\t map  =          
 
\t [ 
 
\t \t [{x:5,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1}], 
 
\t \t [{x:3,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1}], 
 
\t \t [{x:3,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1}], 
 
\t \t [{x:3,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1}], 
 
\t \t [{x:3,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1}], 
 
\t \t [{x:3,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1}], 
 
\t \t [{x:3,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1}], 
 
\t \t [{x:4,y:1},{x:2,y:1},{x:2,y:1},{x:2,y:1},{x:2,y:1},{x:2,y:1},{x:2,y:1},{x:2,y:1}] 
 
\t ]; 
 

 
canvas.width = 16 * cellSize; 
 
canvas.height = 16 * cellSize; 
 
ctx.setTransform(1, -0.5, 1, 0.5, 0, 200); 
 
pic.src = 'http://promodesign.kei.pl/cb/test/sprite.svg'; 
 
pic.onload = function() { 
 
\t for (var j = 0 ; j < 8; j ++) 
 
\t \t for (var i = 0; i < 8; i ++) 
 
\t \t ctx.drawImage(pic, (map[i][j].x-1)*cellSize, (map[i][j].y-1)*cellSize, 50, 50, j*cellSize, i*cellSize, 50, 50); 
 

 
\t var pic2 = new Image(); pic2.src = 'http://promodesign.kei.pl/cb/test/man.png'; 
 
\t pic2.onload = function() { 
 
    \t \t ctx.setTransform(1, 0, 0, 1, 0, 60); 
 
    \t \t ctx.drawImage(pic2, 150, 75); 
 
\t } 
 
}
<canvas id="canvas"></canvas>

+0

Почему бы не использовать фазер или что-то. –

+0

Не уверен, как ответить. Просто хочу попробовать его на ванили. –

+0

Даже не беспокойтесь, отвечая на вопросы «почему бы вам не использовать X». Действительно странная проблема, которую вы там чувствуете, кажется, что отрицательный перекос - это «пропускание» этих линий сетки. – Shomz

ответ

4

Использование преобразования приведет промежутки между чертежами, которые можно было бы считать, чтобы быть состыкованы. Это вызвано тем, что координаты чертежей используют плавающие точки, а не целые числа, а математика преобразования вызывает различия в выравнивании.

Возможно, ваше самое простое исправление состоит в том, чтобы слегка увеличить всю сцену на очень маленький размер, который скроет различия выравнивания. Даже + 2% обычно дают желаемый результат.

enter image description here

Вот ваш код переработан масштабироваться до 102% от первоначального размера.

var canvas = document.getElementById('canvas'); 
 
var ctx = canvas.getContext('2d'), \t 
 
\t cellSize = 50,         
 
\t pic  = new Image(),       
 
\t map  =          
 
\t [ 
 
\t \t [{x:5,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1}], 
 
\t \t [{x:3,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1}], 
 
\t \t [{x:3,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1}], 
 
\t \t [{x:3,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1}], 
 
\t \t [{x:3,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1}], 
 
\t \t [{x:3,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1}], 
 
\t \t [{x:3,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1}], 
 
\t \t [{x:4,y:1},{x:2,y:1},{x:2,y:1},{x:2,y:1},{x:2,y:1},{x:2,y:1},{x:2,y:1},{x:2,y:1}] 
 
\t ]; 
 
var scaleFix=1.02; 
 

 
canvas.width = 16 * cellSize; 
 
canvas.height = 16 * cellSize; 
 
ctx.setTransform(1.00, -0.5, 1.00, 0.5, 0, 200); 
 
pic.src = 'http://promodesign.kei.pl/cb/test/sprite.svg'; 
 
pic.onload = function() { 
 
\t for (var j = 0 ; j < 8; j ++) 
 
\t \t for (var i = 0; i < 8; i ++) 
 
\t \t ctx.drawImage(pic, (map[i][j].x-1)*cellSize, (map[i][j].y-1)*cellSize, 50, 50, j*cellSize, i*cellSize, 50*scaleFix, 50*scaleFix); 
 

 
\t var pic2 = new Image(); pic2.src = 'http://promodesign.kei.pl/cb/test/man.png'; 
 
\t pic2.onload = function() { 
 
    \t \t ctx.setTransform(1, 0, 0, 1, 0, 60); 
 
    \t \t ctx.drawImage(pic2, 150*scaleFix, 75*scaleFix); 
 
\t } 
 
}
body{ background-color: ivory; } 
 
#canvas{border:1px solid red; margin:0 auto; }
<h4>Content scaled to 102% to hide transformational gaps.</h4> 
 
<canvas id="canvas" width=300 height=300></canvas>

[OOPS! Исправлено это Firefox. Я скоро вернусь с исправлением для исправления: -O]

Хорошо ... давайте попробуем это снова. Та же идея: увеличение до 102%, но на этот раз конвертировать .svg в .png для выгоды FireFox. Вы можете выполнять преобразование «на лету», рисуя svg на холст и используя этот холст в качестве источника изображения вместо pic (да, вы можете drawImage одно холст на другой холст). Вы также можете сделать преобразование в .svg и доставить .png вместо .svg.

Пример: Преобразование SVG в PNG на лету на стороне клиента:

var canvas = document.getElementById('canvas'); 
var ctx = canvas.getContext('2d'), 
    cellSize = 50,         
    pic  = new Image(),       
    map  =          
    [ 
    [{x:5,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1}], 
    [{x:3,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1}], 
    [{x:3,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1}], 
    [{x:3,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1}], 
    [{x:3,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1}], 
    [{x:3,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1}], 
    [{x:3,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1}], 
    [{x:4,y:1},{x:2,y:1},{x:2,y:1},{x:2,y:1},{x:2,y:1},{x:2,y:1},{x:2,y:1},{x:2,y:1}] 
    ]; 
var scaleFix=1.02; 

canvas.width = 16 * cellSize; 
canvas.height = 16 * cellSize; 
ctx.setTransform(1.00, -0.5, 1.00, 0.5, 0, 200); 

var pic2=new Image(); 
pic2.onload=start; 
pic2.src='http://promodesign.kei.pl/cb/test/man.png'; 

var pic; 
var img=new Image(); 
img.onload=start; 
img.src='http://promodesign.kei.pl/cb/test/sprite.svg'; 
var imgCount=2; 

function start(){ 
    if(--imgCount>0){return;} 
    pic=document.createElement('canvas'); 
    pic.width=img.width; 
    pic.height=img.height; 
    pic.getContext('2d').drawImage(img,0,0); 
    drawScene(); 
    document.body.appendChild(pic); 
} 

function drawScene(){ 
    for (var j = 0 ; j < 8; j ++) 
    for (var i = 0; i < 8; i ++){{ 
     ctx.drawImage(pic, (map[i][j].x-1)*cellSize, (map[i][j].y-1)*cellSize, 50, 50, j*cellSize, i*cellSize, 50*scaleFix, 50*scaleFix); 
    }} 
    ctx.setTransform(1, 0, 0, 1, 0, 60); 
    ctx.drawImage(pic2, 150*scaleFix, 75*scaleFix); 
}