質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

148閲覧

トップビューのマーカーのx, y座標を座標変換してアイソメトリック座標へマッピングしたい

merry

総合スコア15

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2024/04/24 13:22

編集2024/04/24 16:22

実現したいこと

  • 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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

patapi

2024/04/25 22:56 編集

minimapとisomwpで初期位置がずれる原因についてヒントですが、cartesianToIsometric関数の中でScaleを考慮して変換する必要があるのと、drawHeroIsoの中でthis.testTarget.x,yに、heroWidthとheroHeightをそのまま足している点です。 コードだとminimapはグリッド間隔tileW=50に対して0.3のスケールをかけて書いています。 一方cartesianToIsometricの中では、minimaの間隔が50である前提で変換しています。したがってcartesianToIsometricの中でもScaleを掛けないと、想定する移動量と異なる移動量に変換されてしまいます。 (動かす方向がずれないように見えるのは、方向の変換自体は想定通りになっているから)
merry

2024/04/26 13:16

ありがとうございました。 各所でscaleを考慮する必要があること気づけました。 細かい微調整は必要ですがおおむね良さそうな動きになりました。
merry

2024/04/26 13:17

コメントありがとうございます。ご指摘の内容を確認し試行錯誤ところ問題が解決しました。 ベストアンサーに選びたいので同じ内容を回答欄に投稿いただけますでしょうか?
patapi

2024/04/27 04:15

回答を投稿しました。
guest

回答1

0

ベストアンサー

minimapとisomapで初期位置がずれる原因についてヒントですが、

  • cartesianToIsometric 関数の中で Scale を考慮して変換していない
  • drawHeroIsoの中で this.testTarget.x, y に、heroWidth と heroHeight をそのまま足している

この点が原因です。

コードだと minimap はグリッド間隔 tileW(=50)に対して 0.3 のスケールをかけて書いています。
一方 cartesianToIsometric の中では、minimap の間隔が50である前提で変換しています。
したがって cartesianToIsometric の中でも Scale をかけないと、
想定する移動量と異なる移動量に変換されてしまいます。

(動かす方向がずれないように見えるのは、方向の変換自体は想定通りになっているから)

投稿2024/04/26 23:21

編集2024/04/26 23:21
patapi

総合スコア715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

merry

2024/04/27 07:08

回答ありがとうございます。 理想にだいぶ近づきました。 ベストアンサーに選ばせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問