SORU
17 Ocak 2012, Salı


Göster Döşeme Algoritması

Harita

Bir kiremit RPG Javascript tabanlı, perlin gürültü heightmaps kullanarak, sonra çini bir tür atama gürültü boyunu düşünerek yapıyorum.

Haritalar böyle bir şey (mini görünümünde) bakıyor sonunda.

enter image description here

Ben oldukça basit bir algoritma olan özler renk değeri her bir piksel görüntü ve dönüştürür içine bir tamsayı (0-5) olarak pozisyonu arasında (0 ile 255 arasında) karşılık gelen bir çini karo sözlük. Bu 200x200 dizi sonra istemciye gönderilir.

Motor sonra dizideki değerleri çini belirler ve tuvale çizer. Yani, ben gerçekçi görünümlü özelliklere sahip ilginç dünyalar bitiş: dağlar, denizler vb.

Şimdi yapmak istediğim bir sonraki şey döşemeleri sorunsuz komşuları içine, karıştırmaya sebep olan karıştırma algoritması bir tür uygulamaktıeğerkomşu aynı türden değildir. Örnek yukarıdaki harita oyuncu mini ne buluyor. Ekrandaki bölüm beyaz dikdörtgen ile işaretlenmiş, fayans görüntüleri ile işlenir nerede yerine tek renk piksel olarak işlenmiş bir sürümünü görüyorlar.

Bu kullanıcı göster ama bakın ne bir örnektirgösterir yukarıdaki görüş ile aynı yer değil!

enter image description here

Bu geçiş gerçekleşmesini istediğim bu görünümde.

Algoritma

Yukarı görüş içinde çapraz eşleme ve her döşeme üstünden bir görüntü oluşturacak basit bir algoritma ile, farklı tür bir taşın yanında olduğunu sağlayan geldim. (Harita değiştirmek değil! Sadece bazı ekstra görüntü işleme.) Algoritma fikri geçerli döşemeyi komşularının profili için:

An example of a tile profile

Bu senaryo, X ile işaretlenmiş bir örnektir

3 x 3 bir dizi oluşturulur ve değerler okunur. Bu örnekte dizi gibi görünecekti.

[
    [1,2,2]
    [1,2,2]
    [1,1,2]
];

Benim fikrim sonra mümkün karo yapılandırmaları için durumlarda bir dizi çalışma yapıldı. Çok basit bir düzeyde:

if(profile[0][1] != profile[1][1]){
     //draw a tile which is half sand and half transparent
     //Over the current tile -> profile[1][1]
     ...
}

Hangi bu sonucu verir:

Result

Sabit bir kenar kalır [2][1] [1][1] [1][1] değil [0][1] arasında bir geçiş olarak çalışır. Bu durumda köşe döşeme kullanılmış olabileceğini düşündüm. İhtiyaç duyulabilecek fayans olası tüm kombinasyonları yapacağını düşündüğüm iki 3 x 3 sprite sayfaları oluşturdum. O zaman oyunda olduğunu döşemeleri (beyaz alanlar saydam) için bu sentezledim. Bu karo her tür için 16 fayans (her spritesheet Merkez kiremit kullanılmaktadır.) olmak biter

SandSand2

İdeal Sonuç

Bu yüzden, yeni fayans ve doğru algoritma bu, örnek bölümü, bu gibi görünecektir:

Correct

Yaptığım her girişim, her zaman algoritması biraz kusuru var ama başarısız oldu ve desenleri garip. Bu davaların hepsi doğru almak için görünmüyor olabilir ve genel yapmanın kötü bir yol gibi görünüyor.

Bir Çözüm?

Eğer herkes bu etkiyi nasıl yaratacağımı, ya da profil oluşturma algoritması yazmak için ne gibi alternatif bir çözüm olabilir eğer çok minnettar olacaktır!

CEVAP
22 Ocak 2013, Salı


Bu algoritma temel fikir tüm kenarları bulmak ve doğru yumuşatma kiremit seçmek için ön işleme adım kenar şekline göre kullanmaktır.

İlk adım, tüm kenarları bulmak olacaktır. Aşağıda örnektekenar döşemebir X ile işaretlenmiş sekiz komşu kendi çini bir veya daha fazla olarak tan bir karo ile tüm yeşil çini. Arazinin farklı türleri ile bu durum ise arazi-sayı alt komşuları varsa bir kiremit kenar döşemesi olmak anlamına gelmektedir.

Edge tiles.

Fayans yapmak için bir sonraki şey tespit bir kez tüm kenar her karo için sağ kenar yumuşatma çini seçin. İşte yumuşatma taşlarını benim gösterimi.

Smoothing tiles.

Aslında çini birçok farklı türleri vardır unutmayın. 3 x 3 kareler sekiz dış fayans ihtiyacımız var ama sen düz kenar taşları diğer beri sadece dört köşe kareler zaten ilk Kare bulunur. Bu toplam ayırt etmeliyiz 12 farklı durumlar vardır anlamına gelir.

Şimdi, bir kenarı döşeme de dört en yakın sınır komşusu fayans bakarak döner belirleyebiliriz arıyor. Aşağıdaki altı farklı durumlar var gibi yukarıda X ile kenar döşemesi işaretleme.

Six cases.

Bu gibi durumlarda, ilgili düzeltme kiremit belirlemek için kullanılır ve yumuşatma fayans buna göre sayı edebiliriz.

Smoothed tiles with numbers.

Hala bir seçim ya da her durum için bir b var. Bu çimlerin üzerinde bağlıdır. Bu sınır yönünü ama muhtemelen bunu yapmak için en kolay yolu takip etmek olabilir belirlemek için tek yönlü bir döşeme kenarı yanına almak ve görmek için. Arasında örneğin sağ üst kiremit rengi kontrolü ile ayırt edilebilen iki dava 5a gösterir aşağıdaki resim) ve 5b).

Choosing 5a or 5b.

Orijinal örneğin son numaralandırma sonra bu gibi görünecektir.

Final enumeration.

Ve karşılık gelen kenar kiremit seçtikten sonra sınırın bu gibi bir şey olacaktır.

Final result.

Son bir not olarak bu sınır biraz daha düzenli olduğu sürece işe yarayacağını söyleyebilirim. Daha doğrusu, komşuları olarak tam iki kenarı fayans olmayan kenar döşemeleri ayrı ayrı tedavi edilmesi gerekir. Bu kenar komşu kenar döşeme sayısı üç ya da dört olabilir, tek bir kenar komşusu ve arazinin çok dar parçalar için olan haritanın kenarında kiremit ortaya çıkar.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • circuschina

    circuschina

    16 Mart 2007
  • jat4011

    jat4011

    16 EKİM 2010
  • Jonathan D.

    Jonathan D.

    3 Kasım 2006