İtiraf ediyorum, aşırı kullanımın ve hatta mirasın kötüye kullanılmasının günahını yaptım. OOP kursumu alırken yaptığım ilk (metin) oyun projesi, "Kapı" ve "Tek kapılı oda", "İki kapılı oda" ve "Kilitli kapı" ve "kilitli kapı" "Oda" dan öyle.
Son zamanlarda üzerinde çalıştığım (grafik) oyunla dersimi öğrendiğimi ve miras kullanmayı sınırladığımı sanıyordum. Ancak yakında ortaya çıkmaya başlayan sorunları fark ettim. Kök sınıfım gittikçe şişmeye başlamıştı ve yaprak sınıflarım yinelenen kodlarla doluydu.
Hala yanlış şeyler yaptığımı sanıyordum ve çevrimiçi baktıktan sonra bu problemle tek ben olmadığımı keşfettim. Bu kadar kapsamlı bir araştırmadan sonra Entity sistemlerini keşfettim (read: googlefu)
Üzerine okumaya başladığımda, geleneksel OOP hiyerarşisi ile yaşadığım sorunları bileşenlerle ne kadar açık bir şekilde çözebildiğini görebildim. Ancak bunlar ilk okumalarda vardı. T-makinesinde olduğu gibi daha fazla… “radikal” ES yaklaşımına tökezlediğimde .
Kullandıkları yöntemlere katılmamaya başladım. Saf bir bileşen sistemi, aşırı derecede ya da daha doğrusu, muhtemelen OOP'un gücü olan sezgisel görünüyordu. Yazar, ES sisteminin OOP'nin tersi olduğunu söyleyecek kadar ileri gider ve OOP boyunca kullanılabilir olsa da, gerçekten olmamalıdır. Yanlış olduğunu söylemiyorum, ama uygulamak istediğim bir çözüm gibi hissetmedim.
Bu yüzden benim için ve görevin başında yaşadığım sorunları çözmek için, sezgilerime karşı çıkmadan, hala bir hiyerarşi kullanmak, ancak daha önce kullandığım gibi monolitik bir hiyerarşi olmayacak, aksine birkaç tane daha küçük ağaçtan oluşan çok kutuplu bir kelime (monolitik karşıt bir kelime bulamadım).
Aşağıdaki örnek, ne demek istediğimi gösterir (bu, Oyun Motoru Mimarisi, Bölüm 14'te bulduğum bir örnekten esinlenmiştir).
Araçlar için küçük bir ağacım olurdu. Kök araç sınıfının bir oluşturma bileşeni, bir çarpışma bileşeni, konum bileşeni vb.
Daha sonra bir tank, bir araç alt sınıfı, bu bileşenleri ondan devralır ve kendi "top" bileşeni verilir.
Aynı şey Karakterler için de geçerli. Bir karakterin kendi bileşenleri olur, sonra Player Sınıfı onu devralır ve bir Giriş kontrolörü verilirken, diğer düşman sınıfları Karakter sınıfından miras alır ve bir AI kontrolörü verilir.
Bu tasarımla ilgili herhangi bir sorun görmüyorum. Saf bir Varlık Denetleyici Sistemi kullanılmamasına rağmen, köpürme efekti ile ilgili sorun ve büyük kök sınıfı çok ağaçlı bir hiyerarşi kullanılarak çözülür ve ağır, kod çoğaltma yapraklarının sorunu, yaprakların başlamak için herhangi bir kod var, sadece bileşenler. Yaprak düzeyinde bir değişiklik yapılması gerekiyorsa, kodu her yere kopyalamak yerine tek bir bileşeni değiştirmek kadar basittir.
Tabii ki, benim kadar deneyimsiz olmak, tek hiyerarşi, kalıtım ağır modelini ilk kullanmaya başladığımda herhangi bir sorun görmedim, bu yüzden şu anda uygulamayı düşündüğüm modelle ilgili sorunlar varsa, görebilmek.
Senin fikirlerin?
Not: Java kullanıyorum, bu yüzden normal bileşenleri kullanmak yerine bunu uygulamak için birden fazla miras kullanmak mümkün değildir.
PPS: Bileşenler arası iletişim, bağımlı bileşenler birbirine bağlanarak yapılacaktır. Bu birleşmeye yol açacak, ama bence bu bir sorun değil.