Eh, bu yazının oldukça eski olduğunu biliyorum ama dayanamadım.
Geçenlerde bir oyun motoru yaptım. Render ve fizik için 3 boyutlu parti kütüphaneleri kullanıyor, fakat varlıkları ve oyun mantığını tanımlayan ve işleyen temel kısmı yazdım.
Motor kesinlikle geleneksel bir yaklaşım izler. Tüm varlıklar için güncelleme işlevini çağıran ana güncelleme döngüsü vardır. Çarpışmalar, doğrudan varlıklar üzerindeki geri aramalarla rapor edilir. Varlıklar arasındaki iletişim, varlıklar arasında değiştirilen akıllı işaretçiler kullanılarak yapılır.
İlkel bir mesaj sistemi vardır, motor mesajlarına yalnızca küçük bir varlık grubunu işler. Bu mesajların bir oyun etkileşiminin sonunda (örneğin bir varlık yaratma veya yok etme) işlenmesi tercih edilir çünkü güncelleme listesine karışabilirler. Böylece, her oyun döngüsünün sonunda küçük bir mesaj listesi tüketilir.
İlkel mesaj sistemine rağmen, sistemin büyük ölçüde "güncelleme döngüsü tabanlı" olduğunu söyleyebilirim.
İyi. Bu sistemi kullandıktan sonra çok basit, hızlı ve iyi organize olduğunu düşünüyorum. Oyun mantığı görünürdür ve varlıkların içinde bulunur, bir mesaj quewe gibi dinamik değildir. Olayı yönlendirmek istemezdim çünkü bence olay sistemleri oyun mantığına gereksiz bir karmaşıklık kazandırıyor ve oyun kodunun anlaşılmasını ve hata ayıklamasını çok zorlaştırıyor.
Ancak, benim gibi saf bir "güncelleme döngüsü tabanlı" sistemin de bazı sorunları olduğunu düşünüyorum.
Örneğin, bazı anlarda bir varlık "hiçbir şey yapma" da olabilir, oyuncunun yaklaşmasını ya da başka bir şeyi bekliyor olabilir. Bu durumların çoğunda, işletme hiçbir işlem yapmadan işlemci zamanını yakar ve varlığı kapatmak ve belirli bir olay gerçekleştiğinde açmak daha iyidir.
Bu yüzden, bir sonraki oyun motorumda farklı bir yaklaşım benimseyeceğim. İşletmeler güncelleme, çizim, çarpışma algılama vb. Motor işlemleri için kendilerini kaydedeceklerdir. Bu olayların her biri, gerçek varlıklar için ayrılmış varlık arayüzleri listelerine sahip olacaktır.