2010-04-02 3 views
32

Я работаю над изометрической игрой для быстрых браузеров, поддерживающих <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 

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

+8

+1 для изображения :) – cletus

+4

+1 Отличный вопрос. Заинтересованы в игре. –

+1

+1 для не только картинки, но и общей ясности вопроса. Очень приятно видеть кого-то, кто не спешит задавать вопрос. – Ricket

ответ

14

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

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

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

Да. Вам нужно будет использовать Bitwise Operations.

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

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); 
+5

+1, но храните высоту угла, а не высоты ячеек, чтобы избежать двусмысленности. –

+0

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

+0

Отличное решение. Хотя, больше ЦП стоит дорого, чем хранить высоты каждого угла. (Чтобы определить высоту всех углов, он должен выполнить 9 переходов по высоте с их сдвигами по битам.) – Pindatjuh

0

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

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

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

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

+0

Вы можете это сделать, но помните, что Javascript использует с плавающей точкой для всех чисел, поэтому эффективность, которую вы получите на C++ или что бы на самом деле не применялось. – Pointy

3

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

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

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

0

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

Смежные вопросы