Подтвердить что ты не робот

Самый эффективный способ сохранить данные плитки изометрической игры

Я работаю над изометрической игрой для быстрых браузеров, поддерживающих <canvas>, что очень интересно. Чтобы сохранить информацию о каждом фрагменте, я использую двумерный массив, который содержит числа, представляющие идентификаторы плитки, например:

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

Для каждой плитки мне нужно сохранить идентификатор плитки, высоту и информацию о том, какие углы повернуты вверх.

Я придумал простую идею о поразрядном представлении всех четырех углов, например:

1011 // top, bottom and left corner turned up

Мой вопрос: какой самый эффективный способ сохранить эти три значения для каждой ячейки? Можно ли сохранить эти три значения как одно целое?

4b9b3361

Ответ 1

Если вы пытаетесь сделать что-то вроде картинки, вам не нужно сохранять, какие углы вверх/вниз, как это можно сделать из окружающих фрагментов.

Например, если текущая плитка имеет высоту n, а высота плитки одна от текущей плитки равна высоте n+1, тогда текущая плитка должна иметь "верхний угол вверх"

Отлично! Спасибо! Я попытаюсь реализовать это. Еще одна мысль, чтобы завершить свой ответ: возможно ли сохранить высоту и идентификатор плитки как целое число?

Да. Вам нужно будет использовать Побитовые операции.

Если вы разделили целое число поровну между высотой и идентификатором, используя первые 16 бит для высоты, а остальные id

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

Настройка может выполняться в аналогичном mannar

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

tile &= 0x0000FFFF; //remove height bits
tile |= (height << 16);

Ответ 2

Да, вы можете:

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

Если вы хотите его оптимизировать, рассмотрите, что сказал Yacoby - вы можете сохранить массив углов, а не сохранять их отдельно для каждой плитки.

Ответ 3

Если высота находится в диапазоне [0, 255], вы можете сохранить 4 высоты в одном целочисленном размере, используя бит-манипуляцию. В шестнадцатеричном формате:

0xAABBCCDD, AA = первая высота, BB = вторая и т.д.

Чтобы получить самую левую высоту, вы сделали бы ((0xAABBCCDD & 0xFF000000) >> 24) & 0xFF, который вернет 170 (0xAA).

Чтобы установить его: integer &= (0x00FFFFFF); /* Clear the value */ integer |= (height << 24);

Ответ 4

Является ли область прямоугольной? Если это так, вы можете просто сохранить ширину и высоту области, длину плитки и массив целых чисел, представляющих высоты вершин.