我正在尝试在HTML画布上绘制图像时翻转/镜像它;我找到了一个游戏教程,其中显示了每个角色必须面对的每个方向的精灵表,但这似乎不太对。特别是因为每一帧的大小都不同。
什么是实现此目标的最佳技术?
我尝试在我的画布上调用setScale(-1, 1);
,但没有成功。也许那并不是适合这个问题的方法。
谢谢
我正在尝试在HTML画布上绘制图像时翻转/镜像它;我找到了一个游戏教程,其中显示了每个角色必须面对的每个方向的精灵表,但这似乎不太对。特别是因为每一帧的大小都不同。
什么是实现此目标的最佳技术?
我尝试在我的画布上调用setScale(-1, 1);
,但没有成功。也许那并不是适合这个问题的方法。
谢谢
在绘制图像之前,您可以通过使用myContext.scale(-1,1)
将上下文进行变换,不过这样会降低游戏的速度。
更好的做法是使用一个独立的、镜像的精灵来代替。
你需要设置画布的比例,并且反转宽度。
drawToCanvas : function(v, context, width, height){
context.save();
context.scale(-1, 1);
context.drawImage(v, 0, 0, width*-1, height);
context.restore();
}
可能会存在一些性能问题,但对我来说这不是问题。
如果您只是水平翻转它,它将超出边界...因此使用translate
来调整其位置:
ctx.translate(canvas.width, 0);
ctx.scale(-1, 1);
ctx.drawImage(img, 0, 0);
如果您想要更短的代码,可以删除translate
并将图像大小作为第二个参数的负偏移量在drawImage
(x坐标)中使用:
ctx.scale(-1, 1);
ctx.drawImage(img, canvas.width * -1, 0);
如果你想要在之后恢复上下文,请在所有内容前后添加save/restore
:ctx.save();
ctx.scale(-1, 1);
ctx.drawImage(img, canvas.width * -1, 0);
ctx.restore();
context.save()
,并在之后使用context.restore()
以恢复先前的上下文状态。 - L777创建反射时,您不需要重新绘制整个图像。一个原始的反射只显示图像的底部部分。这样你只需要重新绘制图像的一小部分,从而提供更好的性能,并且你不需要创建线性渐变来隐藏图像的下部(因为你从未绘制过它)。
var img = new Image();
img.src = "//vignette2.wikia.nocookie.net/tomandjerryfan/images/9/99/Jerry_Mouse.jpg/revision/latest?cb=20110522075610";
img.onload = function() {
var thumbWidth = 250;
var REFLECTION_HEIGHT = 50;
var c = document.getElementById("output");
var ctx = c.getContext("2d");
var x = 1;
var y = 1;
//draw the original image
ctx.drawImage(img, x, y, thumbWidth, thumbWidth);
ctx.save();
//translate to a point from where we want to redraw the new image
ctx.translate(0, y + thumbWidth + REFLECTION_HEIGHT + 10);
ctx.scale(1, -1);
ctx.globalAlpha = 0.25;
//redraw only bottom part of the image
//g.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);
ctx.drawImage(img, 0, img.height - REFLECTION_HEIGHT, img.width, REFLECTION_HEIGHT, x, y, thumbWidth, REFLECTION_HEIGHT);
// Revert transform and scale
ctx.restore();
};
body {
background-color: #FFF;
text-align: center;
padding-top: 10px;
}
<canvas id="output" width="500" height="500"></canvas>