16進グリッドの保管


10

Unity3D用の小さな六角グリッドフレームワークを作成していて、次のジレンマに直面しています。これは私の座標系です(ここから取得):

ここに画像の説明を入力してください

保存方法がわからないという事実を除けば、すべてうまくいきます。私は当初、これを2D配列に格納し、画像を使用してマップを生成することを意図していました。

1つの問題は、負の値があったことです(これは、座標を少しオフセットすることで簡単に修正されました)。

ただし、この座標系により、そのような画像やビットマップは菱形にする必要があります。これらの構造は四角形であるため、何かをハッキングしても、多くの頭痛の種を引き起こします。これを修正できる欠けているものはありますか?ユニティフォーラムでこれに関するフォーラムの投稿を見たのを覚えていますが、リンクが見つかりません。

座標変換器のセットを書くことがここでの最良の解決策ですか?

皆さんがそれが役立つと思うなら、私の問題のコードと画像を投稿できます。


1
六角形の周りに透明なPNG画像を保存することはできませんか?
Markus von Broady、2012年

PNGと配列への保存に関する私の主な問題は、この座標系をそのまま維持するためにそれらが含まなければならない「空白」の量です。
PeeC

1
「空白」が透明なピクセルを意味する場合、なぜそれの量が問題になるのですか?
Markus von Broady、2012年

それは非常に良い点です。ほとんどの画像フォーマットは、繰り返しパターンを保存するためにそれほど多くのメモリを浪費しません。しかし、それでも、このマップを保存するためにこれだけ多くのメモリを使用していることが少し気になります(灰色のピクセルは空のスペースで、他の色は有効な16進座標です)。
PeeC、2012年

1
ああ、あなたはタイル画像ではなくグリッドデータを保存しています!データ構造(グリッド)をバイナリファイルに保存したり、JSONなどを使用してエンコードしてテキストファイルに保存したりしないのはなぜですか?ただし、Unityの機能はわかりません。また、これを確認することもできますが、同じ色の領域がPNG形式で最適化(緩く圧縮)されていると思います。
Markus von Broady、2012年

回答:


9

使用している平行四辺形の座標は操作が簡単ですが、長方形のマップでは奇妙な欠点があります。1つのアプローチは、オフセット座標とともに保存することですが、実際にはゲームロジックで平行四辺形座標を使用します。

観察:マップの各行で、グリッドデータは隣接しています。無駄なスペースはすべて左右にあります。

解決策:その行内で、0とマークされた列ではなく、一番左の列からデータを格納します。座標系で長方形マップの最初の列を計算し、それを列座標から差し引いて、配列のどこにあるかを決定します。これは負の列座標でも機能します。

次のような方法で、マップのゲッターとセッターで変換を実行します。

inline function get(q, r) {
    first_column_in_this_row = -floor(q/2);
    return array[r][q - first_column_in_this_row];
}

選択した座標とマップで動作するように、これを変更する必要があります(1つの違いから注意を払ってください)。レイアウトによっては、列を行でオフセットするのではなく、行でオフセットしたい場合があります。

同じトリックを使用して、他の形状のマップを作成できます。長方形に限定されません。

CまたはC ++を使用している場合は、ポインター演算を使用してこれを高速化できます。配列へのポインタの配列を格納する代わりに、によって調整されたポインタの配列を格納しますfirst_column_in_row。(これは移植できない場合があります)


これは私の知る限りでは機能しますが、数学は非常に奇妙でした。頭の中で理にかなっているいくつかの方程式をyIndex = y-((x%2==0)?(x/2-x):(-x/2)-1)試した後、私はいくつかの試行錯誤の後で落ち着きました。どのようにタフに動作するかわかりません。
PeeC、2012年

それを作るyIndex = y-((x%2==0)?(-x/2):(-x/2)-1)。x / 2はすべて整数ベースのbtwなので、フロアする必要はありません。
PeeC、2012年

6

個人的には、メモリを節約するよりも単純な方を好みます。必要になるまで最適化しないでください!

それでも数バイトを節約することにこだわっている場合は、次の方法で実行できます。

ここに画像の説明を入力してください

  1. 平行四辺形を半分にスライスして、2つの直角三角形を形成します。
  2. 2つの三角形を再配置して長方形を形成します。
  3. (緑色のバッファストリップを追加したので、数学がうまく機能することに注意してください。)

長方形の座標を平行四辺形の座標にマッピングして戻すPythonコード:

# Height of rectangle
H = 15

def r2p(x, y):
"rectangle to parallelogram"
if y < -x/2 + H:
    y = y + H
return (x - 1, y)

def p2r(x,y):
"parallelogram to rectangle"
if y >= H:
    y = y - H
return (x + 1, y)

2
また、ピクセルを垂直方向に下に移動することもできますoffsetY = Math.floor ( (x+1)/2 )
Markus von Broady '21

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.