swsとMarkRで説明されている方法も私が好む方法ですが、別の方法を紹介したいと思います。
最小限の労力で等角投影の外観を作成するためのハッキーなオプションは、実際に直交タイルを使用し、context.transformを使用して、マップを等角投影に見えるようにする投影行列を設定することです(または、context.rotateとcontext.scaleを組み合わせた場合)。射影行列がどのように機能するかを知る)。
詳細については、キャンバス変換メソッドの仕様を参照してください。
タイル画像:
描画コード:
for (var x = 0; x < 5; x++) {
for (var y = 0; y < 5; y++) {
ctx.drawImage(img, x * img.width, y * img.height);
}
}
マトリックス適用前の結果:
この変換行列を適用した後の同じタイルイメージの同じコード:
ctx.transform( 1, 0.5,
-1, 0.5,
160, 0 );
破線のグリッドをタイル画像から削除し、描画コードのタイルオフセットをimg.width - 1
およびimg.height - 1
変換によって生じるギャップを取り除くために。突然タイルが醜く半分に見えます:
この方法の主な欠点は、グラフィックエディターでタイルをデザインするときに、実際に見たとおりのタイルにならないことです。また、床ではなく直立しているオブジェクトを描画する場合にも問題が発生します。これらについては、描画する前に変換行列をオフにすることができますが、その場合は自分で位置を計算する必要があります。そのためにこれらの式を使用できます。
var xScreen = xWorld * 1 + yWorld * -1 + 160;
var yScreen = xWorld * 0.5 + yWorld * 0.5 + 0;
(変換行列の数値がこれらの数式でどのように再現されるかに注意してください-ここで行列の乗算を自分で行っています)。
では、なぜこれを行う必要があるのでしょうか。
この方法は、次の場合に適しています。
- アイソメトリックタイルの設計は経験がありませんが、直交するタイルがあります
- 直交グラフィックエンジンよりもやや難しいアイソメトリックグラフィックエンジンの開発に多くの時間を費やしたくない。
もう1つの興味深い機能は、マトリックス計算の方法がわかっている場合、フレーム間の投影マトリックスを変更して、マップをリアルタイムでズーム、チルト、回転して、素敵な偽の3Dエフェクトを作成できることです(等角タイルを使用してみてください)。 。
しかし、芸術的にも技術的にもアイソメトリックタイルを処理する方法を知っていて、偽の視点のトリックを必要としない場合は、透明度のあるダイヤモンド型のタイルを使用することをお勧めします。