From 3d00c2d16ab9cf07981baa0ad5f28e0422274ecb Mon Sep 17 00:00:00 2001 From: oakes Date: Fri, 4 Apr 2014 03:00:08 -0400 Subject: [PATCH] Make shape entities --- src/play_clj/core.clj | 3 +- src/play_clj/core_graphics.clj | 72 +++++++++++++++------------------ src/play_clj/core_listeners.clj | 4 +- src/play_clj/entities.clj | 29 +++++++++---- 4 files changed, 57 insertions(+), 51 deletions(-) diff --git a/src/play_clj/core.clj b/src/play_clj/core.clj index fe0017e..a217c1a 100644 --- a/src/play_clj/core.clj +++ b/src/play_clj/core.clj @@ -26,7 +26,8 @@ [com.badlogic.gdx.scenes.scene2d Actor Stage] [com.badlogic.gdx.scenes.scene2d.utils ActorGestureListener Align ChangeListener ClickListener DragListener FocusListener] - [com.badlogic.gdx.utils Timer$Task])) + [com.badlogic.gdx.utils Timer$Task] + [play_clj.entities ShapeEntity])) (load "core_basics") (load "core_cameras") diff --git a/src/play_clj/core_graphics.clj b/src/play_clj/core_graphics.clj index a2efcfd..dfc7574 100644 --- a/src/play_clj/core_graphics.clj +++ b/src/play_clj/core_graphics.clj @@ -14,21 +14,6 @@ [object k & options] `(u/call! ^Pixmap ~object ~k ~@options)) -(defn shape - "Returns a [ShapeRenderer](http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/glutils/ShapeRenderer.html). - - (shape)" - ([] - (ShapeRenderer.)) - ([max-vertices] - (ShapeRenderer. max-vertices))) - -(defmacro shape! - "Calls a single method on a `shape`." - [screen k & options] - `(let [^ShapeRenderer object# (u/get-obj ~screen :renderer)] - (u/call! object# ~k ~@options))) - (defmacro shape-type "Returns a static field from [ShapeRenderer.ShapeType](http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/glutils/ShapeRenderer.ShapeType.html). @@ -36,6 +21,33 @@ [k] `~(u/gdx-field :graphics :glutils "ShapeRenderer$ShapeType" (u/key->pascal k))) +(defn shape* + ([] + (ShapeEntity. (ShapeRenderer.))) + ([max-vertices] + (ShapeEntity. (ShapeRenderer. max-vertices)))) + +(defmacro shape + "Returns an entity based on [ShapeRenderer](http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/glutils/ShapeRenderer.html). + + (shape :filled)" + [type & options] + (when (seq (clojure.set/intersection #{:begin :end} (set options))) + (-> "No need to call :begin or :end, because it's done for you." + Throwable. + throw)) + `(let [entity# ~(if (keyword? type) + `(assoc (shape*) :type (shape-type ~type)) + type) + ^ShapeRenderer object# (u/get-obj entity# :object)] + (assoc entity# :draw! (fn [] (u/calls! object# ~@options))))) + +(defmacro shape! + "Calls a single method on a `shape`." + [entity k & options] + `(let [^ShapeRenderer object# (u/get-obj ~entity :object)] + (u/call! object# ~k ~@options))) + ; tiled maps (defn tiled-map* @@ -274,20 +286,20 @@ with the tiled map file at `path` and `unit` scale. (fn [screen _] (-> screen :renderer class))) (defmethod draw! BatchTiledMapRenderer - [{:keys [^BatchTiledMapRenderer renderer]} entities] + [{:keys [^BatchTiledMapRenderer renderer] :as screen} entities] (let [^SpriteBatch batch (.getSpriteBatch renderer)] (.begin batch) (doseq [entity entities] - (e/draw-entity! entity batch)) + (e/draw-entity! entity screen batch)) (.end batch)) entities) (defmethod draw! Stage - [{:keys [^Stage renderer]} entities] + [{:keys [^Stage renderer] :as screen} entities] (let [^SpriteBatch batch (.getSpriteBatch renderer)] (.begin batch) (doseq [entity entities] - (e/draw-entity! entity batch)) + (e/draw-entity! entity screen batch)) (.end batch)) entities) @@ -295,7 +307,7 @@ with the tiled map file at `path` and `unit` scale. [{:keys [^ModelBatch renderer ^Camera camera] :as screen} entities] (.begin renderer camera) (doseq [entity entities] - (e/draw-entity! entity screen)) + (e/draw-entity! entity screen nil)) (.end renderer) entities) @@ -413,24 +425,6 @@ supplied, they will be sorted by :y (latitude). sort-fn)] (if-let [layer (:layer entity)] (.renderTileLayer renderer layer) - (e/draw-entity! entity batch))) + (e/draw-entity! entity screen batch))) (.end batch)) entities)) - -(defmacro render-shapes! - "Draws shapes with a `shape` renderer. - - (render-shapes! screen :filled - :set-color (color :blue) - :line 0 0 10 10 - :rect 10 10 20 20 - :circle 0 30 5)" - [screen type & options] - (when (seq (clojure.set/intersection #{:begin :end} (set options))) - (-> "No need to call :begin or :end, because it's done for you." - Throwable. - throw)) - `(let [^ShapeRenderer object# (u/get-obj ~screen :renderer)] - (.begin object# (shape-type ~type)) - (u/calls! object# ~@options) - (.end object#))) diff --git a/src/play_clj/core_listeners.clj b/src/play_clj/core_listeners.clj index 5960fd3..53f37c3 100644 --- a/src/play_clj/core_listeners.clj +++ b/src/play_clj/core_listeners.clj @@ -205,9 +205,7 @@ (.destroyJoint world joint)))))) (defn ^:private update-screen! - ([{:keys [renderer ^Camera camera world g2dp-listener]}] - (when (and camera (isa? (type renderer) ShapeRenderer)) - (.setProjectionMatrix ^ShapeRenderer renderer (. camera combined))) + ([{:keys [world g2dp-listener]}] (when (isa? (type world) World) (.setContactListener ^World world g2dp-listener))) ([{:keys [renderer world] :as screen} entities] diff --git a/src/play_clj/entities.clj b/src/play_clj/entities.clj index 0c5b3a7..871e9e9 100644 --- a/src/play_clj/entities.clj +++ b/src/play_clj/entities.clj @@ -1,21 +1,23 @@ (ns play-clj.entities (:import [com.badlogic.gdx Gdx Graphics] + [com.badlogic.gdx.graphics Camera] [com.badlogic.gdx.graphics.g2d NinePatch ParticleEffect SpriteBatch TextureRegion] [com.badlogic.gdx.graphics.g3d Environment ModelBatch ModelInstance] + [com.badlogic.gdx.graphics.glutils ShapeRenderer] [com.badlogic.gdx.scenes.scene2d Actor])) (defprotocol Entity - (draw-entity! [this batch] "Draws the entity")) + (draw-entity! [this screen batch] "Draws the entity")) (extend-protocol Entity clojure.lang.PersistentArrayMap - (draw-entity! [this batch]) + (draw-entity! [this screen batch]) clojure.lang.PersistentHashMap - (draw-entity! [this batch])) + (draw-entity! [this screen batch])) (defrecord TextureEntity [object] Entity - (draw-entity! [{:keys [^TextureRegion object x y width height]} batch] + (draw-entity! [{:keys [^TextureRegion object x y width height]} _ batch] (let [x (float (or x 0)) y (float (or y 0)) width (float (or width (.getRegionWidth object))) @@ -23,7 +25,7 @@ (.draw ^SpriteBatch batch object x y width height)))) (defrecord NinePatchEntity [object] Entity - (draw-entity! [{:keys [^NinePatch object x y width height]} batch] + (draw-entity! [{:keys [^NinePatch object x y width height]} _ batch] (let [x (float (or x 0)) y (float (or y 0)) width (float (or width (.getTotalWidth object))) @@ -31,7 +33,7 @@ (.draw object ^SpriteBatch batch x y width height)))) (defrecord ParticleEffectEntity [object] Entity - (draw-entity! [{:keys [^ParticleEffect object x y delta-time]} batch] + (draw-entity! [{:keys [^ParticleEffect object x y delta-time]} _ batch] (let [x (float (or x 0)) y (float (or y 0)) ^Graphics g (Gdx/graphics) @@ -40,7 +42,7 @@ (.draw object ^SpriteBatch batch delta-time)))) (defrecord ActorEntity [object] Entity - (draw-entity! [{:keys [^Actor object] :as entity} batch] + (draw-entity! [{:keys [^Actor object] :as entity} _ batch] (doseq [[k v] entity] (case k :x (.setX object v) @@ -52,5 +54,16 @@ (defrecord ModelEntity [object] Entity (draw-entity! [{:keys [^ModelInstance object]} - {:keys [^ModelBatch renderer ^Environment attributes]}] + {:keys [^ModelBatch renderer ^Environment attributes]} + _] (.render renderer object attributes))) + +(defrecord ShapeEntity [object] Entity + (draw-entity! [{:keys [^ShapeRenderer object type draw!]} + {:keys [^Camera camera]} + _] + (when camera + (.setProjectionMatrix object (. camera combined))) + (.begin object type) + (draw!) + (.end object)))