diff --git a/src/play_clj/core.clj b/src/play_clj/core.clj index f09af1e..ec8dc52 100644 --- a/src/play_clj/core.clj +++ b/src/play_clj/core.clj @@ -6,6 +6,7 @@ InputMultiplexer InputProcessor Net Screen] [com.badlogic.gdx.graphics Camera Color GL20 OrthographicCamera PerspectiveCamera] + [com.badlogic.gdx.graphics.g2d SpriteBatch TextureRegion] [com.badlogic.gdx.input GestureDetector GestureDetector$GestureListener] [com.badlogic.gdx.maps MapLayer MapLayers] diff --git a/src/play_clj/core_graphics.clj b/src/play_clj/core_graphics.clj index eb373e3..3973753 100644 --- a/src/play_clj/core_graphics.clj +++ b/src/play_clj/core_graphics.clj @@ -112,6 +112,91 @@ [] (Stage.)) +(defmacro stage + [& options] + `(u/calls! ^Stage (stage*) ~@options)) + +(defmacro stage! + [screen k & options] + `(u/call! ^Stage (:renderer ~screen) ~k ~@options)) + +; batch + +(defmulti batch #(-> % :renderer class)) + +(defmethod batch BatchTiledMapRenderer + [{:keys [^BatchTiledMapRenderer renderer]}] + (.getSpriteBatch renderer)) + +(defmethod batch Stage + [{:keys [^Stage renderer]}] + (.getSpriteBatch renderer)) + +(defmulti batch-begin! type) + +(defmethod batch-begin! SpriteBatch + [^SpriteBatch batch] + (.begin batch)) + +(defmulti batch-end! type) + +(defmethod batch-end! SpriteBatch + [^SpriteBatch batch] + (.end batch)) + +; rendering + +(defmulti draw-entity! #(-> % second :type)) + +(defmethod draw-entity! :actor + [[^SpriteBatch batch {:keys [^Actor object] :as entity}]] + (assert object) + (doseq [[k v] entity] + (case k + :x (.setX object v) + :y (.setY object v) + :width (.setWidth object v) + :height (.setHeight object v) + nil)) + (.draw object batch 1)) + +(defmethod draw-entity! :texture + [[^SpriteBatch batch {:keys [^TextureRegion object x y width height]}]] + (assert (and object x y width height)) + (.draw batch object (float x) (float y) (float width) (float height))) + +(defn draw! [{:keys [renderer] :as screen} entities] + (assert renderer) + (let [^SpriteBatch batch (batch screen)] + (batch-begin! batch) + (doseq [entity entities] + (draw-entity! [batch entity])) + (batch-end! batch)) + entities) + +(defn ^:private render-map! + [{:keys [^BatchTiledMapRenderer renderer ^Camera camera]}] + (when camera (.setView renderer camera)) + (.render renderer)) + +(defn ^:private render-stage! + [{:keys [^Stage renderer ^Camera camera]}] + (when camera + (.setCamera renderer camera) + (.setViewport renderer (. camera viewportWidth) (. camera viewportHeight))) + (.draw renderer)) + +(defn render! + ([{:keys [renderer] :as screen}] + (cond + (isa? (type renderer) BatchTiledMapRenderer) + (render-map! screen) + (isa? (type renderer) Stage) + (render-stage! screen))) + ([screen entities] + (render! screen) + (draw! screen entities))) + (defn ^:private refresh-renderer! [{:keys [renderer ui-listeners]} entities] (when (isa? (type renderer) Stage) @@ -125,30 +210,6 @@ (remove-input! renderer) (add-input! renderer))) -(defmacro stage - [& options] - `(u/calls! ^Stage (stage*) ~@options)) - -(defmacro stage! - [screen k & options] - `(u/call! ^Stage (:renderer ~screen) ~k ~@options)) - -(defmulti render! #(-> % :renderer type) :default nil) - -(defmethod render! nil [screen]) - -(defmethod render! BatchTiledMapRenderer - [{:keys [^BatchTiledMapRenderer renderer ^Camera camera]}] - (when camera (.setView renderer camera)) - (.render renderer)) - -(defmethod render! Stage - [{:keys [^Stage renderer ^Camera camera]}] - (when camera - (.setCamera renderer camera) - (.setViewport renderer (. camera viewportWidth) (. camera viewportHeight))) - (.draw renderer)) - ; cameras (defn orthographic-camera* diff --git a/src/play_clj/g2d.clj b/src/play_clj/g2d.clj index f51828a..ed73821 100644 --- a/src/play_clj/g2d.clj +++ b/src/play_clj/g2d.clj @@ -1,62 +1,11 @@ (ns play-clj.g2d (:require [play-clj.utils :as u]) (:import [com.badlogic.gdx.graphics Texture] - [com.badlogic.gdx.graphics.g2d Animation SpriteBatch TextureRegion] - [com.badlogic.gdx.maps.tiled.renderers BatchTiledMapRenderer] - [com.badlogic.gdx.scenes.scene2d Actor Stage])) + [com.badlogic.gdx.graphics.g2d Animation BitmapFont TextureRegion])) -; drawing - -(defmulti sprite-batch #(-> % :renderer class) :default nil) - -(defmethod sprite-batch nil [_]) - -(defmethod sprite-batch BatchTiledMapRenderer - [{:keys [^BatchTiledMapRenderer renderer]}] - (.getSpriteBatch renderer)) - -(defmethod sprite-batch Stage - [{:keys [^Stage renderer]}] - (.getSpriteBatch renderer)) - -(defn draw-actor! - [^SpriteBatch batch {:keys [^Actor object] :as entity}] - (assert object) - (doseq [[k v] entity] - (case k - :x (.setX object v) - :y (.setY object v) - :width (.setWidth object v) - :height (.setHeight object v) - nil)) - (.draw object batch 1)) - -(defn draw-texture! - [^SpriteBatch batch {:keys [^TextureRegion object x y width height]}] - (assert (and object x y width height)) - (.draw batch object (float x) (float y) (float width) (float height))) - -(defn draw-entity! - [^SpriteBatch batch entity] - (if (not (map? entity)) - (draw-entity! batch (u/create-entity entity)) - (case (:type entity) - :actor - (draw-actor! batch entity) - :texture - (draw-texture! batch entity) - nil))) - -(defn draw! [{:keys [renderer] :as screen} entities] - (assert renderer) - (let [^SpriteBatch batch (sprite-batch screen)] - (.begin batch) - (doseq [entity entities] - (draw-entity! batch entity)) - (.end batch)) - entities) - -; textures +(defmacro bitmap-font + [& options] + `(BitmapFont. ~@options)) (defn texture* [arg] diff --git a/src/play_clj/ui.clj b/src/play_clj/ui.clj index 31955a4..4077278 100644 --- a/src/play_clj/ui.clj +++ b/src/play_clj/ui.clj @@ -3,7 +3,7 @@ [play-clj.utils :as u]) (:import [com.badlogic.gdx Files Gdx] [com.badlogic.gdx.graphics Color Texture] - [com.badlogic.gdx.graphics.g2d BitmapFont TextureRegion] + [com.badlogic.gdx.graphics.g2d TextureRegion] [com.badlogic.gdx.scenes.scene2d Actor Stage] [com.badlogic.gdx.scenes.scene2d.ui ButtonGroup CheckBox Dialog HorizontalGroup Image ImageButton ImageTextButton Label ScrollPane @@ -15,19 +15,12 @@ TiledDrawable] [com.esotericsoftware.tablelayout Cell])) -; temporary inclusion to prevent breaking the template -(defonce draw! g2d/draw!) - (defmacro drawable [type & options] `(~(symbol (str u/main-package ".scenes.scene2d.ui." (u/key->pascal type) "Drawable.")) ~@options)) -(defmacro bitmap-font - [& options] - `(BitmapFont. ~@options)) - (defmacro style [type & options] `(~(symbol (str u/main-package ".scenes.scene2d.ui." @@ -246,7 +239,7 @@ [^String text arg] (u/create-entity (if (isa? (type arg) Color) - (Label. text (style :label (bitmap-font) arg)) + (Label. text (style :label (g2d/bitmap-font) arg)) (Label. text arg)))) (defmacro label