画像を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();
}
これにはおそらくいくつかのパフォーマンスの問題がありますが、私にとっては問題ではありませんでした。
反射を作成するときに画像全体を再描画する必要はありません。オリジナルの反射は、単に画像の下部を示しています。このようにして、より良いパフォーマンスを提供する画像の小さな部分を再描画し、画像の下部を非表示にするために線形グラデーションを作成する必要もありません(描画しないため)。
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>
このコードをdrawImage
の前に追加します。水平方向に反転するだけでは境界から外れます... translate
を使用して位置を調整します。
ctx.translate(canvas.width, 0);
ctx.scale(-1, 1);