2D imha edilebilir bir manzara (Worms gibi) uygulama


76

Worms'daki gibi tahrip edilebilir bir 2B manzara oluşturmak için hangi adımlar yer alacak? İdeal olarak, bu işlemin mümkün olduğu kadar verimli hale getirilmesinin bazı yolları nelerdir?


7
Mükemmel soru Solucanlar iki zorluk çekiyor: yıkılabilirlik ve ayrıca tuhaf açılardan hareket.
ashes999

Sanırım bu birkaç kez burada sorulmuştu
Vishnu

2
Vish, ilgili linkler bunu önermiyor gibi görünüyor.
Komünist Ördek

3
Hedgewars'da nasıl yapıldığını kontrol edebilirsiniz - açık kaynak Worms klonu.
GvS

Bir cevap için yeterli değil, ancak Clonk'u da kontrol etmek isteyebilirsiniz . Belirli piksellere kadar tahrip edilebilir manzaraya sahip Alman bir geliştirici tarafından daha eski bir 2D oyun. Artık geliştirilme aşamasında değil, ancak kaynak koduna yukarıdaki linkten ulaşabilirsiniz. Açık kaynak kodlu halefi OpenClonk da var, ancak videolardan pikseller açısından mükemmel bir yıkımdan uzaklaştığı ve yok edilebilecek türden bloklarla Terraria-esque yönünde döndüğü görülüyor.
Christian,

Yanıtlar:


47

Solucanlardaki manzaraların tam olarak nasıl uygulandığını bilmiyorum ama manzara için bir bitmap kullandıklarından eminim (en azından serinin eski oyunlarında).

Çok temel bir yaklaşım, siyah piksellerin havayı ve beyaz piksellerin zemini temsil ettiği bir bitmap görüntüsü (S / B) olacaktır . Peyzajın imhası, piksel işlemlerini kullanarak kolayca yapılabilir. Böylece bir roket yere çarptığında, radius = blastRadiusçarpma noktasında siyah bir daire çizin.

Daha sonra o bitmap'i kullanarak dünyanızı (veya sadece bir kısmını) oluşturabilirsiniz. Daha iyi performans için, onu "dünyanın" bir kısmını güncelleyebileceğiniz / oluşturabileceğiniz şekilde uygulamanızı öneririm. Örneğin. Peyzajın bazı kısımları bir roket tarafından tahrip edilirse, etkilenen bölgeleri yeniden yaratın, tüm dünyayı değil.

"Çarpışma haritanız" olarak S / B görüntü yerine, piksel başına yüzey normalini (x, y) saklamak için iki kanalı, asıl "çarpışmayı saklamak için bir kanalı kullanmak için 24 bitlik bir görüntü kullanabilirsiniz. "map. Yüzey normalde olması, zıplayan el bombalarını hesaplamanıza veya bir karakterin belirli bir yöne hareket edip edemeyeceğini belirlemenize yardımcı olacaktır.


3
Ekstra bilgileri saklamak çarpışma haritası güzel bir fikirdir.
deft_code

6

Başımın üstünden bir olasılık:

Yıkılabilir "arazi" nin anahatlarını saklamak için bir vektör grafik yolu gösterimi kullanın. Bir yıkım olayı meydana geldiğinde (örneğin, bir el bombası patlar), bir daire olarak temsil edilen patlama alanı, bir boolean çıkarma işlemi yoluyla toprak yolundan kaldırılır. Ortaya çıkan yol kara çarpışma tespiti için yeni "kara" yı ve ayrıca kara toprağını çizme maskesini temsil eder.


2
Bence Hedgewars böyle yapar. @Bill, buna bir göz atabilirsiniz, çünkü açık kaynak kodlu.
Gastón

2
@ Gastón Hedgewars'daki haritaların tümü resimdir (PNG'ler). Vektör grafiklerine dönüştürüldüğünden şüpheliyim. Ayrıca: vektör grafikleri (spline, bezier vb.) Kullanmak, çarpışma algılama veya çıkarma şekilleri gibi işlemler için çok daha fazla CPU ağırlığına sahiptir. Kaynağa bakmak iyi bir fikir olsa da (kodlama tarzı oldukça kötü olsa da :))
bummzack

4
Bunun gibi hesaplama geometrisi ÇOK karmaşık, ÇOK hızlı olabilir!
Adam Harte

Googling "box2d tahrip edilebilir arazi" şimdi birkaç çalıştırılabilir vektör gösterimi veriyor.
Ciro Santilli,

6

Yapıcı katı geometri kullanın

Yıkılabilir araziyi idare etmek için yapıcı katı geometriyi kullanan bir konsept kanıtı yazdım . Boole işlemlerini gerçekleştirmek için GLU Tessellator'ı kullandım. Dokümantasyon için arama nasıl açıklıyor "CSG Kuralları Sargı için kullanımlar" .

Tessellatorın üçgen çıktısını Box2D'ye statik çokgenler olarak besledim. PoC oldukça iyi çalıştı. Keyfi çıkardı ve gerçek zamanlı olarak arazi ekledim ve arazi Box2D ile uygun şekilde davranmaya devam etti. Tek gerçek hıçkırık, GLU tessellator’ının Box2D’nin sevmediği dejenere üçgenler üretebilmesiydi, bu yüzden bunları elle filtrelemek zorunda kaldım.

PoC'daki bir sonraki adım (daha önce hiç görmediğim), bir arazinin bir parçasının ne zaman parçalandığını saptamak için SCC algoritmasını yükseltme grafik kütüphanesinden kullanmaktı (tepeyi bir dağdan keserek). Kesilen arazi hala tahrip olabilir, ancak şimdi üçgen şeklinde eklenmiş dinamik (statik olmayan) bir Box2D gövdesi ile temsil edilir. Dizaynı yaptım ancak destek belgelerine bakmaya başladığımda ilgimi kaybettim. Bir gün yanmış bir dünya / Solucan oyunu yaparken fikrimi tekrar gözden geçirmeyi planlıyorum .


5

Yukarıdaki tüm cevaplar solucanlar gibi en basit vakayı uygulamaktan bahseder. Yani, etki alanına zarar verildiğinde ve diğer her şeye dokunulmadığında. Manzarasının sonunda ikiye bölünebileceğini düşündün mü? Diyelim ki bir dağ var ve oyuncular roket fırlatıcıyla altını kesmişler. Şimdi, dağ düşmemeli mi? Ayrıca, bir manzara için biraz esnek olması doğal olurdu. Worms zamanlarında (en azından onları hatırladığım gibi, uzun yıllar boyunca Worms çalmadım), bilgisayarlar doğru yapmak için yeterince güçlü değildi. Ama şimdi onlar.

Tabii ki, tamamen projenizin hedeflerine bağlı. Ama gerçekten harika olmasını istiyorsanız, belki Box2D'yi bir fizik motoru olarak denemelisiniz . Bununla yapabileceğin çok şey var.


3
Solucanlarda, bir meşale kullanarak manzara boyunca bir delik kazabilirsiniz. O tünel, zavallı meşale solucanına çökecek olsaydı çok komik olmazdı. Havada "yüzen" peyzaj parçalarının bulunması da mümkündü. Teklifin, bir Solucan oyunu gibi değil, eğlenceli bir fikir gibi geliyor.
bummzack

Bütün mesele buydu, o oyundaki farklılıkları düşünüyordum. Ayrıca, peyzajın bazı bölümleri “yüzer” bloklar oluşturmanıza izin verecek şekilde tahrip edilemez ve / veya havada kalıcı olarak asılı kalabilir. Ayrıca, bazıları Goo Dünyasında hangi hava toplarının yaptığı gibi, yukarı veya yanlara çekerek, kendilerine uygulanan sürekli bir kuvvete sahip olabilir.
Septagram,

Komik çünkü aslında böyle bir oyun yapmayı düşünüyordum, Worms teknisyeni için eğlenceli bir twist olurdu. Bitmap katı cisimler fikri kesinlikle başlı başına ilginç bir konudur, karmaşıklık biraz kafamın üstünde.
William Casarin,

Eh, bu durumda bitmap sert cisimler bir sorun olmaz, onun yerine elastik olarak bağlı bir köşegen üçgeni ızgarası yapardım. Goo dünyasını oynadın mı? Değilse, ekran görüntülerine bakın: vgchartz.com/games/pics/6644424aaa.jpg doublegames.de/images/screenshots/world-of-goo_1_big.jpg . Hayır, hayır, hayır, hayır, oynamadıysanız, kesinlikle yapmanız gerekir :) :) Goo topları yerine her üçgenin peyzaj dokunuzun bir bölümünü gösterdiğini ve çok daha küçük olduklarını hayal edin. Etrafında sabitlerle
dolaşırsan

2
Fiziksel motora bir göz atın . Motorun tamamı, her şeyin deforme edici / tahrip edilebilir bir kafes olduğu fikrine dayanıyor (goo kulesi gibi).
deft_code

3

Bummzack dediği gibi Bitmapler. Her ne kadar 1 bit asetat kullanabiliyorsanız veya bu desteğe sahip değilseniz oyununuzda kullanmayacağınız korkunç bir pembe renk kullanın.

Etki noktası sadece piksel rengini kontrol ederek hesaplanabilir. ve bir etki olduğunda, bitmap'in rengini değiştirin (veya silin).

Patlama yarıçapı gelince, ilk durağım Bresenham'ın daire algoritması , çok hızlı ve verimli olacaktı. Her ne kadar ilk önce bir kare gibi bir şeyle bir silme yapmak ve kenarları elde etmek için onu daire içine koymak.

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.