From f66b8dd5976e4c161b919b493a7450b729b6d343 Mon Sep 17 00:00:00 2001 From: oakes Date: Tue, 31 Dec 2013 15:28:50 -0500 Subject: [PATCH] Make all mutations entities to allow pure functional games --- common/src/play_clj/core.clj | 32 +++++++++++++++++++++-------- common/src/play_clj/core_2d.clj | 12 +++++------ common/src/play_clj/core_global.clj | 11 +++++----- common/src/play_clj/core_render.clj | 26 +++++++++++++++++++---- 4 files changed, 56 insertions(+), 25 deletions(-) diff --git a/common/src/play_clj/core.clj b/common/src/play_clj/core.clj index 34211bf..999fd91 100644 --- a/common/src/play_clj/core.clj +++ b/common/src/play_clj/core.clj @@ -12,20 +12,36 @@ IsometricTiledMapRenderer OrthogonalTiledMapRenderer])) +(defmulti execute-entity :command :default :draw) + (load "core_2d") (load "core_global") (load "core_render") -(defn transform - [l] - (->> l list flatten (remove nil?))) +(defn expand-entity + [entity] + (if (keyword? entity) + {:command entity} + entity)) + +(defn transform-entities + [entities] + (->> entities list flatten (remove nil?) (map expand-entity))) + +(defn execute-entities + [screen entities] + (->> entities + (map #(assoc % :screen screen)) + (map execute-entity) + (remove #(not (:persistent? %))) + doall)) (defn defscreen* [{:keys [on-show on-render on-dispose on-hide on-pause on-resize on-resume state renderer camera] :as options}] (let [screen (atom {}) - entities (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])) @@ -40,7 +56,7 @@ :total-time 0 :delta-time 0) on-show - transform + transform-entities (reset! entities))) (render [delta-time] (let [total-time (+ (:total-time @screen) delta-time) @@ -48,9 +64,9 @@ :total-time total-time :delta-time delta-time)] (->> (on-render screen-map @entities) - transform - (reset! entities) - (draw! screen-map)))) + transform-entities + (execute-entities screen-map) + (reset! entities)))) (hide [] (on-hide @screen)) (pause [] (on-pause @screen)) (resize [w h] (on-resize @screen w h)) diff --git a/common/src/play_clj/core_2d.clj b/common/src/play_clj/core_2d.clj index 1b30248..467d730 100644 --- a/common/src/play_clj/core_2d.clj +++ b/common/src/play_clj/core_2d.clj @@ -10,15 +10,13 @@ (defmethod sprite-batch BatchTiledMapRenderer [screen] (.getSpriteBatch (:renderer screen))) -(defn draw! - [screen entities] +(defmethod execute-entity :draw [{:keys [screen image x y width height] :as entity}] (let [batch (sprite-batch screen)] (.begin batch) - (doseq [{:keys [image x y width height]} entities] - (when (and image x y width height) - (.draw batch image (float x) (float y) (float width) (float height)))) - (.end batch) - 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 c26e39f..4511d61 100644 --- a/common/src/play_clj/core_global.clj +++ b/common/src/play_clj/core_global.clj @@ -2,12 +2,11 @@ ; graphics -(defn clear! - ([] (clear! 0 0 0 0)) - ([r g b a] - (doto (Gdx/gl) - (.glClearColor r g b a) - (.glClear GL20/GL_COLOR_BUFFER_BIT)))) +(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 game* [key] diff --git a/common/src/play_clj/core_render.clj b/common/src/play_clj/core_render.clj index ee0c725..0bbac84 100644 --- a/common/src/play_clj/core_render.clj +++ b/common/src/play_clj/core_render.clj @@ -12,10 +12,22 @@ (assert (number? tile-size)) (float (/ 1 tile-size))) -(defn render-tiled-map! - [{:keys [^BatchTiledMapRenderer renderer ^OrthographicCamera camera]}] - (.setView renderer camera) - (.render renderer)) +(defmethod execute-entity :render-tiled-map [{:keys [screen] :as entity}] + (doto (:renderer screen) + (.setView (:camera screen)) + .render) + entity) + +(defn tiled-map-layer + [{:keys [^BatchTiledMapRenderer renderer]} layer] + (-> renderer .getMap .getLayers (.get layer))) + +(defn tiled-map-cell + [{:keys [^BatchTiledMapRenderer renderer] :as screen} layer x y] + (-> (if (or (string? layer) (number? layer)) + (tiled-map-layer screen layer) + layer) + (.getCell x y))) (defmulti create-renderer :type :default :orthogonal-tiled-map) @@ -44,3 +56,9 @@ (defn resize-camera! [{:keys [^Camera camera]} width height] (.setToOrtho camera false width height)) + +(defn move-camera! + [{:keys [^Camera camera]} x y] + (when x (set! (. camera x) x)) + (when y (set! (. camera y) y)) + (.update camera))