HTML Canvas:如何绘制翻转/镜像图像?

Jem*_*Jem 29 html javascript canvas mirror flip

当我在HTML画布上绘制图像时,我正在尝试翻转/镜像图像; 我找到了一个游戏教程,显示角色必须面对的每个方向的精灵表,但这对我来说似乎不太合适:(特别是因为每个帧都有不同的大小.

在一些游戏引擎(比如cocos2D)中,我记得使用像"flipX"这样的方法,它只是简单地画"朝向相反方向的玩家"(这是我的目标,试图制作一些基本的平台游戏).

达到这个目标的最佳技术是什么?

我试着调用setScale(-1,1); 在我的画布上没有成功.也许这不是为了这个.

谢谢 :)

Phr*_*ogz 29

  1. 但是,您可以通过myContext.scale(-1,1)在绘制图像之前转换上下文来完成此操作

  2. 这会减慢你的游戏速度.拥有一个单独的反向精灵是个更好的主意.

  • 好吧,不要只听我的话.对它进行分析并确保我对您的特定用法没有错.:) (2认同)
  • 考虑优化的背景总是值得的.在游戏男孩或游戏男孩高级游戏的情况下,开发人员受到他们拥有的内存和存储量的极大限制.今天,你不太可能遇到规模问题.不过,你仍然可以把它作为优先事项.例如,如果你想做一个练习,为什么不创建一个只有紧密包装的必需品的小精灵表,然后在开始游戏之前将面向不同方向的精灵版本写入内存.您可以以加载速度为代价获得速度和内存. (2认同)
  • 实际上它根本不会降低性能.2D画布上下文使用变换矩阵来应用缩放到渲染顶点之类的内容.无论是否进行缩放调用,变换矩阵都是活动的,因此应用缩放不会改变渲染速度. (2认同)

小智 21

您需要设置画布的比例以及反转宽度.

下面的功能是我的一个项目的摘录.调用该函数时,它会从网络摄像头源中获取一帧,放入画布并水平翻转图像.

drawToCanvas : function(v, context, width, height){
    context.save();
    context.scale(-1, 1);
    context.drawImage(v, 0, 0, width*-1, height);
    context.restore();
}
Run Code Online (Sandbox Code Playgroud)

这可能有一些性能问题,但对我来说这不是问题.

  • 请注意,canvas的变量应该是调用获得的上下文,canvasElem.getContext("2d") (3认同)

Le_*_*___ 6

drawImage. 如果你只是水平翻转它会越界......所以translate用来调整它的位置:

ctx.translate(canvas.width, 0);
ctx.scale(-1, 1);
Run Code Online (Sandbox Code Playgroud)

如果您想稍后恢复上下文,请添加save/restore

ctx.save();
ctx.translate(canvas.width, 0);
ctx.scale(-1, 1);
ctx.drawImage(img, 0, 0);
ctx.restore();
Run Code Online (Sandbox Code Playgroud)