2010-04-02 21 views
32

Tôi đang làm việc trên một trò chơi đẳng động cho các trình duyệt nhanh hỗ trợ <canvas>, rất thú vị. Để lưu thông tin của mỗi gạch, tôi sử dụng một mảng hai chiều trong đó có số đại diện cho ID ngói, như:Cách hiệu quả nhất để lưu dữ liệu lát của trò chơi isometric

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'} 
]; 

Cho đến nay nó hoạt động tốt, nhưng bây giờ tôi muốn làm việc với chiều cao và dốc như trong ảnh này : alt text http://harmen.no-ip.org/isometrictiles.png

Đối với mỗi ô, tôi cần phải lưu ID, chiều cao và thông tin về các góc của nó được bật lên.

tôi đã đưa ra một ý tưởng đơn giản về một đại diện Bitwise của tất cả bốn góc, như thế này:

1011 // top, bottom and left corner turned up 

Câu hỏi của tôi là: cách hiệu quả nhất để tiết kiệm ba giá trị này cho mỗi tế bào là gì? Có thể lưu ba giá trị này dưới dạng một số nguyên không?

+8

+1 cho hình ảnh :) – cletus

+4

+1 Câu hỏi hay. Quan tâm đến trò chơi là tốt. –

+1

+1 không chỉ cho hình ảnh mà là sự rõ ràng tổng thể của câu hỏi. Thật tuyệt khi thấy ai đó dành thời gian để hỏi kỹ. – Ricket

Trả lời

14

Nếu bạn đang cố gắng làm một cái gì đó giống như hình ảnh bạn không cần phải lưu trữ góc nào lên/xuống vì nó có thể được suy ra từ các ô xung quanh.

Ví dụ nếu ngói hiện nay là chiều cao n và chiều cao của một gạch lên từ gạch hiện nay là chiều cao n+1 thì ngói hiện nay phải có "góc trên cùng lên"

Tuyệt vời! Cảm ơn bạn! Tôi sẽ cố gắng thực hiện điều này. Một suy nghĩ khác để hoàn thành câu trả lời của bạn: là nó có thể lưu trữ chiều cao và gạch ID như một số nguyên?

Có. Bạn sẽ cần phải sử dụng Bitwise Operations.

Nếu bạn chia số nguyên đều giữa chiều cao và id bằng cách sử dụng 16 bit đầu tiên cho chiều cao và phần còn lại của id

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

Setting có thể được thực hiện trong một Mannar tương tự

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

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

+1, nhưng lưu trữ chiều cao góc thay vì chiều cao của ô, để tránh sự mơ hồ. –

+0

Tuyệt vời! Cảm ơn bạn! Tôi sẽ cố gắng thực hiện điều này. Một suy nghĩ nữa để hoàn thành câu trả lời của bạn: có thể lưu trữ 'chiều cao' và' gạch ID' làm một số nguyên không? – Harmen

+0

Giải pháp tuyệt vời. Mặc dù, nhiều CPU đắt hơn lưu trữ chiều cao của mỗi góc. (Để xác định chiều cao của tất cả các góc, cần phải thực hiện 9 lần tra cứu độ cao, với sự dịch chuyển bit của chúng.) – Pindatjuh

0

Nếu chiều cao nằm trong phạm vi [0, 255], bạn có thể lưu 4 chiều cao trong một số nguyên bằng thao tác bit. Trong hex:

0xAABBCCDD, AA = chiều cao đầu tiên, BB = thứ hai, vv ..

Để có được trái nhất chiều cao bạn sẽ làm gì ((0xAABBCCDD & 0xFF000000) >> 24) & 0xFF, trong đó trả 170 (0xAA).

Để cài đặt nó: integer &= (0x00FFFFFF); /* Clear the value */ integer |= (height << 24);

+0

Bạn chắc chắn có thể làm điều đó, nhưng hãy nhớ rằng Javascript sử dụng dấu phẩy động cho tất cả các số, do đó hiệu quả bạn có được trong C++ hoặc bất cứ điều gì thực sự sẽ không áp dụng. – Pointy

3

Vâng, bạn có thể:

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

Nếu bạn muốn tối ưu hóa nó, tuy nhiên, xem xét những gì Yacoby said - bạn có thể lưu trữ một mảng của các góc thay vì lưu chúng riêng cho mỗi ô.

0

Khu vực có hình chữ nhật không? Nếu đó là bạn có thể chỉ đơn giản là lưu trữ chiều rộng và chiều cao của khu vực, chiều dài ngói và một mảng các số nguyên đại diện cho chiều cao đỉnh.

Các vấn đề liên quan