Recently I have been learning about the Entity-Component-System architecture for video game programming. I think it will help out with my “World’s Tiniest RTS” game. I learned about it here, in Robert Nystrom’s Game Programming Patterns. I also heard on the Exploding Rabbit podcast how Jay Pavlina (of Super Mario Bros. Crossover fame) uses the pattern. Here is my Clojure code for it, currently:
(defn create-game []
{:entities {}})
(defn create-entity []
[(java.util.UUID/randomUUID)
{}])
(defn add-entity [game entity]
(update-in game [:entities] conj entity))
(defn add-component [game entity com data]
(assoc-in game [:entities (first entity) com] data))
;;example
(let [e1 (create-entity)]
(->
(create-game)
(add-entity e1)
(add-component e1 :position [3 4])
(add-component e1 :name "ball")))
jamesvhyde
This is not quite right. A better way to do it is to make the game a map of maps. The keys are the component types. Each value is a map of component values, keyed on the entity ID. The example code is the same, but the defn’s work a little differently. An entity is just a UUID, and the game map is accessed through component type and entity ID, instead of entity ID and then component type.
Kathleen Miller
Hey there! It’s awesome to hear you’re diving into the Entity-Component-System architecture! Sounds like a fun project with your “World’s Tiniest RTS.” I’m curious, though—have you ever faced situations where using design patterns felt like overkill? I sometimes wonder if sticking with simpler solutions could be just as effective. Can’t wait to hear more about your progress! Happy coding! 🎮✨