From 23581b35b47397a7ee28c8a0e5e0bca5f3e8f5b4 Mon Sep 17 00:00:00 2001 From: oakes Date: Tue, 31 Dec 2013 17:38:26 -0500 Subject: [PATCH] Make all entities into function objects --- common/src/play_clj/core.clj | 89 +++++++++++++++++------------ common/src/play_clj/core_2d.clj | 15 ++--- common/src/play_clj/core_global.clj | 14 +++-- common/src/play_clj/core_render.clj | 28 +++++---- 4 files changed, 87 insertions(+), 59 deletions(-) diff --git a/common/src/play_clj/core.clj b/common/src/play_clj/core.clj index f6b083d..4357933 100644 --- a/common/src/play_clj/core.clj +++ b/common/src/play_clj/core.clj @@ -12,31 +12,27 @@ IsometricTiledMapRenderer 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_global") (load "core_render") -(defn expand-entity - [entity] - (if (keyword? entity) - {:command entity} +(defn wrap-entity + [screen entity] + (if (map? entity) + (draw screen entity) entity)) (defn transform-entities - [entities] - (->> entities list flatten (remove nil?) (map expand-entity))) + [screen entities] + (->> entities list flatten (remove nil?))) (defn execute-entities [screen entities] (->> entities - (map #(assoc % :screen-map screen)) - (map execute-entity) - (remove #(not (:persistent? %))) + (transform-entities screen) + (map #(wrap-entity screen %)) + (map #(%)) + (remove nil?) doall)) (defn defscreen* @@ -45,35 +41,52 @@ :as options}] (let [screen (atom {}) entities (atom '()) - on-show (or on-show (fn [s])) - on-render (or on-render (fn [s d])) - on-hide (or on-hide (fn [s])) - on-pause (or on-pause (fn [s])) - on-resize (or on-resize (fn [s w h])) - on-resume (or on-resume (fn [s]))] + dummy-fn (fn [s e]) + on-show (or on-show dummy-fn) + on-render (or on-render dummy-fn) + on-hide (or on-hide dummy-fn) + on-pause (or on-pause dummy-fn) + on-resize (or on-resize dummy-fn) + on-resume (or on-resume dummy-fn)] (proxy [Screen] [] (show [] - (->> (swap! screen assoc - :renderer (create-renderer renderer) - :camera (create-camera camera) - :total-time 0 - :delta-time 0) - on-show - transform-entities - (reset! entities))) + (let [screen-map (swap! screen assoc + :renderer (create-renderer renderer) + :camera (create-camera camera) + :width (game :width) + :height (game :height) + :total-time 0 + :delta-time 0)] + (->> (on-show screen-map @entities) + (transform-entities screen-map) + (reset! entities)))) (render [delta-time] (let [total-time (+ (:total-time @screen) delta-time) screen-map (swap! screen assoc :total-time total-time :delta-time delta-time)] (->> (on-render screen-map @entities) - transform-entities (execute-entities screen-map) (reset! entities)))) - (hide [] (on-hide @screen)) - (pause [] (on-pause @screen)) - (resize [w h] (on-resize @screen w h)) - (resume [] (on-resume @screen))))) + (hide [] + (->> (on-hide @screen @entities) + (execute-entities @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 [name & {:keys [] :as options}] @@ -83,10 +96,14 @@ [{:keys [on-create]}] (proxy [Game] [] (create [] - (->> (on-create this) - transform-entities - (execute-entities nil))))) + (execute-entities nil (on-create this))))) (defmacro defgame [name & {:keys [] :as options}] `(def ~name (defgame* ~options))) + +(defn set-screen + [^Game game ^Screen screen] + (fn [] + (.setScreen game screen) + nil)) diff --git a/common/src/play_clj/core_2d.clj b/common/src/play_clj/core_2d.clj index 0a5e2f3..261e7e2 100644 --- a/common/src/play_clj/core_2d.clj +++ b/common/src/play_clj/core_2d.clj @@ -10,13 +10,14 @@ (defmethod sprite-batch BatchTiledMapRenderer [screen] (.getSpriteBatch (:renderer screen))) -(defmethod execute-entity :draw [{:keys [screen-map image x y width height] :as entity}] - (let [batch (sprite-batch screen-map)] - (.begin batch) - (when (and image x y width height) - (.draw batch image (float x) (float y) (float width) (float height))) - (.end batch)) - entity) +(defn draw [screen {:keys [image x y width height] :as entity}] + (fn [] + (let [batch (sprite-batch screen)] + (.begin batch) + (when (and image x y width height) + (.draw batch image (float x) (float y) (float width) (float height))) + (.end batch)) + entity)) ; textures diff --git a/common/src/play_clj/core_global.clj b/common/src/play_clj/core_global.clj index 4511d61..a6f0995 100644 --- a/common/src/play_clj/core_global.clj +++ b/common/src/play_clj/core_global.clj @@ -2,11 +2,15 @@ ; graphics -(defmethod execute-entity :clear [{:keys [r g b a] :as entity}] - (doto (Gdx/gl) - (.glClearColor (or r 0) (or g 0) (or b 0) (or a 0)) - (.glClear GL20/GL_COLOR_BUFFER_BIT)) - entity) +(defn clear + ([] + (clear 0 0 0 0)) + ([r g b a] + (fn [] + (doto (Gdx/gl) + (.glClearColor r g b a) + (.glClear GL20/GL_COLOR_BUFFER_BIT)) + nil))) (defn game* [key] diff --git a/common/src/play_clj/core_render.clj b/common/src/play_clj/core_render.clj index cb5e2c6..fd31657 100644 --- a/common/src/play_clj/core_render.clj +++ b/common/src/play_clj/core_render.clj @@ -12,11 +12,13 @@ (assert (number? tile-size)) (float (/ 1 tile-size))) -(defmethod execute-entity :render-tiled-map [{:keys [screen-map] :as entity}] - (doto (:renderer screen-map) - (.setView (:camera screen-map)) - .render) - entity) +(defn render-tiled-map + [{:keys [^BatchTiledMapRenderer renderer ^Camera camera]}] + (fn [] + (doto renderer + (.setView camera) + .render) + nil)) (defn tiled-map-layer [{:keys [^BatchTiledMapRenderer renderer]} layer] @@ -53,12 +55,16 @@ (defmethod create-camera :perspective [_] (PerspectiveCamera.)) -(defn resize-camera! +(defn resize-camera [{: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] - (when x (set! (. camera x) x)) - (when y (set! (. camera y) y)) - (.update camera)) + (fn [] + (when x (set! (. camera x) x)) + (when y (set! (. camera y) y)) + (.update camera) + nil))