実現したいこと
- canvasでトップビューとアイソメトリックビュー(クオータービュー)のグリッドマップを表示する。
- トップビューのマーカーのx, y座標を座標変換してアイソメトリック座標へマッピングしたい
- アイソメトリック上でも移動可能範囲の判定を行いエリアから出ないようにしたい
- トップ、アイソメトリック共に向かって左右に移動した際は対応した向きに変えたい(左右の2パターンのみで良い)
前提
Javascript, Vue, html, cssでwebコンテンツを作っています。
ただ、ゲーム関連の専門知識はありません。
アイソメ図の一枚絵の背景がありその特定の絵柄の範囲内のみDOMが移動可能。
タイルマップデータ(タイル素材、タイルマップエディタの書き出しデータ)はありません。
発生している問題
参考コードを元にトップビューとアイソメトリックビュー間の座標変換とマッピングを実装してみましたが、
移動方向の連動まではできているのですが、座標のオフセット処理がわからず座標がずれてしまっています。
borderOffsetの設定が原因と思われますが、
ここをアイソメトリックビューのグリッド開始座標で設定してみましたがこの値の求め方が間違っていそうなので
どのようにこの値を求めたらいいか、もしくは別の間違いがあるのか知りたいです。
該当のソースコード
javascript
1 /** 2 * アイテムをアイソメトリック座標に描画 3 */ 4 drawHeroIso() { 5 let isoPt = { x: 0, y: 0 }; 6 let heroCornerPt = { 7 x: this.marker.x, 8 y: this.marker.y 9 }; 10 console.dir(heroCornerPt); 11 // 2Dマップからアイソメトリック座標を見つける 12 isoPt = this.cartesianToIsometric(heroCornerPt.x, heroCornerPt.y); 13 console.dir(isoPt); 14 15 let heroWidth = 10; 16 let heroHeight = 10; 17 // こちらの値に何を設定すべきか、その求め方が理解できていない 18 let borderOffset = { 19 x: this.area.x, 20 y: this.area.y 21 }; 22 this.testTarget.x = isoPt.x + borderOffset.x + heroWidth; 23 this.testTarget.y = isoPt.y + borderOffset.y - heroHeight; 24 console.dir(this.testTarget); 25 }, 26 27 /** 28 * デカルト座標からアイソメトリック座標に変換 29 * 参考:https://jsfiddle.net/juwalbose/w1tnu9qc 30 * @param {int} cartX デカルト座標 X 31 * @param {int} cartY デカルト座標 Y 32 */ 33 cartesianToIsometric(cartX, cartY) { 34 console.dir(`cartX: ${cartX}, cartY: ${cartY}`); 35 let tempPoint = { x: 0, y: 0 }; 36 tempPoint.x = cartX - cartY; 37 tempPoint.y = (cartX + cartY) / 2; 38 console.dir(`iso_x: ${tempPoint.x}, iso_y: ${tempPoint.y}`); 39 return tempPoint; 40 },
試したこと
参考コードの設定を見るとアイソメトリックビューの開始地点を設定しているように見えたのでarea.x, area.yを設定してみましたがそれでずれが生じていました。
どのようにこの値を求めたらいいか、もしくは別の間違いがあるのか知りたいです。
補足情報(FW/ツールのバージョンなど)
まだ調整が必要ですがcartesianToIsometricに渡す座標をミニマップ内での座標にしたら理想に近くなりました
https://codepen.io/merrymistake/pen/PogVOWM
回答1件
あなたの回答
tips
プレビュー