编程语言
首页 > 编程语言> > JavaScript画布,渲染地图

JavaScript画布,渲染地图

作者:互联网

我试图通过某个角度ctx.setTransform(1,-0.5,1,0.5,0,200)渲染我的游戏地图; (标准是ctx.setTransform(1,0,0,1,0,0);).

但后来我有一些方面:

.

这是代码:

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}]
	];

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() {  
	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, 50);

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

解决方法:

使用变换将导致人们认为相邻的图纸之间存在间隙.这是因为绘图坐标使用浮点而不是整数而变换数学会导致对齐差异.

可能你最简单的解决方法是用一个非常小的尺寸稍微放大整个场景,这将隐藏对齐差异.即使是2%也会产生预期的效果.

enter image description here

这是您重构的代码,可以扩展到原始大小的102%.

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);
pic.src = 'http://promodesign.kei.pl/cb/test/sprite.svg';
pic.onload = function() {  
	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);

	var pic2 = new Image(); pic2.src = 'http://promodesign.kei.pl/cb/test/man.png';
	pic2.onload = function() {
   		ctx.setTransform(1, 0, 0, 1, 0, 60);
   		ctx.drawImage(pic2, 150*scaleFix, 75*scaleFix);
	}
}
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来实时进行转换(是的,您可以将一个画布绘制到另一个画布上).您也可以转换为.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);
}

标签:javascript,html5,canvas,game-engine
来源: https://codeday.me/bug/20190623/1270613.html