Saya telah membuat kerangka kerja hex grid kecil untuk Unity3D dan telah sampai pada dilema berikut. Ini adalah sistem koordinat saya (diambil dari sini ):
Semuanya bekerja dengan sangat baik kecuali untuk fakta saya tidak tahu cara menyimpannya. Saya awalnya bermaksud menyimpan ini dalam array 2D dan menggunakan gambar untuk menghasilkan peta saya.
Satu masalah adalah bahwa ia memiliki nilai negatif (ini mudah diperbaiki dengan mengimbangi koordinat sedikit).
Namun, karena sistem koordinat ini, gambar atau bitmap seperti itu harus berbentuk berlian - dan karena struktur ini berbentuk persegi, ini akan menyebabkan banyak sakit kepala bahkan jika saya meretas sesuatu bersama-sama. Apakah ada sesuatu yang saya lewatkan yang dapat memperbaikinya? Saya ingat pernah melihat posting forum mengenai hal ini di forum persatuan tetapi saya tidak dapat lagi menemukan tautannya.
Apakah menulis satu set penerjemah koordinator merupakan solusi terbaik di sini?
Jika kalian pikir itu akan membantu, saya dapat memposting kode dan gambar dari masalah saya.
sumber
Jawaban:
Koordinat jajar genjang yang Anda gunakan lebih mudah digunakan, tetapi memiliki kelemahan karena aneh untuk peta persegi panjang. Salah satu pendekatan adalah menyimpannya dengan koordinat offset tetapi sebenarnya menggunakan koordinat jajaran genjang dalam logika game Anda.
Pengamatan: di setiap baris peta, data kisi berdekatan. Semua ruang yang terbuang ada di kiri dan kanan.
Solusi: di dalam baris itu, simpan data mulai dari kolom paling kiri daripada kolom bertanda 0. Hitung kolom pertama dari peta persegi panjang di sistem koordinat Anda , kemudian kurangi dari koordinat kolom untuk menentukan di mana dalam array itu pergi. Ini berfungsi untuk koordinat kolom negatif juga.
Lakukan konversi di pengambil dan penyetel untuk peta, dengan sesuatu seperti ini:
Anda harus memodifikasi ini agar berfungsi dengan koordinat dan peta pilihan Anda (perhatikan satu perbedaan). Di beberapa tata letak, Anda ingin mengimbangi kolom dengan baris alih-alih sebaliknya.
Anda dapat menggunakan trik yang sama untuk membuat peta dengan bentuk lain; itu tidak terbatas pada persegi panjang.
Jika Anda menggunakan C atau C ++ Anda dapat menggunakan aritmatika pointer untuk membuatnya lebih cepat. Alih-alih menyimpan array pointer ke array, simpan array pointer yang telah disesuaikan dengan
first_column_in_row
. (Ini mungkin tidak portabel)sumber
yIndex = y-((x%2==0)?(x/2-x):(-x/2)-1)
setelah beberapa percobaan dan kesalahan. Tidak tahu cara kerjanya tangguh.yIndex = y-((x%2==0)?(-x/2):(-x/2)-1)
. x / 2 adalah semua btw berbasis integer jadi tidak perlu lantai.Secara pribadi, saya lebih suka kesederhanaan daripada menghemat memori. Jangan optimalkan sampai dibutuhkan!
Jika Anda masih ingin menghemat beberapa byte, berikut ini cara melakukannya:
Kode python untuk memetakan koordinat persegi panjang ke koordinat jajaran genjang dan kembali:
sumber
offsetY = Math.floor ( (x+1)/2 )
Tidak perlu mengubah peta Anda, karena konversi antara koordinat persegi panjang dan "kanonik" cepat dan mudah. Berikut ini tautan ke intro tentang cara melakukannya:
Mengubah antara koordinat hex Rectangular dan Canonical
Teknik ini menggabungkan evaluasi malas dengan caching konversi yang dihitung.
sumber