Lo scudo dovrebbe essere la sua stessa entità che traccia la posizione del giocatore? Ciò potrebbe rendere difficile l'implementazione del filtro danni. Inoltre, confonde le linee tra i componenti e le entità collegati.
Modifica: penso che non ci sia abbastanza "comportamento autonomo" per un'entità separata. In questo caso specifico, uno scudo segue il bersaglio, lavora per il bersaglio e non sopravvive al bersaglio. Mentre tendo a concordare sul fatto che non c'è nulla di sbagliato nel concetto di "oggetto scudo", in questo caso abbiamo a che fare con un comportamento che si adatta perfettamente a un componente. Ma sono anche un sostenitore di entità puramente logiche (al contrario di sistemi di entità in piena regola in cui è possibile trovare componenti di trasformazione e rendering).
Lo scudo dovrebbe essere un componente che ospita altri componenti? Non ho mai visto o sentito nulla di simile, ma forse è comune e non sono ancora abbastanza profondo.
Guardalo in una prospettiva diversa; l'aggiunta di un componente aggiunge anche altri componenti e, dopo la rimozione, anche i componenti aggiuntivi scompaiono.
Lo scudo dovrebbe essere solo un insieme di componenti che vengono aggiunti al giocatore? Forse con un componente aggiuntivo per gestire gli altri, ad esempio in modo che possano essere rimossi tutti come gruppo. (lasciare accidentalmente dietro il componente di riduzione del danno, ora sarebbe divertente).
Questa potrebbe essere una soluzione, promuoverà il riutilizzo, tuttavia è anche più soggetta a errori (per il problema che hai citato, ad esempio). Non è necessariamente male. Potresti scoprire nuove combinazioni di incantesimi con tentativi ed errori :)
Qualcos'altro che è ovvio per qualcuno con più esperienza sui componenti?
Ho intenzione di elaborare un po '.
Credo che tu abbia notato come alcuni componenti dovrebbero avere la priorità, indipendentemente da quando sono stati aggiunti a un'entità (questo risponderebbe anche alle tue altre domande).
Suppongo anche che stiamo usando la comunicazione basata sui messaggi (per motivi di discussione, è solo un'astrazione su una chiamata di metodo per il momento).
Ogni volta che un componente shield viene "installato", i gestori dei messaggi del componente shield sono concatenati con un ordine specifico (superiore).
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)
Il componente "stats" installa un gestore messaggi "danno" nell'indice In / Invariant / Normal. Ogni volta che viene ricevuto un messaggio di "danno", ridurre gli HP del valore di "valore".
Comportamento abbastanza standard (metti in qualche resistenza al danno naturale e / o tratti razziali, qualunque cosa).
Il componente shield installa un gestore messaggi "danneggiamento" nell'indice 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
Si può vedere che questo è piuttosto flessibile, anche se richiederebbe un'attenta pianificazione durante la progettazione dell'interazione tra i componenti, poiché dovrai determinare in quale parte dei gestori di eventi dei messaggi dei componenti della pipeline di gestione dei messaggi sono installati.
Ha senso? Fammi sapere se posso aggiungere ulteriori dettagli.
Modifica: per quanto riguarda le istanze di più componenti (due componenti di armatura). Puoi tenere traccia del conteggio totale dell'istanza in una sola istanza dell'entità (questo uccide lo stato per componente) e continuare ad aggiungere gestori di eventi di messaggio o assicurarti che i contenitori dei componenti consentano in anticipo tipi di componenti duplicati.