Oyun yaparken genellikle tüm varlıkların miras aldığı şu oyun nesnesini yaratırsınız:
public class GameObject{
abstract void Update(...);
abstract void Draw(...);
}
Böylece, güncelleme döngüsünde tüm oyun nesneleri üzerinde yineleme yaparsınız ve onlara durum değiştirme şansı verirsiniz, daha sonra bir sonraki çizim döngüsünde tüm oyun nesneleri üzerinde tekrarlanır ve onlara kendilerini çizme şansı verirsiniz.
Bu, basit bir ön oluşturucu ile basit bir oyunda oldukça iyi çalışmasına rağmen, genellikle modellerini, çoklu dokuları ve oyun nesnesi arasında sıkı bir bağlantı oluşturan yağ çekme yönteminin en kötüsünü depolaması gereken birkaç dev oyun nesnesine yol açar. mevcut render stratejisi ve render ile ilgili sınıflar.
Eğer render stratejisini ileri seviyeden ertelemeye değiştirseydim, bir çok oyun nesnesini güncellemem gerekecekti. Ve yaptığım oyun nesneleri olabildiğince tekrar kullanılamaz. Elbette miras ve / veya kompozisyon, kod çoğaltma ile savaşmama ve uygulamayı değiştirmeyi biraz daha kolay hale getirmeme yardımcı olabilir, ancak yine de eksiktir.
Belki de daha iyi bir yol, Draw yöntemini GameObject sınıfından tamamen kaldırmak ve bir Renderer sınıfı oluşturmaktır. GameObject'in hangi görselle temsil edileceği ve modelde hangi dokuların boyanması gerektiği gibi görselleriyle ilgili bazı veriler içermesi gerekir, ancak bunun nasıl yapıldığı oluşturucuya bırakılır. Bununla birlikte, genellikle render sırasında çok sayıda sınır durumu vardır, bu nedenle bu, GameObject'ten Renderer'a sıkı bağlantıyı kaldıracak olsa da, Renderer hala şişmanlaştıracak tüm oyun nesnelerini bilmeli, sıkı bağlanmış. Bu, birkaç iyi uygulamayı ihlal edecektir. Belki Veri Odaklı-Tasarım hile yapabilir. Oyun nesneleri kesinlikle veri olacaktır, ancak oluşturucu bununla nasıl yönlendirilir? Emin değilim.
Bu yüzden kaybım var ve iyi bir çözüm düşünemiyorum. MVC ilkelerini kullanmaya çalıştım ve geçmişte bunu oyunlarda nasıl kullanacağım hakkında bazı fikirlerim vardı, ancak son zamanlarda düşündüğüm kadar uygulanabilir görünmüyordu. Hepinizin bu problemle nasıl başa çıktığını bilmek isterim.
Her neyse, özetleyelim, aşağıdaki tasarım hedeflerine nasıl ulaşılabileceğiyle ilgileniyorum.
- Oyun nesnesinde oluşturma mantığı yok
- Oyun nesneleri ve render motoru arasında gevşek bağlantı
- Hiçbir şey bilmeyen renderer
- Tercihen render motorları arasında çalışma zamanı geçişi
İdeal proje kurulumu ayrı bir 'oyun mantığı' olacaktır ve birbirlerine referans vermesi gerekmeyen mantık projesi oluşturur.
Bu düşünce treni, John Carmack'in Twitter'da, çalışma motorlarını çalışma zamanında değiştirebileceği ve hatta sistemine her iki oluşturucuyu (bir yazılım oluşturucu ve donanım hızlandırmalı bir oluşturucu) kullanmasını söyleyebileceği kadar esnek bir sistem olduğunu söylediğinde duyduğumda başladı. aynı zamanda farklılıkları denetleyebilir. Şimdiye kadar programladığım sistemler bu esnekliğe bile yakın değil