¿Debería ser el escudo su propia entidad que rastrea la ubicación del jugador? Eso podría dificultar la implementación del filtro de daños. También difumina las líneas entre los componentes y las entidades adjuntas.
Editar: Creo que no hay suficiente "comportamiento autónomo" para una entidad separada. En este caso específico, un escudo sigue al objetivo, funciona para el objetivo y no lo sobrevive. Si bien tiendo a estar de acuerdo en que no hay nada de malo en el concepto de "objeto de escudo", en este caso estamos lidiando con el comportamiento, que encaja perfectamente en un componente. Pero también soy un defensor de las entidades puramente lógicas (a diferencia de los sistemas de entidades completos en los que puede encontrar componentes de transformación y renderizado).
¿Debería ser el escudo un componente que alberga otros componentes? Nunca he visto o escuchado algo así, pero tal vez es común y todavía no soy lo suficientemente profundo.
Véalo en una perspectiva diferente; agregar un componente también agrega otros componentes, y al eliminarlos, los componentes adicionales también desaparecen.
¿Debería el escudo ser solo un conjunto de componentes que se agregan al reproductor? Posiblemente con un componente adicional para administrar los demás, por ejemplo, para que todos puedan eliminarse como grupo. (accidentalmente dejar atrás el componente de reducción de daños, ahora eso sería divertido).
Esto podría ser una solución, promovería la reutilización, sin embargo, también es más propenso a errores (para el problema que mencionó, por ejemplo). No es necesariamente malo. Es posible que descubras nuevas combinaciones de hechizos con prueba y error :)
¿Algo más que sea obvio para alguien con más experiencia en componentes?
Voy a elaborar un poco.
Creo que notó cómo algunos componentes deben tener prioridad sin importar cuándo se hayan agregado a una entidad (esto también respondería a su otra pregunta).
También voy a suponer que estamos usando comunicación basada en mensajes (por el bien de la discusión, es solo una abstracción sobre una llamada de método por el momento).
Cada vez que se "instala" un componente de protección, los manejadores de mensajes del componente de protección se encadenan con un orden específico (superior).
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)
El componente "estadísticas" instala un manejador de mensajes "daños" en el índice In / Invariant / Normal. Cada vez que se recibe un mensaje de "daño", disminuya el HP por su cantidad de "valor".
Comportamiento bastante estándar (poner algo de resistencia al daño natural y / o rasgos raciales, lo que sea).
El componente de escudo instala un manejador de mensajes de "daño" en el índice In / Pre / High.
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
Puede ver que esto es bastante flexible, aunque requeriría una planificación cuidadosa al diseñar la interacción de componentes, ya que tendrá que determinar en qué parte de la tubería de manejo de mensajes se instalan los controladores de eventos de mensajes de componentes.
¿Tiene sentido? Avísame si puedo agregar más detalles.
Editar: con respecto a las instancias de múltiples componentes (dos componentes de armadura). Puede realizar un seguimiento del recuento total de instancias en una sola instancia de entidad (sin embargo, esto elimina el estado por componente) y seguir agregando controladores de eventos de mensaje, o asegurarse de que sus contenedores de componentes permitan tipos de componentes duplicados por adelantado.