Plus de plaisir avec un ES ...
Actuellement, j'ai quelques systèmes:
- Renderer (attribut Renderable, attribut Transform)
- Mouvement (attribut mobile, attribut de transformation, attribut de rendu [pour les boîtes englobantes, etc.])
- Input (attribut InputReceiver)
- etc.
J'ajoute la détection de collision. Ma première pensée a été d'ajouter un nouveau système qui effectue une collision. Il est logique pour moi de garder cela isolé du Motionsystème car toutes les choses qui bougent ou sont animées ne participent pas nécessairement à la détection de collision - caméras, brouillard, etc. - mais cela semble Collisionet Motionest interdépendant.
Lors du Motiondéplacement d'une entité, la transformation doit être validée Collisionet le mouvement annulé ou ajusté (rebond, arrêt sur un mur, etc.).
Une alternative serait de créer un attribut Collidable qui conserve une référence à un objet de collision - kd-tree, octree, etc. qui est partagé entre des entités qui peuvent entrer en collision les unes avec les autres. Le Motionsystème vérifierait alors cet attribut et l'utiliserait pour vérifier ou ajuster le mouvement.
Du point de vue du code, c'est une solution acceptable. Cependant, du point de vue de l'architecture ECS, il semble que cela pousse la logique dans le Motionsystème qui ne s'applique pas à toutes les entités qui ont un Movableattribut.
Je pourrais également stocker un vecteur de mouvement dans l' Movableattribut et faire Colliderajuster le système Transformselon les besoins, mais cela impliquera la duplication des fonctionnalités entre Motionet Collider, ou un rappel de Colliderà Motionavec quelques données sur l'emplacement de la collision et des données de surface pour le rebond / réflexion, etc. .
Cela peut tomber sous le titre de "piratage de cas spécial", mais j'aimerais obtenir des commentaires de ceux qui ont déjà géré cela sans créer une tonne de code de cas de pointe.
La question Quelle est la bonne façon d'éviter un couplage étroit entre les systèmes de mouvement et de collision quand il semble qu'ils nécessitent une connaissance mutuelle?