İyi soru! İstediğiniz belirli sorulara ulaşmadan önce şunu söyleyeceğim: sadelik gücünü küçümseme. Tenpn haklı. Bu yaklaşımlarla yapmaya çalıştığınız tek şeyin, bir işlev çağrısını ertelemek veya arayan kişiyi arayandan ayırmak için zarif bir yol bulmak olduğunu unutmayın. Coroutinler'i, bu sorunlardan bazılarını hafifletmek için şaşırtıcı derecede sezgisel bir yol olarak önerebilirim, ancak bu biraz konu dışı. Bazen, sadece işlevi çağırmaktan ve A öğesinin doğrudan varlık B'ye bağlı olduğu gerçeğiyle yaşamaktan daha iyisin.
Bu, basit mesaj geçişi ile birlikte sinyal / slot modelini kullandım ve mutlu oldum. C ++ ve Lua'da çok sıkı bir program olan oldukça başarılı bir iPhone unvanını kullandım.
Sinyal / slot durumunda, eğer A varlığının B varlığına cevap vermek için bir şeyler yapmasını istersem (örneğin, bir şey öldüğü zaman bir kapının kilidini açabilirim) A varlığının doğrudan varlık B'nin ölüm olayına abone olmasını sağlayabilirim. Veya muhtemelen A işletmesi, bir grup kuruluşun her birine abone olur, ateşlenen her olay için bir sayaç artırır ve N öldükten sonra kapının kilidini açar. Ayrıca, "varlık grubu" ve "bunlardan N" genellikle seviye verilerinde tanımlanan tasarımcı olacaktır. (Bir kenara bırakıldığında, bu, coroutine'lerin gerçekten parlayabileceği bir alandır, örneğin, WaitForMultiple ("Dying", entA, entB, entC); door.Unlock ();)
Ancak bu, C ++ koduna sıkıca bağlanan reaksiyonlara ya da doğal olarak geçici oyun olaylarına gelince hantal hale gelebilir: hasar verme, silah yükleme, hata ayıklama, oyuncu odaklı konum tabanlı AI geri bildirimleri. Bu, mesaj iletmenin boşlukları doldurabileceği yerdir. "Bu alandaki bütün varlıklara 3 saniye içinde zarar vermelerini söyle" ya da "kimi vurduğumu, bu senaryo işlevini çalıştırmalarını söylediklerini anladım." Bunu yayınlama / abone olma veya sinyal / yuva kullanarak güzel bir şekilde yapmayı öğrenmek zor.
Bu kolayca üstesinden gelinebilir (tenpn örneğine karşı). Çok fazla hareketiniz varsa, bu aynı zamanda kabalıksız olabilir. Ancak dezavantajlarına rağmen, bu "mesajlar ve olaylar" yaklaşımı kodlanmış oyun kodu (örneğin Lua'da) ile çok iyi örtüşüyor. Betik kodu, C ++ kodunun bakımı olmadan kendi mesajlarını ve olaylarını tanımlayabilir ve bunlara tepki verebilir. Ayrıca kod kodu, C ++ kodunu tetikleyen, seviye değiştirme, ses çalma ve hatta bir silahın TakeDamage mesajının ne kadar hasar vereceğini belirleme gibi mesajları kolayca gönderebilir. Bana bir sürü zaman kazandırdı, çünkü sürekli olarak etrafta dolanmak zorunda değildim. Ve tüm kodumu tek bir yerde tutmama izin verdi, çünkü çoğu yoktu. Düzgün bir şekilde bağlandığında,
Ayrıca, # 2 numaralı dava konusundaki deneyimim, onu diğer yönde bir olay olarak ele alma konusunda daha iyi olmanız. İşletmenin sağlığının ne olduğunu sormak yerine, sağlık önemli bir değişiklik yaptığında bir etkinlik başlat / mesaj gönder.
Arayüzler açısından, btw, bunların hepsini uygulamak için üç sınıfa gittim: EventHost, EventClient ve MessageClient. EventHosts yuvalar yaratır, EventClients abone olur / onlara bağlanır ve MessageClients bir temsilciyi bir mesajla ilişkilendirir. Bir MessageClient'in temsilci hedefinin mutlaka birliğin sahibi olduğu aynı nesne olması gerekmediğini unutmayın. Başka bir deyişle, MessageClients yalnızca mesajları diğer nesnelere iletmek için bulunabilir. FWIW, ev sahibi / müşteri metaforu uygun değil. Kaynak / Lavabo daha iyi kavramlar olabilir.
Üzgünüm, biraz şaşırdım. Bu benim ilk cevabım :) Umarım anlamlı olmuştur.