Altıgen ızgarayı saklama


10

Unity3D için küçük bir altıgen ızgara çerçevesi oluşturdum ve aşağıdaki ikileme geldim. Bu benim koordinat sistemim ( buradan alınmıştır ):

resim açıklamasını buraya girin

Nasıl saklayacağımı bilmediğim hariç, oldukça iyi çalışıyor. Başlangıçta bunu bir 2D dizide saklamayı ve haritalarımı oluşturmak için görüntüleri kullanmayı amaçladım.

Bir sorun, negatif değerlere sahip olmasıydı (bu, koordinatları biraz telafi ederek kolayca düzeltildi).

Bununla birlikte, bu koordinat sistemi nedeniyle, böyle bir görüntünün veya bitmap'in elmas şeklinde olması gerekir - ve bu yapılar kare şeklinde olduğundan, bir şeyi hacklesem bile bu çok fazla baş ağrısına neden olur. Bu sorunu çözebilecek eksik bir şey var mı? Birlik forumlarında bununla ilgili bir forum yazısı gördüğümü hatırlıyorum ama artık bağlantıyı bulamıyorum.

Bir dizi koordinat tercümanı yazmak burada en iyi çözüm mü?

Eğer yardımcı olacağını düşünüyorsanız, sorunumun kodunu ve resimlerini gönderebilirim.


1
Altıgenlerin etrafında saydam olan PNG görüntülerini kaydedemez misiniz?
Markus von Broady

Png'lere ve dizilere kaydetmeyle ilgili temel sorunum, bu koordinat sistemini sağlam tutmak için içermeleri gereken "boşluk" miktarıdır.
PeeC

1
"Beyaz boşluk" saydam pikseller anlamına geliyorsa, bunun miktarı neden bir sorundur?
Markus von Broady

Bu çok iyi bir nokta. Çoğu görüntü formatı, tekrarlanan kalıpları depolayan bu kadar bellek harcamaz. Ama yine de, bu haritayı saklamak için bu kadar bellek kullandığımı biraz rahatsız ediyor (gri pikseller boş alan, diğer renkler geçerli onaltılık koordinatlar).
PeeC

1
Oh, ızgara verilerini saklıyorsunuz, görüntüleri döşemeniz değil! Neden veri yapılarınızı (grid) bir ikili dosyaya kaydetmeyecek ya da örneğin JSON kullanarak kodlamayacak ve bir metin dosyasına kaydedmeyeceksiniz? Yine de Unity'nin yeteneklerini bilmiyorum. Ayrıca, bunu onaylamak isteyebilirsiniz, ancak aynı renkteki bir alanın PNG formatında optimize edildiğine (gevşekçe sıkıştırılmış) inanıyorum.
Markus von Broady

Yanıtlar:


9

Kullandığınız paralelkenar koordinatlarla çalışmak daha kolaydır, ancak dikdörtgen haritalar için garip olma dezavantajları vardır. Bir yaklaşım, ofset koordinatları ile saklamak, ancak aslında oyun mantığınızda paralelkenar koordinatları kullanmaktır.

Gözlem: haritanın her satırında ızgara verileri bitişiktir. Boşa giden tüm alan solda ve sağda.

Çözüm: bu satırda, verileri 0 ile işaretlenmiş sütun yerine en soldaki sütundan başlayarak saklayın . Koordinat sisteminizde dikdörtgen haritanın ilk sütununu hesaplayın , ardından dizide nereye gittiğini belirlemek için sütun koordinatından çıkarın. Bu negatif sütun koordinatları için de geçerlidir.

Harita için alıcı ve ayarlayıcıda aşağıdaki gibi bir dönüşüm gerçekleştirin:

inline function get(q, r) {
    first_column_in_this_row = -floor(q/2);
    return array[r][q - first_column_in_this_row];
}

Seçtiğiniz koordinat ve harita ile çalışmak için bunu değiştirmeniz gerekir (bir farkla dikkat edin). Bazı mizanpajlarda, tam tersi yerine sütunları satır satır kaydırmak istersiniz.

Diğer şekillerin haritalarını yapmak için aynı hileyi kullanabilirsiniz; sadece dikdörtgenlerle sınırlı değil.

C veya C ++ kullanıyorsanız, bunu daha hızlı hale getirmek için işaretçi aritmetiği kullanabilirsiniz. Dizilere bir işaretçi dizisi depolamak yerine, tarafından ayarlanmış bir işaretçi dizisi depolayın first_column_in_row. (Bu taşınabilir olmayabilir)


Bu, anlayabildiğim kadarıyla çalışıyor, ancak matematik gerçekten garipti. Kafamda mantıklı olan birkaç denklemi denedikten yIndex = y-((x%2==0)?(x/2-x):(-x/2)-1)sonra, biraz deneme yanılma sonrasında yerleştim . Nasıl çalıştığını bilmiyorum.
PeeC

Yap şunu yIndex = y-((x%2==0)?(-x/2):(-x/2)-1). x / 2, tamsayı tabanlı btw'dir, bu nedenle zemine gerek yoktur.
PeeC

6

Şahsen, bellek tasarrufu yerine sadeliği tercih ederim. İhtiyacınız olana kadar optimizasyon yapmayın!

Hala birkaç bayt kaydetme konusunda eğildiyseniz, bunu nasıl yapabileceğiniz aşağıda açıklanmıştır:

resim açıklamasını buraya girin

  1. İki sağ üçgen oluşturmak için paralelkenarı ikiye bölün
  2. Bir dikdörtgen oluşturmak için iki üçgeni yeniden düzenleyin.
  3. (Not Yeşil tampon şeridi ekledim, böylece matematik iyi çalışıyor.)

Dikdörtgen koordinatları paralelkenar koordinatlarına ve geriye eşlemek için Python kodu:

# Height of rectangle
H = 15

def r2p(x, y):
"rectangle to parallelogram"
if y < -x/2 + H:
    y = y + H
return (x - 1, y)

def p2r(x,y):
"parallelogram to rectangle"
if y >= H:
    y = y - H
return (x + 1, y)

2
ayrıca pikselleri dikey olarak aşağıya doğru hareket ettirebilirsiniz - ki bu görüntü üzerindeoffsetY = Math.floor ( (x+1)/2 )
Markus von Broady

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.