İlk 'uygun' oyun projeme başlıyorum ve kaçınılmaz olarak XNA'daki oyun bileşenlerinin nasıl iletişim kurması gerektiğine karar vermeye çalışan bir bloğa çarptım.
Önceki (Java) GUI programlama olaylarından, işleyiciler ve dinleyiciler ilerlemenin yolu gibi görünüyordu. Bu yüzden olaylara abone olan olay kayıtlarını ve sınıfları kabul eden ve onlarla başa çıkmak için işleyicileri olan bir tür olay otobüsüm olurdu. Örneğin (sözde kod):
class SpriteManager
Update(){
if(player.collidesWith(enemy)
// create new 'PlayerCollisionEvent'
}
class HUDManager
onPlayerCollisionEvent(){
// Update the HUD (reduce lives etc)
}
Ancak, tam olarak bunu gerçekleştirmek için gerekli olacak kod kurulum (C #) emin değilim. Olayları takip eden nedir (bir tür otobüs?) Ve nasıl yapılandırılmıştır?
Oyun Hizmetlerinde de ana Game.cs sınıfınıza bir GameComponent kaydedebilir, ardından kodunuzda ana 'Oyun' nesnesine referans olan herhangi bir yerden getirebileceğiniz çok şey var gibi görünüyor. Bu benim SpriteBatch nesnesi ile denedim ve çok kolay görünüyor .. Ancak, bu bir olay modeli kadar esnek olduğunu göremiyorum.
Örneğin bir düşman öldüğünde bunu ele alalım. Oyun skorunu güncellemek istiyoruz. Hizmetleri kullanarak Game1'de oluşturulan ve bir hizmet olarak eklenen StateManager nesnesime bir başvuru alabilir, ardından yeni değere 'skor' ayarlayabilirim. Çok sayıda sınıf tarafından farklı şekilde ele alınabilen, ancak ilgili 'düşman ölüm tespiti' bölümünde 1 kod satırı ile başlatılan bir 'onEnemyDeath' olayını düşünürdüm, her bir GameComponent'i tek tek dökmekten ve daha sonra yöntemleri gereklidir.
Yoksa bu stratejiler başka bir şeye mi daha düşük?
Bunun kısmen oyun iletişimi paradigmaları kadar benim zayıf C # bilgim olduğunu fark ettim, ama bu temel şeyi doğru yapmak istiyorum.
Güncelleme
Hizmetlere bakmak daha az ikna oldum - temelde küresel bir değişkeni (anladığım kadarıyla) geçiyor.
Güncelleme 2
Olay işleme ve örnek kod test bu temel öğretici bir göz vardı olayları tartışmak ne için mantıklı bir seçim gibi görünüyor. Ama gördüğüm örneklerde çok fazla kullanamıyorum. Birinin olmamasının açık bir nedeni var mı?