Make shape entities
This commit is contained in:
@@ -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")
|
||||
|
||||
@@ -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#)))
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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)))
|
||||
|
||||
Reference in New Issue
Block a user