Rastgele harita üretimi


63

Java'da 2B tilemap RPG oyununa başladım / başladım ve rastgele harita oluşturma uygulaması yapmak istiyorum. Su kiremitleri ve yol kiremitleri ile birlikte farklı kiremitlerin (kir / kum / taş / çimen / çakıl vb.) Bir listesine sahibim, sorunum rastgele bir harita oluşturmaya nereden başlayacağım hakkında hiçbir fikrim yok.

Arazi kısımlarına sahip olması gerekecekti (Bir kısmı kum, kısım kir vb. Olacak). Minecraft'ın farklı biyomlara sahip olduğu yerde olduğu gibi ve sorunsuz bir şekilde birbirlerine dönüştüğü gibi. Son olarak, haritanın her yerine farklı yönlere giderken, buna rastgele yollar eklemem gerekecek.

Kimsenin bana tüm kodu veya herhangi bir şeyi yazmasını istemiyorum, lütfen beni doğru yöne yönlendirin.

tl; dr - Biyomlar, yollar ile kiremit haritası oluşturun ve biyomların birbirine sorunsuz bir şekilde girdiğinden emin olun.

Yanıtlar:


68

Sitedeki diğer pek çok soru arasında, harita üretimi için sıkça bağlantılı bir makale bulunmaktadır: Oyunlar için Çokgen Harita Üretimi Bu makaleden bazı iyi stratejiler toplayabilirsiniz, ancak gerçekten olduğu gibi kullanılamaz.

Bir öğretici olmasa da, Cüce kalesi dünya haritalarının nasıl oluşturulduğuna dair bir makale var . Temel olarak, yükseklik, nem, sıcaklık, tuzluluk için birden fazla gürültü katmanı oluşturursunuz. O zaman şöyle bir şey kullanırsın:

görüntü tanımını buraya girin

Veya bu

görüntü tanımını buraya girin

Daha önce ürettiğiniz gürültü katmanlarına dayanarak biyomlar üretmek. Tipik olarak bu, biyomlar arasında oldukça yumuşak bir geçiş sağlar ve geçişler mantıklıdır. Ayrıca nem ve sıcaklık haritalarını yükseklik yönüne göre değiştiririm. Bu doğal olarak bir "ahşap çizgi" oluşturur ve karlı başlıkları olan kayalık dağlar oluşturur.

Bu stratejiyi oyunumu kullanıyorum ve bu gibi haritaları çok hızlı bir şekilde üretiyor:

görüntü tanımını buraya girin

Ek olarak, bu videonun başında birkaç harita daha kaydırdığımı görebilirsiniz .

Ve işte başlaman için biraz daha:

Bir kiremit motorunda rastgele bir "dünya" nasıl oluşturabilirim?

Prosedürel olarak oluşturulmuş bir dünyada özellik bölgelerini nasıl tanımlayabilirim?

Harita üretimi için eğilebilir katı paraziti nasıl oluşturabilirim?


Bu Poligon Harita Harita Üretimi bağlantısı çok güzel bir makale olsa da, bu soru için çok uygun olduğunu sanmıyorum, çünkü a) bir uçucu harita ızgarası değil ve b) biyomu yok - arazi dokusu yüksekliği dayalı.
Tapio

@Tapio Haklısın, daha fazla bilgi ile güncellendi.
MichaelHouse

@ Byte56 Teşekkürler, bunların hepsi bana bir başlangıç ​​noktası veriyor! :)
Tom O

@ Byte56 Birkaç yıl önce sorumu söylediğinizi fark ettim, bu yüzden çalışma koduyla güncelledim!
Nick Badal,

1
BTW poligon harita oluşturma projesi yükseklikleri göstermeyen bir çini haritası olan bir oyun için yapıldı. Yükseklikler ve çokgenler biyomları üretmek için oradalar ama aslında oyunda gösterilmiyorlar.
sabah

29

Buradaki diğer cevaplar, bu özel ihtiyaç için işe yarayacak statik manzara türlerini oluşturmak için gerçekten iyi. Bu soruna rastlayan kişilerin, zaman içinde değişen veya daha gerçekçi görünen manzaralar oluşturmak istiyorlarsa, bu tekniği uygulayabilecekleri başka yöntemler de olabilir.

Diğer cevapların aksine, bunu tamamen boş bir harita ile başlatıyorsunuz. Deniz seviyesi olarak kabul edeceğiniz şeyle başlayın. Çok hafif bir değişiklik eklemek için Perlin Gürültüsünü kullanın , 256 olası yüksekliğiniz varsa, her iki yönde de 3-5'ten fazla değişmeyin. Bu, peyzajınızın ilk birkaç milyar yılını, aslında o kadar uzun süre boyunca bir simülasyon yapmak zorunda kalmadan inşa eder.

Levha tektoniği

Tabaklar oluşturmak için haritayı düz veya kavisli çizgiler boyunca böldüğünüzde, plakaların şekilleri ne kadar ayrıntılı olursa manzara o kadar ilginç olur. Onları geniş tut. Her plakaya bir yön, hız verin. Belirli bir zaman dilimi içinde plakaları harita üzerinde adım adım akıllıca hareket ettirin ve üstlerindeki tüm döşemeleri yanlarında sürükleyin.

İki plaka geçtiğinde, hangisinin üzerinden geçeceği ve hangisinin altına gireceği ile ilgili bir seçim yapın, bu seçim rastgele olabilir. Altında belirtilen plakalar üzerindeki fayanslar 5 basamakta anında azalır. Bir plakanın üzerine veya altına atandığında, plakalarla gelecekteki tüm etkileşimler bu kuralları izleyecektir:

  • Belirtilen bir plakanın tasarlanmamış bir plakayı geçtiği durumlarda, tasarlanmamış plak ters tipte olur. (Böylece, UD plakaları üstünden geçerken altta kalır.)
  • Bir üst levhanın bir alt levhanın üzerine oturduğu yerde, tüm bu karolar 0-1 yükselme basamağında hareket eder ve karolar üst plakanın yolunu izler.
  • Bir üst levhanın bir üst levhanın üstünden geçtiği yerlerde, tüm bu karolar 1-2 adım yukarı hareket eder ve çapraz bölge üzerindeki karolar artık kaymaz.
  • Bir alt plakanın bir alt plakayı geçmesi durumunda, bölgedeki her iki plaka için% 66 işaretinden daha yüksek olan bölgedeki fayanslar 1-3 adım yukarı çıkarlar (sanki volkanik aktivite ile sanki yeterli zamana sahip adalar üretecektir) ) ve bu bölgedeki fayans sürüklenmeyi durdurur.

Tüm plakalar, her adımda geçerli hızlarının% 20'si kadar yavaşlar. Eklenen gerçekçilik için, her adımda hareket yönünde% -10 ila% 10 değişiklik ekleyin.

İstediğiniz adım sayısını gerçekleştirdikten sonra. Muhtemelen 5-10'u bol. Tabakta bulunmayan fayanslar mevcut en düşük seviyeye düşürülmelidir.

Büyük veya küçük?

Bu harita, 4X4 kiremit (hücre) topaklarına bölünerek ve bu bölümleri kendi yüksekliklerine göre genişleterek daha büyük bir harita oluşturmak için olduğu gibi kullanılabilir veya genişletilebilir. Her bir hücrenin yüksekliğini bir nokta olarak kabul edin ve bu noktalar arasındaki daha büyük haritada yumuşak bir derecelendirme oluşturun. Yani, daha büyük harita 4X4 yerine 40X40 ise ve nokta (0,0) 10 ve nokta (0,1) 1 ise, daha büyük haritadaki fayanslar 10,9,8,7,6 olacaktır. , 5,4,3,2,1 yüksekliğindedir. Ayrıca yamaçların düzleştirilmesi için Perlin Gürültüsü eklenebilir. Tüm bu ölçeklendirme tekniği, Diamond Square algoritmasına benzer .

Su

Nehirleri ve gölleri, okyanusları ve su tablolarını simüle etmek. Hücresel otomatları kullanmayı tercih ederim .

Daha ince taneli izlemeye izin vermek için yükseklikler yüzer veya genişletilmiş int aralıkları olur. Su hücreleri, 1-256 aralığında, doyma değerlerine sahiptir. Haritalar eşit başlamalı. Bireysel harita büyüklüklerinizin sayıları ile oynamanız gerekecektir, ancak genel olarak böyle bir kural uygularsınız:

  • Komşu bir hücre daha doymuşsa, doygunluğu arttırın ve yükseklik kazanın.
  • Komşu bir hücre daha az doymuşsa, doygunluğu azaltın ve yüksekliğini yitirin.

Bu komşu her hücre için kontrol edin. Yeterli sayıda adım adım ilerleyin. İsterseniz, bu sıcaklığa göre kayıp / kazanılmış doygunluk miktarını değiştirerek bu simülasyona sıcaklık ekleyebilirsiniz. Ayrıca yüksekliği baz alarak da değiştirebilirsiniz. Doğal göller ve nehirler oluşmalıdır. Bazıları okyanusa düşecek. (Okyanus büyük olasılıkla herhangi bir metriği doldurmaz, ancak deniz seviyesinin altındaki herhangi bir şeyi sonunda yine de su dolu olacak şekilde belirlersiniz.

Biyoloji oluşturmak için diğer cevaplarda olduğu gibi kullanılacak sıcaklık ve doygunluk verilerini saklayabilirsiniz. Çok daha doğru ve ilginç olmalılar. Kutuplarda karlı biyomlar ve ortada sıcak olanlar (yumuşak dereceli sıcaklık listesi kullanıyorsanız)

Ayrıca rüzgarı simüle edebilirsiniz ve bu nedenle yüksekliklere bağlı olarak sıcaklık değişebilir. İsterseniz sıcaklık simülasyonu ile su simülasyonu arasında geçiş yapabilirsiniz. Ancak sıcaklık değişimlerini kullanarak hiçbir şey yapmadım, bu yüzden bunun nasıl yapılacağı hakkında yorum yapmayacağım.

Gelişen Manzaralar

Arazi, su ve ısı için simülasyonları tutarsanız ve etkilerini önemli ölçüde azaltır ve aynı zamanda plakaların hareket etmesini önlerseniz, zamanla tüm bu ölçümleri değiştirmeye devam edebilirsiniz. Hesaplamaları çok sık yapmazdım, ama bu şekilde değişikliklere cevap veren bir dünya haritası elde edebilirsiniz.

Sonuç

Bu tür teknikler çok daha etkili olsalar da, çok daha gerçekçi ve gelişen etkiler yaratırlar. Buna değer ne için al?


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.