2010-04-02 4 views
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 

내 질문은 : 각 셀이 세 가지 값을 저장하는 가장 효율적인 방법은 무엇입니까? 이 세 값을 하나의 정수로 저장할 수 있습니까?

+8

+1 그림 : – cletus

+4

+1 훌륭한 질문입니다. 게임에도 관심이 있습니다. –

+1

+1뿐만 아니라 그림의 전반적인 선명도. 철저하게 질문하는 데 시간을 보내는 사람을 만나서 정말 기쁩니다. – Ricket

답변

14

사진과 같은 것을하려는 경우 주변 타일에서 추론 할 수 있으므로 위/아래 모서리를 저장할 필요가 없습니다. 예를 들어

현재 타일 높이 n 현재 타일의 타일 하나까지의 높이 인 경우는 현재 타일

대 "를 상단 모서리를"이 있어야합니다 높이 n+1입니다! 고맙습니다! 나는 이것을 구현하려고 노력할 것이다. 답을 완성하기위한 또 하나의 생각 : 높이와 타일 ID를 정수로 저장할 수 있습니까?

예. Bitwise Operations을 사용해야합니다. 당신이

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

훌륭한 솔루션입니다. 하지만 각 코너의 높이를 저장하는 것보다 CPU가 더 비쌉니다. 모든 구석의 높이를 결정하려면 비트 단위로 9 개의 높이 조회를 수행해야합니다. – Pindatjuh

0

경우] 수행 할 수 있습니다 높이에 대한 최초의 16 비트 및 ID의 나머지 부분을 사용하여 동일하게 높이와 ID 사이의 정수를 나눈 경우

높이가 [0, 255] 범위에 있으면 비트 조작을 사용하여 단일 정수에 4 높이를 저장할 수 있습니다. 진수 년 :

0xAABBCCDD, AA = 제 1 높이, BB = 초, 등 ..

170 (를 0xAA)을 반환 당신이 ((0xAABBCCDD & 0xFF000000) >> 24) & 0xFF을 할 것이다 가장 왼쪽의 높이를 얻으려면.

을 설정하려면 : 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

면적이 직사각형입니까? 만약 당신이 단순히 영역의 너비와 높이, 타일의 길이와 정점 높이를 나타내는 정수의 배열을 저장할 수 있습니다.

관련 문제