Make all entities into function objects

This commit is contained in:
oakes
2013-12-31 17:38:26 -05:00
parent 7f0f46d643
commit 23581b35b4
4 changed files with 87 additions and 59 deletions

View File

@@ -12,31 +12,27 @@
IsometricTiledMapRenderer IsometricTiledMapRenderer
OrthogonalTiledMapRenderer])) OrthogonalTiledMapRenderer]))
(defmulti execute-entity :command :default :draw)
(defmethod execute-entity :set-screen [{:keys [^Game game ^Screen screen]}]
(.setScreen game screen))
(load "core_2d") (load "core_2d")
(load "core_global") (load "core_global")
(load "core_render") (load "core_render")
(defn expand-entity (defn wrap-entity
[entity] [screen entity]
(if (keyword? entity) (if (map? entity)
{:command entity} (draw screen entity)
entity)) entity))
(defn transform-entities (defn transform-entities
[entities] [screen entities]
(->> entities list flatten (remove nil?) (map expand-entity))) (->> entities list flatten (remove nil?)))
(defn execute-entities (defn execute-entities
[screen entities] [screen entities]
(->> entities (->> entities
(map #(assoc % :screen-map screen)) (transform-entities screen)
(map execute-entity) (map #(wrap-entity screen %))
(remove #(not (:persistent? %))) (map #(%))
(remove nil?)
doall)) doall))
(defn defscreen* (defn defscreen*
@@ -45,35 +41,52 @@
:as options}] :as options}]
(let [screen (atom {}) (let [screen (atom {})
entities (atom '()) entities (atom '())
on-show (or on-show (fn [s])) dummy-fn (fn [s e])
on-render (or on-render (fn [s d])) on-show (or on-show dummy-fn)
on-hide (or on-hide (fn [s])) on-render (or on-render dummy-fn)
on-pause (or on-pause (fn [s])) on-hide (or on-hide dummy-fn)
on-resize (or on-resize (fn [s w h])) on-pause (or on-pause dummy-fn)
on-resume (or on-resume (fn [s]))] on-resize (or on-resize dummy-fn)
on-resume (or on-resume dummy-fn)]
(proxy [Screen] [] (proxy [Screen] []
(show [] (show []
(->> (swap! screen assoc (let [screen-map (swap! screen assoc
:renderer (create-renderer renderer) :renderer (create-renderer renderer)
:camera (create-camera camera) :camera (create-camera camera)
:total-time 0 :width (game :width)
:delta-time 0) :height (game :height)
on-show :total-time 0
transform-entities :delta-time 0)]
(reset! entities))) (->> (on-show screen-map @entities)
(transform-entities screen-map)
(reset! entities))))
(render [delta-time] (render [delta-time]
(let [total-time (+ (:total-time @screen) delta-time) (let [total-time (+ (:total-time @screen) delta-time)
screen-map (swap! screen assoc screen-map (swap! screen assoc
:total-time total-time :total-time total-time
:delta-time delta-time)] :delta-time delta-time)]
(->> (on-render screen-map @entities) (->> (on-render screen-map @entities)
transform-entities
(execute-entities screen-map) (execute-entities screen-map)
(reset! entities)))) (reset! entities))))
(hide [] (on-hide @screen)) (hide []
(pause [] (on-pause @screen)) (->> (on-hide @screen @entities)
(resize [w h] (on-resize @screen w h)) (execute-entities @screen)
(resume [] (on-resume @screen))))) (reset! entities)))
(pause []
(->> (on-pause @screen @entities)
(execute-entities @screen)
(reset! entities)))
(resize [w h]
(let [screen-map (swap! screen assoc
:width w
:height h)]
(->> (on-resize screen-map @entities)
(execute-entities screen-map)
(reset! entities))))
(resume []
(->> (on-resume @screen @entities)
(execute-entities @screen)
(reset! entities))))))
(defmacro defscreen (defmacro defscreen
[name & {:keys [] :as options}] [name & {:keys [] :as options}]
@@ -83,10 +96,14 @@
[{:keys [on-create]}] [{:keys [on-create]}]
(proxy [Game] [] (proxy [Game] []
(create [] (create []
(->> (on-create this) (execute-entities nil (on-create this)))))
transform-entities
(execute-entities nil)))))
(defmacro defgame (defmacro defgame
[name & {:keys [] :as options}] [name & {:keys [] :as options}]
`(def ~name (defgame* ~options))) `(def ~name (defgame* ~options)))
(defn set-screen
[^Game game ^Screen screen]
(fn []
(.setScreen game screen)
nil))

View File

@@ -10,13 +10,14 @@
(defmethod sprite-batch BatchTiledMapRenderer [screen] (defmethod sprite-batch BatchTiledMapRenderer [screen]
(.getSpriteBatch (:renderer screen))) (.getSpriteBatch (:renderer screen)))
(defmethod execute-entity :draw [{:keys [screen-map image x y width height] :as entity}] (defn draw [screen {:keys [image x y width height] :as entity}]
(let [batch (sprite-batch screen-map)] (fn []
(.begin batch) (let [batch (sprite-batch screen)]
(when (and image x y width height) (.begin batch)
(.draw batch image (float x) (float y) (float width) (float height))) (when (and image x y width height)
(.end batch)) (.draw batch image (float x) (float y) (float width) (float height)))
entity) (.end batch))
entity))
; textures ; textures

View File

@@ -2,11 +2,15 @@
; graphics ; graphics
(defmethod execute-entity :clear [{:keys [r g b a] :as entity}] (defn clear
(doto (Gdx/gl) ([]
(.glClearColor (or r 0) (or g 0) (or b 0) (or a 0)) (clear 0 0 0 0))
(.glClear GL20/GL_COLOR_BUFFER_BIT)) ([r g b a]
entity) (fn []
(doto (Gdx/gl)
(.glClearColor r g b a)
(.glClear GL20/GL_COLOR_BUFFER_BIT))
nil)))
(defn game* (defn game*
[key] [key]

View File

@@ -12,11 +12,13 @@
(assert (number? tile-size)) (assert (number? tile-size))
(float (/ 1 tile-size))) (float (/ 1 tile-size)))
(defmethod execute-entity :render-tiled-map [{:keys [screen-map] :as entity}] (defn render-tiled-map
(doto (:renderer screen-map) [{:keys [^BatchTiledMapRenderer renderer ^Camera camera]}]
(.setView (:camera screen-map)) (fn []
.render) (doto renderer
entity) (.setView camera)
.render)
nil))
(defn tiled-map-layer (defn tiled-map-layer
[{:keys [^BatchTiledMapRenderer renderer]} layer] [{:keys [^BatchTiledMapRenderer renderer]} layer]
@@ -53,12 +55,16 @@
(defmethod create-camera :perspective [_] (defmethod create-camera :perspective [_]
(PerspectiveCamera.)) (PerspectiveCamera.))
(defn resize-camera! (defn resize-camera
[{:keys [^Camera camera]} width height] [{:keys [^Camera camera]} width height]
(.setToOrtho camera false width height)) (fn []
(.setToOrtho camera false width height)
nil))
(defn move-camera! (defn move-camera
[{:keys [^Camera camera]} x y] [{:keys [^Camera camera]} x y]
(when x (set! (. camera x) x)) (fn []
(when y (set! (. camera y) y)) (when x (set! (. camera x) x))
(.update camera)) (when y (set! (. camera y) y))
(.update camera)
nil))