Make shape entities

This commit is contained in:
oakes
2014-04-04 03:00:08 -04:00
parent 951dd3a6ec
commit 3d00c2d16a
4 changed files with 57 additions and 51 deletions

View File

@@ -26,7 +26,8 @@
[com.badlogic.gdx.scenes.scene2d Actor Stage] [com.badlogic.gdx.scenes.scene2d Actor Stage]
[com.badlogic.gdx.scenes.scene2d.utils ActorGestureListener Align [com.badlogic.gdx.scenes.scene2d.utils ActorGestureListener Align
ChangeListener ClickListener DragListener FocusListener] 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_basics")
(load "core_cameras") (load "core_cameras")

View File

@@ -14,21 +14,6 @@
[object k & options] [object k & options]
`(u/call! ^Pixmap ~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 (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). "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] [k]
`~(u/gdx-field :graphics :glutils "ShapeRenderer$ShapeType" (u/key->pascal 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 ; tiled maps
(defn tiled-map* (defn tiled-map*
@@ -274,20 +286,20 @@ with the tiled map file at `path` and `unit` scale.
(fn [screen _] (-> screen :renderer class))) (fn [screen _] (-> screen :renderer class)))
(defmethod draw! BatchTiledMapRenderer (defmethod draw! BatchTiledMapRenderer
[{:keys [^BatchTiledMapRenderer renderer]} entities] [{:keys [^BatchTiledMapRenderer renderer] :as screen} entities]
(let [^SpriteBatch batch (.getSpriteBatch renderer)] (let [^SpriteBatch batch (.getSpriteBatch renderer)]
(.begin batch) (.begin batch)
(doseq [entity entities] (doseq [entity entities]
(e/draw-entity! entity batch)) (e/draw-entity! entity screen batch))
(.end batch)) (.end batch))
entities) entities)
(defmethod draw! Stage (defmethod draw! Stage
[{:keys [^Stage renderer]} entities] [{:keys [^Stage renderer] :as screen} entities]
(let [^SpriteBatch batch (.getSpriteBatch renderer)] (let [^SpriteBatch batch (.getSpriteBatch renderer)]
(.begin batch) (.begin batch)
(doseq [entity entities] (doseq [entity entities]
(e/draw-entity! entity batch)) (e/draw-entity! entity screen batch))
(.end batch)) (.end batch))
entities) entities)
@@ -295,7 +307,7 @@ with the tiled map file at `path` and `unit` scale.
[{:keys [^ModelBatch renderer ^Camera camera] :as screen} entities] [{:keys [^ModelBatch renderer ^Camera camera] :as screen} entities]
(.begin renderer camera) (.begin renderer camera)
(doseq [entity entities] (doseq [entity entities]
(e/draw-entity! entity screen)) (e/draw-entity! entity screen nil))
(.end renderer) (.end renderer)
entities) entities)
@@ -413,24 +425,6 @@ supplied, they will be sorted by :y (latitude).
sort-fn)] sort-fn)]
(if-let [layer (:layer entity)] (if-let [layer (:layer entity)]
(.renderTileLayer renderer layer) (.renderTileLayer renderer layer)
(e/draw-entity! entity batch))) (e/draw-entity! entity screen batch)))
(.end batch)) (.end batch))
entities)) 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#)))

View File

@@ -205,9 +205,7 @@
(.destroyJoint world joint)))))) (.destroyJoint world joint))))))
(defn ^:private update-screen! (defn ^:private update-screen!
([{:keys [renderer ^Camera camera world g2dp-listener]}] ([{:keys [world g2dp-listener]}]
(when (and camera (isa? (type renderer) ShapeRenderer))
(.setProjectionMatrix ^ShapeRenderer renderer (. camera combined)))
(when (isa? (type world) World) (when (isa? (type world) World)
(.setContactListener ^World world g2dp-listener))) (.setContactListener ^World world g2dp-listener)))
([{:keys [renderer world] :as screen} entities] ([{:keys [renderer world] :as screen} entities]

View File

@@ -1,21 +1,23 @@
(ns play-clj.entities (ns play-clj.entities
(:import [com.badlogic.gdx Gdx Graphics] (:import [com.badlogic.gdx Gdx Graphics]
[com.badlogic.gdx.graphics Camera]
[com.badlogic.gdx.graphics.g2d NinePatch ParticleEffect SpriteBatch [com.badlogic.gdx.graphics.g2d NinePatch ParticleEffect SpriteBatch
TextureRegion] TextureRegion]
[com.badlogic.gdx.graphics.g3d Environment ModelBatch ModelInstance] [com.badlogic.gdx.graphics.g3d Environment ModelBatch ModelInstance]
[com.badlogic.gdx.graphics.glutils ShapeRenderer]
[com.badlogic.gdx.scenes.scene2d Actor])) [com.badlogic.gdx.scenes.scene2d Actor]))
(defprotocol Entity (defprotocol Entity
(draw-entity! [this batch] "Draws the entity")) (draw-entity! [this screen batch] "Draws the entity"))
(extend-protocol Entity (extend-protocol Entity
clojure.lang.PersistentArrayMap clojure.lang.PersistentArrayMap
(draw-entity! [this batch]) (draw-entity! [this screen batch])
clojure.lang.PersistentHashMap clojure.lang.PersistentHashMap
(draw-entity! [this batch])) (draw-entity! [this screen batch]))
(defrecord TextureEntity [object] Entity (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)) (let [x (float (or x 0))
y (float (or y 0)) y (float (or y 0))
width (float (or width (.getRegionWidth object))) width (float (or width (.getRegionWidth object)))
@@ -23,7 +25,7 @@
(.draw ^SpriteBatch batch object x y width height)))) (.draw ^SpriteBatch batch object x y width height))))
(defrecord NinePatchEntity [object] Entity (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)) (let [x (float (or x 0))
y (float (or y 0)) y (float (or y 0))
width (float (or width (.getTotalWidth object))) width (float (or width (.getTotalWidth object)))
@@ -31,7 +33,7 @@
(.draw object ^SpriteBatch batch x y width height)))) (.draw object ^SpriteBatch batch x y width height))))
(defrecord ParticleEffectEntity [object] Entity (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)) (let [x (float (or x 0))
y (float (or y 0)) y (float (or y 0))
^Graphics g (Gdx/graphics) ^Graphics g (Gdx/graphics)
@@ -40,7 +42,7 @@
(.draw object ^SpriteBatch batch delta-time)))) (.draw object ^SpriteBatch batch delta-time))))
(defrecord ActorEntity [object] Entity (defrecord ActorEntity [object] Entity
(draw-entity! [{:keys [^Actor object] :as entity} batch] (draw-entity! [{:keys [^Actor object] :as entity} _ batch]
(doseq [[k v] entity] (doseq [[k v] entity]
(case k (case k
:x (.setX object v) :x (.setX object v)
@@ -52,5 +54,16 @@
(defrecord ModelEntity [object] Entity (defrecord ModelEntity [object] Entity
(draw-entity! [{:keys [^ModelInstance object]} (draw-entity! [{:keys [^ModelInstance object]}
{:keys [^ModelBatch renderer ^Environment attributes]}] {:keys [^ModelBatch renderer ^Environment attributes]}
_]
(.render renderer object 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)))