- Directive d'inclusion : #include StructureMonitor.h}
Un démon de cette classe est une structure analogue à un démon sur les descripteurs d'entités, à ceci près qu'il permettent de spécifier des actions qui doivent être déclenchées lorsqu'on modifie la structure d'une entité (par AddElement, ). La spécification est, là encore, faite dans le démon lui-même, puis le démon est attaché directement à l'entité concernée (et non à un descripteur de cette entité).
Un tel démon est déclaré et défini comme une instance de la classe StructureMonitor. La version actuelle de DIESE ne permet que de spécifier des actions à déclencher lors de l'ajout d'un élément à une entité ou bien lors de son retrait (à l'exception donc des opérations sur les composants, la super-entité ou les sur-ensembles).
Les éléments de code qui permettent le déclenchement automatique d'actions lors de la modification de la structure sont les mêmes que pour les démons liés aux descripteurs variables.
Remarques :
- Un même démon peut être attaché à plusieurs entités différentes. C'est bien clair lorsqu'il s'agit d'instances de la même classe. C'est aussi vrai pour des instances de classes différentes, à condition que l'effet de bord de la fonction ait un sens identique pour les différentes classes. Par exemple, un démon dont l'effet de bord est de modifier le nombre d'éléments lors de l'ajout d'un élément, pourra être attaché à toute classe d'entités.
void App_DefineMonitors() { InputOutputMonitor = new StructureMonitor("inputOutputMonitor"); InputOutputMonitor->AssignWhenAddElementMethod(InputOutput_whenAdd); InputOutputMonitor->AssignWhenRemoveElementMethod(InputOutput_whenRemove); ... };- Il n'est pas possible d'attacher plusieurs démons à la même entité. Si l'idée d'attacher plusieurs démons était justifiée par la multiplicité des effets de bords à déclencher, alors le codage de ces différents effets doit être assemblé dans les fonctions liées aux méthodes prédéfinies d'un seul démon.
Herd::Herd() { ... ElementClassId(ANIMAL); BirthDeathMonitor->AttachToEntity(this); // inopérant InputOutputMonitor->AttachToEntity(this); ... }- Il est par contre possible, pour une entité, de lui attacher directement un démon sur sa structure, et d'attacher en outre des démons sur ses descripteurs variables.
- On peut vouloir modifier la structure d'une entité, sans déclencher, à titre exceptionnel, les effets de bord du démon attaché à l'entité. Il suffit pour cela d'utiliser les méthodes normales de modification (AddElement, AddElements, ) avec l'argument supplémentaire FALSE. Par exemple :
pHerd_1->AddElement(pAnimal_24, FALSE);- Il est possible d'ôter une capacité de réaction à un démon, en lui envoyant un message approprié, correspondant à l'événement visé : par exemple UnassignWhenAddElementMethod, sans argument, pour supprimer la réaction à la modification du tableau des éléments :
InputOutputMonitor->UnassignWhenAddElementMethod();De même il est possible de détacher un démon d'une entité en envoyant au démon le message DetachFromEntity, avec l'adresse de l'entité en argument :
InputOutput->DetachFromEntity(pHerd_1);