32

私は<canvas>、をサポートする高速ブラウザ用の等角ゲームに取り組んでいます。これはとても楽しいことです。各タイルの情報を保存するために、次のようなタイルIDを表す番号を含む2次元配列を使用します。

var level = [[1, 1, 1, 2, 1, 0],
             [0, 1, 1, 2, 0, 1],
             [0, 1, 1, 2, 1, 1]];

var tiles = [
    {name: 'grass',  color: 'green'},
    {name: 'water',  color: 'blue'},
    {name: 'forest', color: 'ForestGreen'}
];

これまでのところうまく機能していますが、今はこの写真のように高さと傾斜を操作したいと思います: alt text http://harmen.no-ip.org/isometrictiles.png

タイルごとに、タイルID、高さ、およびどのコーナーが上向きになっているのかに関する情報を保存する必要があります。

次のように、四隅すべてのビット単位の表現について簡単なアイデアを思いつきました。

1011 // top, bottom and left corner turned up

私の質問は、各セルのこれら3つの値を保存する最も効率的な方法は何ですか?これらの3つの値を1つの整数として保存することは可能ですか?

4

4 に答える 4

14

写真のようなことをしようとしている場合は、周囲のタイルから推測できるため、どのコーナーが上下しているかを保存する必要はありません。

たとえば、現在のタイルが高さnであり、現在のタイルから1つ上のタイルの高さが高さである場合、現在のタイルn+1は「上隅が上」である必要があります。

素晴らしい!ありがとうございました!これを実装してみます。あなたの答えを完成させるためのもう一つの考え:高さとタイルIDを整数として保存することは可能ですか?

はい。ビット演算を使用する必要があります。

高さと残りのIDに最初の16ビットを使用して、整数を高さとIDの間で均等に分割した場合

var id = tile & 0x0000FFFF; //mask the first 16 bits
var height = tile >>> 16; //shift the first 16 bits to the right

設定は同様の方法で行うことができます

tile &= 0xFFFF0000; //remove id bits
tile |= id; //set new id

tile &= 0x0000FFFF; //remove height bits
tile |= (height << 16);
于 2010-04-02T12:08:43.770 に答える
3

はい、できます:

var corners = 11; // binary 1011;
var topCornerUp = corners & 0x8;
var bottomCornerUp = corners & 0x2;

ただし、最適化する場合は、Yacobyが言ったことを考慮してください。タイルごとに個別に保存する代わりに、コーナーの配列を保存できます。

于 2010-04-02T12:13:07.370 に答える
0

高さが[0、255]の範囲にある場合、ビット操作を使用して1つの整数で4つの高さを保存できます。16進数:

0xAABBCCDD、AA =最初の高さ、BB=2番目など。

左端の高さを取得するには((0xAABBCCDD & 0xFF000000) >> 24) & 0xFF、170(0xAA)を返します。

設定するには:integer &= (0x00FFFFFF); /* Clear the value */ integer |= (height << 24);

于 2010-04-02T12:10:34.937 に答える
0

エリアは長方形ですか?その場合は、領域の幅と高さ、タイルの長さ、および頂点の高さを表す整数の配列を単純に格納できます。

于 2010-04-02T12:14:58.640 に答える