Bileşen tabanlı bir mimariyle etkili bir oyun nesnesi etkileşim şemasını nasıl tasarlayabilirim?


14

Bu bir tasarım sorusu ... Bunun daha genelleştirilebileceğinden eminim, ama bununla zorlanıyorum. Oyun nesnesi etkileşimleri için tasarım merak ediyorum - işte benim örneğim (2D bulmaca platformer).

Diyelim ki oyuncu bir seviyede ilerlemeye çalışıyor. Farklı yönlere işaret edebilecek birçok ışık var. İşte bu hafif nesnelerin nasıl etkileşime girebileceğine dair bir örnek ...

  • Bir ışık, oyuncunun bir boşluğu geçmesine izin veren bir platform yansıtır
  • Bir ışık dokunduğu her şeyin sürtünme katsayılarını azaltır, diğeri ise onu artırır
  • Bir ışık tüm ışıkların etkilerini, bu ışık açıkken platformun kaybolmasını ve sürtünme değiştiricilerini geçersiz kılmasını sağlar.
  • Vb...

Bileşen mimarisini kullanırken bu soruna yaklaşmanın en iyi yolu nedir? Her büyük nesne için bileşenler açıktır ve bunların çevre üzerindeki etkilerini tanımlamanın temiz bir yolu vardır. Etkileşimi "çözmek" için bir sınıf (bu hızla karışıklık haline gelebilir gibi görünüyor)? Dekoratör deseninin belirli bir zamanda etkileşimde bulunanlar için birleştirilmiş nesneler oluşturmak için bir miktar kullanımı? Kendine borç veren bir veri yapısı mı?

Ayrıca, bu etkileşimlere ses bağlamak? Sesi sisteme bağlamak, görünürlük veya oyuncu hareketi / çarpışma gibi başka bir özelliği bağlamak gibi görünmektedir.

Açıkçası, daha fazla bileşen eklendikçe, yenilerini çok az modifikasyonla başa çıkabilecek sağlam bir sistem olsaydı iyi olurdu, ancak bunu nasıl tasarlayacağımı bilmiyorum.

Diğer Bilgiler: Kullandığım motor IceCream adlı bir XNA motorudur .



2
Bununla birlikte, Joe'nun verdiği bağlantıdaki "soru" nun aksine, burada gerçek bir soru var.
dash-tom-bang

2
dupe'yi görmüyorsanız, soru, bir bileşen sistemi kullanarak belirli bir oyunun kod gereksinimlerini nasıl tasarlayacağınızla ilgilidir (@Christopher: hangisinin yardımcı olacağını söyleyerek, Unity? Torque? Tescilli?)
LearnCocos2D

2
Bu arada oyun fikrinizi seviyorum =)
Nailer

Yanıtlar:


5

Nesne yönelimli bir sistemde, X yapmanın en iyi yolunun ne olduğu sorusunun tek gerçek cevabı, bir şeyi hazırlayıp çalıştırmak için düşünebileceğiniz en basit yoldan yapmanız ve ardından bir daha kolay ifade ortaya çıkar. Herhangi bir kod yazmadan önce doğru kalıbı seçmeyle ilgili olarak, hareket halindeyken yanlış cevapla kendinizi telafi etmenin iyi bir yoludur; kalıpların ve bileşenlerin tüm düşüncelerinin erimesine izin verin ve bugün bulunduğunuz yerden başlayarak bu adımları izleyin (hafif bir bileşen uyguladığınızı varsayarak):

  1. Platformlara ışık bileşenine kod ekleyin. (Bunu çalıştır.)
  2. Bu bileşeni yeni bir bileşene kopyalayın, platform malzemelerini kaldırın ve uygun nesnelerin sürtünmesini azaltmak için kod ekleyin. (Bunu çalıştırın, # 1'in hala çalıştığını doğrulayın.)
  3. "Yeni" kodunu kaldırarak bu bileşeni yeni bir bileşene kopyalayın ve diğer bileşenlerin efektlerini devre dışı bırakmak için bir şeyler ekleyin. (Bunu çalıştırın, ardından # 1 ve # 2'nin hala çalıştığını doğrulayın.)

Bu noktada, (muhtemelen) bir ton çoğaltılmış kodunuz olacaktır. Ortak kodu işlevlere veya başka bir sınıfa (belki de bir temel sınıfa) veya uygun göründüğü şekilde ayıklayın. Bir "hafif bileşen" ile başlamanız, LightComponent'in uygun bir temel olduğu anlamına gelmez; ışık bileşenini oluşturan kod ne olursa olsun gerçekten bir "bileşen" olmayabilir ve belki de en iyi şekilde bir dizi işlevle veya hatta yeni bileşenlerinize (üye değişkeni olarak) toplanan ayrı bir sınıfla temsil edilir. ).


Bunu cevap olarak işaretliyorum çünkü gerçekten "Nasıl tasarlamalıyım ..." diye cevaplıyor. Bunun için teşekkürler, kesinlikle beni doğru yola koydu.
Christopher Horenstein

2

Genel olarak, A tipi bir nesne B tipi bir nesne ile etkileşime girdiğinde, C'nin bir miktar etkisi olmasını istersiniz. Buna "çift gönderme" denir ve C benzeri dillerde zarif bir şekilde yapılması çok zordur.

Etkili ama bakımı zor yol, nesnelerinizin türüne bağlı olarak sadece bir grup anahtar ve if ifadesidir. Yazarken kirli hissedeceksiniz, ancak işi halledeceksiniz.

Ziyaretçi desen kötü tip anahtarlama gizler o daha sağlam bir çözümdür, ama clumbersome kurmak olabilir.

Normalde kodunuzdaki her türlü tip anahtarı bir kokudur, ancak burada iki türe dayalı işlevleri değiştirmek için normalde tek bir türe dayalı işlevleri değiştiren polimorfizmi genelleştirmeye çalışıyorsunuz. Polimorfizm OOP'nin temelidir, bu yüzden bir koku değildir.


2

Bir bakayım. Bu sadece yazarken kafamda pişirdiğim bir şey, bir şey eksik olduğum için çok üzgünüm.

Tüm hafif düğümleri dostunuz etrafında makul bir mesafeye getirin.

Her ışık için, bir çerçeve tampon nesnesi için etki alanını temsil eden bir çokgen oluşturursunuz. Böylece bir ışık konisi FBO'nuzda bir tür pikselden oluşan bir koni oluşturur. Geçişlerdeki her düğüm türünü uygun öncelikte işleyin. Yeşil kanal sürtünme, kırmızı yerçekimi, mavi ve alfa başka bir şey olabilir gibi her piksele bilgi kodlayabilirsiniz.

Akıllı renk karıştırma teknikleri daha sonra ilginç efektler yaratabilir. Her seviyenin kendi karıştırma kuralları olabilir.Ayrıca, titreşimli yerçekimi gibi psychedelic dinamik efektler için parça gölgelemesi de ekleyebilirsiniz.

Son olarak, mandude'nuzun hangi piksellere dokunduğunu kontrol edin ve önceden hesaplanan alanın kenarlarına yaklaştığınızda bitmap'i yeniden hesaplayın.

Fikrimi gösteren 2 dakika içinde yapılan kaba krokisi:

örnekleme

Düzenleme: Pratikte bu, ihtiyacınız olan tek şey, belirli bir renk yayan bir hafif bileşen olduğu anlamına gelir. Hangi rengin ne yaptığına bağlı kurallar tamamen başka bir yerde ne olabilir. Çok sayıda veriyi pr pikseliniz olan 32 bit'e kodlayabilirsiniz. Alternatif olarak, birbirini etkilemeyen farklı nitelikler içeren birden fazla FBO'ya sahip olabilirsiniz. Bir yerçekimi / sürtünme FBO ve bir 1bit çarpışma FBO'nuz olabilir. Bunu seçerseniz, elbette ışığınızın hangi FBO'ya dönüştürülmesi gerektiğini işaretlemeniz gerekir.


Girişiniz için teşekkürler. Görselleri gerçekten takdir ediyorum ve bu gerçekten makinistin perde arkasında nasıl çalışabileceğini düşündürdü.
Christopher Horenstein

Heh, sorun yok. Sorunuza kesin olarak cevap vermediğini biliyorum, ancak bazı sorunlar özel çözümler gerektiriyor. İyi şanslar!
Nailer

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.