2D kiremit tabanlı yan kaydırma arazisini rastgele nasıl oluşturabilirim?


11

Aşağıdaki tileset kullanarak rastgele bir 2D sidescroller oyunu için bir harita oluşturmak istiyorum: resim açıklamasını buraya girin

Bitmasking işlemi hakkında birkaç harika makale buldum, örneğin: http://www.angryfishstudios.com/2011/04/adventures-in-bitmasking/ http://www.saltgames.com/2010/a-bitwise kullanılan yöntem-için-uygulama-tilemaps /

Büyük bir yan tümce veya anahtar deyimi yapmak yerine bir bitmask / tilemask kullanma fikrini seviyorum.

Ancak, tüm süreci görselleştirmekte sorun yaşıyorum ve bu makalelerin hiçbiri randomizasyon hakkında konuşmuyor.

Fayanslarım, birbirine bağladığım örneklerdeki fayansların göründüğü gibi tek bir şekilde değil, farklı şekillerde birbirine uyuyor.

Örneğin, burada birkaç örnek verilmiştir:

resim açıklamasını buraya girin

resim açıklamasını buraya girin

resim açıklamasını buraya girin

resim açıklamasını buraya girin

Fayanslarım birçok farklı şekilde birbirine uyduğundan, 8 bitlik bir maskenin çalışacağını düşünmüyorum. Bu nedenle, daha büyük bir bit maskesi kullanmayı düşünüyordum. Char [8] veya char 4 gibi bir şey .

Birisi lütfen genel algoritmanın nasıl görüneceğine dair bazı sahte kodlar / örnekler gösterebilirse, bunu çok takdir ediyorum.

Yanıtlar:


3

Evet, maske boyutu artan sayıda seçenekle büyüyecektir - kendi bağlantınız http://www.saltgames.com/2010/a-bitwise-method-for-applying-tilemaps/ ikinci bölüm ana fikri açıklamaktadır.

Özünde, fayanslar arasındaki her 'sınır' için X olasılıklarını numaralandırmanız gerekir; özel örneğinizde "kiremit üst / alt", (1) beyaz (2) kaplamalı veya (3) yarı kaplamalı olabilir - bu da makalede verilen 'üçlü' örnekle çakışır.

Ancak maskeler yalnızca döşeme olanaklarını çizilebileceklerle kısıtlamanıza yardımcı olacaktır, tek başına gerçek haritaların nasıl mantıklı bir şekilde oluşturulacağını gösteren bir yöntem değildir .

Özel döşemeniz aslında oldukça kısıtlayıcıdır - sadece tek bir yüzeyi yükselen / düşen tanımlar ve herhangi bir 'tam sayı seviyesi' başlangıç ​​noktasında sadece birkaç geçerli seçeneğiniz vardır. Örneğin, # 2 döşemesinden sonra yalnızca # 1 veya # 8 döşemeleri mümkündür. Soldan sağa hareket edebilir, önceki döşemeden sonra hangi (birkaç) döşemenin gelebileceğini listeleyebilir ve bunlardan birini rastgele seçebilirsiniz.


Aradığım cevap bu, ancak yine de biraz bulutlu. Açıklamanızın son bölümünün nasıl çalışacağına dair metin veya sözde kodla biraz daha ayrıntılı olabilir misiniz? "Soldan sağa hareket edebilir, önceki döşemeden sonra hangi (birkaç) döşemenin gelebileceğini listeleyebilir ve rastgele birini seçebilirsiniz."
erebel55

1
Her karo türü için, bundan sonra hangi karolara izin verildiğinin bir listesini alın - çok az karo var, hızlı bir şekilde manuel olarak yapılabilir. 'Yükseklik' değişecek, yeni döşemenin altındaki her şeyi # 10s ile doldurun.
Peteris

Ah, bitmasking yerine bu yöntemi kullanmayı mı söylüyorsunuz?
erebel55

1
Evet, tüm 2d içeriğinin anlamlı olması durumunda bit maskeleme yararlıdır, ancak haritalarınız tek seviyeli, değişen yükseklikte yatay bir yüzey gibi görünüyor.
Peteris

Bu anlamlıdır, "dağlar" farklı yüksekliklerde olacak ve birbirlerine akacaktır. Yani esasen, ilerledikçe dağların sürekli değiştiği yükseklikler olacaktır. Farklı noktalarda rastgele büyüklüklere sahip bir kosinüs / sinüs dalgası gibi. Haritayı oluştururken sola sağa mı yoksa yukarıdan aşağıya mı hareket etmeliyim?
erebel55

6

1D Perlin veya simpleks gürültü fonksiyonu kullanmayı düşündünüz mü? Bunun da dahil olmak üzere bir dizi avantajı vardır:

  1. Sonsuz (kayan nokta hassasiyeti alanında), tekrarlanmayan arazi

  2. Gerçek zamanlı olarak üretilebilir ( hızlı olan bir gölgelendiricide bile ) veya vaktinden önce üretilebilir ve örneğinizde olduğu gibi dokularda saklanabilir

  3. Perlin ve simpleks sürekli olduğundan kenarlıklar otomatik olarak eşleşir.

  4. Arazinin kendisi sahte rastgele olsa da, bir zarf işlevi uygulamak veya düz alanlara veya ihtiyacınız olan diğer belirli arazi özelliklerine ihtiyacınız olan alanlarda oktav sayısını azaltmak yeterlidir.

1D Perlin uygulamasının oldukça ayrıntılı bir açıklaması için bu bağlantıya bakın .

Zarf, çıktınızı kaydetmeden veya görüntülemeden önce gürültü işleviyle çarpılan, skaler bir alan veya işlevdir.

resim açıklamasını buraya girin

(İlk resim yukarıda belirtilen makaleden ödünç alınmıştır.)

Bu örnekte, kırmızı çizgi şu şekilde tanımlanmış parçalı bir işlevi temsil eder:

x < 0.3 : y = (0.3-x)/0.3)
x < 0.5 : 0
x < 0.7 : (x - 0.5) / 0.2
else    : 1

... düzgün bir fonksiyon kullanılarak daha iyi tanımlanabilir. Bu durumda, platodan önce şeyleri 0'a kadar ölçeklendirir, daha sonra 1'e kadar geri gider.

Güncelleme

Tamamen bir dikey + tess + parça gölgelendirici borusu içinde üretilen dağınık + aynasal aydınlatma uygulanmış, projelerimden birinden 3B simpleks "arazi" örneği. Durumunuz için, arazi eğimini elde etmek için bundan dikey bir dilim alırdım.

resim açıklamasını buraya girin

Ve yukarıdan aşağıya dikey bir görünüm:

resim açıklamasını buraya girin


Bu gerçek döşeme görüntülerini kendileri oluşturmak için bir teknik mi?
erebel55

1
@ erebel55 Evet. Görüntünün içine farklı bitki çocuklarını nereye koyacağınıza (örneğinize göre) karar vermek ve ayrıca eğimli araziyi oluşturmak için 2B işlevini kullanabilirsiniz. Bunu 3D olarak harika sonuçlarla kullandım.
3Dave

İlginç bir yönteme benziyor, resimlerimi zaten oluşturduğumdan bu rotaya gitmek istediğimden emin değilim.
erebel55

@ erebel55 evet, sizin için çalışıyorsa mevcut şeyleri atmak için bir neden yok.
3Dave

Rastgele nesil henüz çalışmıyor, ama umarım;) ilginç olduğu için bu yöntem için size bir oy verdim, ilginçti ve gelecekte bir süre kullanabilirim. Thank you
erebel55
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.