Kalkan, oyuncunun yerini izleyen kendi varlığı mı olmalı? Hasar filtrelemenin uygulanmasını zorlaştırabilir. Aynı zamanda, bağlı bileşenler ile varlıklar arasındaki çizgileri bulanıklaştırır.
Düzenleme: Ayrılmış bir varlık için yeterli "özerk davranış" olmadığını düşünüyorum. Bu özel durumda, bir kalkan hedefi takip eder, hedef için çalışır ve hedefi geçemez. Bir “kalkan nesnesi” kavramıyla ilgili yanlış bir şey olmadığı konusunda hemfikir olduğum halde, bu durumda bir bileşende tam olarak uyan davranışla ilgileniyoruz. Ama aynı zamanda tamamen mantıksal varlıkların (Dönüştürme ve İşleme bileşenlerini bulabileceğiniz tamamen gelişmiş varlık sistemlerinin aksine) savunucusuyum.
Kalkan, diğer bileşenleri barındıran bir bileşen midir? Böyle bir şeyi hiç görmedim veya duymadım, ama belki de yaygındır ve henüz yeterince derin değilim.
Farklı bir bakış açısıyla görün; bir bileşen eklemek, başka bileşenler de ekler ve çıkarıldıktan sonra, ek bileşenler de gider.
Kalkan, oynatıcıya eklenen bir dizi bileşen mi olmalı? Muhtemelen diğerlerini yönetmek için ekstra bir bileşen ile, örneğin hepsi bir grup olarak çıkarılabilir. (kazara hasar azaltma bileşeninin arkasında bırakın, bu şimdi eğlenceli olurdu).
Bu bir çözüm olabilir, yeniden kullanımı teşvik eder, ancak daha fazla hataya açıktır (örneğin, bahsettiğiniz konu için). Bu mutlaka kötü değil. Deneme ve yanılma ile yeni yazım kombinasyonları bulabilirsiniz :)
Daha fazla bileşen tecrübesi olan biri için açık olan başka bir şey?
Biraz daha ayrıntılı olacağım.
Bir işletmenin ne zaman eklendiğine bakmadan bazı bileşenlerin nasıl öncelik kazanması gerektiğini fark ettiğinize inanıyorum (bu, diğer sorunuza da cevap verecektir).
Ayrıca mesaj tabanlı iletişim kullandığımızı varsayacağım (tartışma uğruna, şu an için bir yöntem çağrısı üzerinden bir soyutlama).
Bir kalkan bileşeni "her takıldığında", kalkan bileşeni mesaj işleyicileri belirli (daha yüksek) bir sırayla zincirlenir.
Handler Stage Handler Level Handler Priority
In Pre System High
Out Invariant High
Post AboveNormal
Normal
BelowNormal
Low
System Low
In - incoming messages
Out - outgoing messages
Index = ((int)Level | (int)Priority)
"Stats" bileşeni, In / Invariant / Normal dizinine bir "hasar" mesajı işleyicisi yükler. Bir "hasar" mesajı her alındığında, HP'yi "değer" miktarıyla azaltın.
Oldukça standart davranış (ne olursa olsun, bazı doğal hasar direnci ve / veya ırksal özellikler koyun).
Ekran bileşeni, Giriş / Ön / Yüksek indeksine "hasar" mesajı iletici kurar.
Every time a "damage" message is received, deplete the shield energy and substract
the shield energy from the damage value, so that the damage down the message
handler pipeline is reduced.
damage -> stats
stats
stats.hp -= damage.value
damage -> shield -> stats
shield
if(shield.energy) {
remove_me();
return;
}
damage.value -= shield.energyquantum
shield.energy -= shield.energyquantum;
stats
stats.hp -= damage.value
Bunun oldukça esnek olduğunu görebilirsiniz, ancak bileşen etkileşimi tasarlanırken dikkatli bir planlama yapılmasını gerektirse de, ileti işleme boru hattı bileşeni ileti olayı işleyicilerinin hangi bölümüne yüklendiğini belirlemeniz gerekir.
Mantıklı? Daha fazla ayrıntı ekleyebilir miyim?
Düzenleme: Birden fazla bileşen örneği ile ilgili (iki zırh bileşeni). Toplam örnek sayımını yalnızca bir varlık örneğinde (bu, bileşen başına düşen durumu öldürür) izleyebilir ve yalnızca ileti olay işleyicileri eklemeye devam edebilir veya bileşen kaplarınızın çoğaltılmış bileşen türlerine önceden izin verdiğinden emin olabilirsiniz.