Pertanyaan Cara paling efisien untuk menyimpan data ubin dari permainan isometrik


Saya sedang mengerjakan game isometrik untuk browser cepat yang mendukung <canvas>, yang sangat menyenangkan. Untuk menyimpan informasi setiap ubin, saya menggunakan larik dua dimensi yang berisi nomor yang mewakili ID ubin, seperti:

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

Sejauh ini berfungsi dengan baik, tetapi sekarang saya ingin bekerja dengan ketinggian dan lereng seperti pada gambar ini: alt teks http://harmen.no-ip.org/isometrictiles.png

Untuk setiap ubin, saya perlu menyimpan ID ubin, tinggi, dan informasi tentang sudut mana yang diputar ke atas.

Saya datang dengan ide sederhana tentang representasi bitwise dari keempat sudut, seperti ini:

1011 // top, bottom and left corner turned up

Pertanyaan saya adalah: apakah cara paling efisien untuk menyimpan ketiga nilai ini untuk setiap sel? Apakah mungkin untuk menyimpan ketiga nilai ini sebagai satu bilangan bulat?


32
2018-04-02 12:06


asal


Jawaban:


Jika Anda mencoba melakukan sesuatu seperti gambar, Anda tidak perlu menyimpan sudut mana yang naik / turun karena dapat disimpulkan dari ubin di sekitarnya.

Misalnya jika ubin saat ini tinggi n dan tinggi ubin satu dari ubin saat ini adalah tinggi n+1 maka ubin saat ini harus memiliki "pojok atas"

Besar! Terima kasih! Saya akan mencoba menerapkan ini. Satu lagi pemikiran untuk melengkapi jawaban Anda: apakah mungkin menyimpan tinggi dan ubin ID sebagai bilangan bulat?

Iya nih. Anda harus menggunakan Operasi Bitwise.

Jika Anda membagi bilangan bulat sama antara tinggi dan id menggunakan 16 bit pertama untuk tinggi dan sisa id

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

Pengaturan bisa dilakukan dalam mannar yang sama

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

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

14
2018-04-02 12:08



Ya kamu bisa:

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

Jika Anda ingin mengoptimalkannya, pertimbangkan apa Kata Yacoby - Anda dapat menyimpan larik sudut alih-alih menyimpannya secara terpisah untuk setiap petak.


3
2018-04-02 12:13



Jika ketinggian dalam kisaran [0, 255] Anda dapat menyimpan 4 ketinggian dalam satu bilangan bulat menggunakan manipulasi sedikit. Dalam hex:

0xAABBCCDD, AA = tinggi pertama, BB = detik, dll.

Untuk mendapatkan tinggi paling kiri yang akan Anda lakukan ((0xAABBCCDD & 0xFF000000) >> 24) & 0xFF, yang mengembalikan 170 (0xAA).

Untuk mengaturnya: integer &= (0x00FFFFFF); /* Clear the value */ integer |= (height << 24);


0
2018-04-02 12:10



Apakah area persegi panjang? Jika Anda hanya dapat menyimpan lebar dan tinggi area, panjang petak dan larik bilangan bulat mewakili tinggi vertex.


0
2018-04-02 12:14