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?
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?
Yanıtlar:
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.
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.
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 .
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.
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.