Camera
HTML5 ゲーム エンジンを作成しており、オブジェクトにプロパティを持たせたいと考えていzoom
ます。レンダラーでは、次のように簡単に実装できると思いました。
context.save();
context.scale(camera.zoom, camera.zoom);
draw();
context.restore();
ただし、問題があります。これを最初にテストしたとき、カメラは永遠にズームしているように見えました! 私はそれがおそらく期待どおりに機能しておらず、コンテキストの内部スケーリング係数がカメラの無限に乗算されているcontext.save()
と考えました。context.restore()
zoom
これにより状況が修正されました。
context.save();
context.scale(camera.zoom, camera.zoom);
draw();
context.scale(1/camera.zoom, camera.zoom);
context.restore();
これは現在機能していますが、これが最もエレガントで高速なソリューションではないことを残念に思います。また、浮動小数点計算の不正確さのために、スケーリング係数が常にわずかに変化する可能性があると思います。つまり、1/camera.zoom
常に同じ結果が得られるとは限りません。
だから、2つの質問:
- context.restore() がコンテキストのスケールを (1, 1) に戻さないのはなぜですか?
- コンテキストのスケーリングを手動で操作するにはどうすればよいですか?
編集:
と の数が違うのではないかとの指摘がありましたが、そんなことはありませcontext.save()
ん。context.restore()
これが私がそれを測定した方法です:
renderer.context.save = (function()
{
var original = renderer.context.save;
return function()
{
renderer.saved ++;
original.call(renderer.context);
}
})();
renderer.context.restore = (function()
{
var original = renderer.context.restore;
return function()
{
renderer.saved --;
original.call(renderer.context);
}
})();
renderer.saved
値は、1
コンテキストが最後に復元される直前 (描画後) と0
、各レンダリングの直後です。