I am trying to implement a 2D fighting game in Clojure both for fun and learning.
Since the characters in a fighter game are essentially state machines, I constructed the following code:
(defrecord Frames [frames id])
where "frames" refer to the actual datas (hitboxes texture-names and etc) and "id" will be an atom referencing the "frames" data representing the current frame the character is in.
so I will initialize a frame like this (used :a :b :c just for testing):
(def f (Frames. [:a :b :c :d :e :f :g] (atom 0)))
and will retrieve the current frame by this:
(defn get-current-frame [frames] (nth (:frames frames) @(:id frames)))
and update by:
(defn update-current-frame [frames active] (reset! (:id frames) active))
and it works fine:
(def f (Frames. [:a :b :c :d :e :f :g] (atom 0))) (update-current-frame f 3) (get-current-frame f) ;; => :d
Obviously it works, but I am extremely in doubt that this is a good practice.
Due to my poor knowledge with Clojure, I am here asking
- Is using atom referencing a vector the best way for representing simple states?
- Should I use this kind of data structure for implementing fighting game frames?
- If ignoring data structures, am I defining the functions
(get-current-frame)in an idiomatic way?