• # Component-Entity-System en ClosureScript

    Posté par (site web personnel) . En réponse à la dépêche Je crée mon jeu vidéo E01 : les systèmes à entités. Évalué à 5.

    Chris Granger, développeur de Light Table, a écrit un post-mortem sur un petit jeu qu'il a développé en ClosureScript. Il a utilisé l'approche Component-Entity-System, qui lui a permis de réduire son code à une grosse structure de données.

    Pour lui, toutes les entités sont au même niveau d'une liste, il n'y a pas de listes spécifiques par composant.
    A la place, sachant que les entités peuvent déclarer l'implémentation du composant d'affichage de cette façon :

    (component renderable [func]
     :fn func)
    

    les entités à afficher sont sélectionnées comme-ci :

    (renderer (all-e :renderable)) ;; get all entities that are renderable
    

    cette liste sera envoyée à la fonction d'affichage générale :

    ;; define a function 'renderer' that takes all renderables
    (defn renderer [renderables]
     ;; for each renderable entity
     (doseq [e renderables]
     ;; get the entity's renderable component
     (let [rend (as e :renderable)]
     ;; call the stored render function with the entity
     ((rend :fn) e)))) 
    

    Même sans connaître ClosureScript, l'article un peu technique est intéressant à suivre.