diff --git a/src/play_clj/core.clj b/src/play_clj/core.clj index a466e6a..0e2ee37 100644 --- a/src/play_clj/core.clj +++ b/src/play_clj/core.clj @@ -10,7 +10,8 @@ [com.badlogic.gdx.input GestureDetector GestureDetector$GestureListener] [com.badlogic.gdx.maps MapLayer MapLayers] - [com.badlogic.gdx.maps.tiled TiledMap TiledMapTileLayer TmxMapLoader] + [com.badlogic.gdx.maps.tiled TiledMap TiledMapTileLayer + TiledMapTileLayer$Cell TmxMapLoader] [com.badlogic.gdx.maps.tiled.renderers BatchTiledMapRenderer HexagonalTiledMapRenderer diff --git a/src/play_clj/core_render.clj b/src/play_clj/core_render.clj index 115400e..5591f6e 100644 --- a/src/play_clj/core_render.clj +++ b/src/play_clj/core_render.clj @@ -1,6 +1,101 @@ (in-ns 'play-clj.core) -; rendering +; tiled maps + +(defn tiled-map + [s] + (if (string? s) + (.load (TmxMapLoader.) s) + s)) + +(defmacro tiled-map! + [{:keys [^BatchTiledMapRenderer renderer]} k & options] + `(u/call! ^TiledMap (.getMap ~renderer) ~k ~@options)) + +(defn tiled-map-layers + [{:keys [^BatchTiledMapRenderer renderer]}] + (assert renderer) + (let [layers (-> renderer .getMap .getLayers)] + (for [^long i (range (.getCount layers))] + (.get layers i)))) + +(defn tiled-map-layer + [screen layer] + (if (isa? (type layer) MapLayer) + layer + (->> (tiled-map-layers screen) + (drop-while #(not= layer (.getName ^MapLayer %))) + first))) + +(defmacro tiled-map-layer! + [screen layer-name k & options] + `(u/call! ^TiledMapTileLayer (tiled-map-layer ~screen ~layer-name) + ~k ~@options)) + +(defn tiled-map-cell + [screen layer x y] + (.getCell ^TiledMapTileLayer (tiled-map-layer screen layer) x y)) + +(defmacro tiled-map-cell! + [screen layer x y k & options] + `(u/call! ^TiledMapTileLayer$Cell (tiled-map-cell ~screen ~layer ~x ~y) + ~k ~@options)) + +(defn ^:private refresh-renderer! + [{:keys [renderer ui-listeners]} entities] + (when (isa? (type renderer) Stage) + (doseq [^Actor a (.getActors ^Stage renderer)] + (.remove a)) + (doseq [{:keys [object]} entities] + (when (isa? (type object) Actor) + (.addActor ^Stage renderer object) + (doseq [listener ui-listeners] + (.addListener ^Actor object listener)))) + (remove-input! renderer) + (add-input! renderer))) + +; renderers + +(defn orthogonal-tiled-map + [path unit] + (OrthogonalTiledMapRenderer. ^TiledMap (tiled-map path) ^double unit)) + +(defmacro orthogonal-tiled-map! + [screen k & options] + `(u/call! ^OrthogonalTiledMapRenderer (:renderer ~screen) ~k ~@options)) + +(defn isometric-tiled-map + [path unit] + (IsometricTiledMapRenderer. ^TiledMap (tiled-map path) ^double unit)) + +(defmacro isometric-tiled-map! + [screen k & options] + `(u/call! ^IsometricTiledMapRenderer (:renderer ~screen) ~k ~@options)) + +(defn isometric-staggered-tiled-map + [path unit] + (IsometricStaggeredTiledMapRenderer. ^TiledMap (tiled-map path) ^double unit)) + +(defmacro isometric-staggered-tiled-map! + [screen k & options] + `(u/call! ^IsometricStaggeredTiledMapRenderer (:renderer ~screen) + ~k ~@options)) + +(defn hexagonal-tiled-map + [path unit] + (HexagonalTiledMapRenderer. ^TiledMap (tiled-map path) ^double unit)) + +(defmacro hexagonal-tiled-map! + [screen k & options] + `(u/call! ^HexagonalTiledMapRenderer (:renderer ~screen) ~k ~@options)) + +(defn stage + [] + (Stage.)) + +(defmacro stage! + [screen k & options] + `(u/call! ^Stage (:renderer ~screen) ~k ~@options)) (defmulti render! #(-> % :renderer type) :default nil) @@ -18,85 +113,24 @@ (.setViewport renderer (. camera viewportWidth) (. camera viewportHeight))) (.draw renderer)) -(defn tiled-map-layers - [{:keys [^BatchTiledMapRenderer renderer]}] - (assert renderer) - (let [layers (-> renderer .getMap .getLayers)] - (for [^long i (range (.getCount layers))] - (.get layers i)))) - -(defn tiled-map-layer - [screen layer] - (if (isa? (type layer) MapLayer) - layer - (->> (tiled-map-layers screen) - (drop-while #(not= layer (.getName ^MapLayer %))) - first))) - -(defn tiled-map-layer-name - [screen layer] - (.getName ^MapLayer (tiled-map-layer screen layer))) - -(defn tiled-map-layer-names - [screen] - (for [layer (tiled-map-layers screen)] - (tiled-map-layer-name screen layer))) - -(defn tiled-map-cell - [screen layer x y] - (.getCell ^TiledMapTileLayer (tiled-map-layer screen layer) x y)) - -(defn ^:private refresh-renderer! - [{:keys [renderer ui-listeners]} entities] - (when (isa? (type renderer) Stage) - (doseq [^Actor a (.getActors ^Stage renderer)] - (.remove a)) - (doseq [{:keys [object]} entities] - (when (isa? (type object) Actor) - (.addActor ^Stage renderer object) - (doseq [listener ui-listeners] - (.addListener ^Actor object listener)))) - (remove-input! renderer) - (add-input! renderer))) - -; renderers - -(defn tiled-map - [s] - (if (string? s) - (.load (TmxMapLoader.) s) - s)) - -(defn orthogonal-tiled-map - [path unit] - (OrthogonalTiledMapRenderer. ^TiledMap (tiled-map path) ^double unit)) - -(defn isometric-tiled-map - [path unit] - (IsometricTiledMapRenderer. ^TiledMap (tiled-map path) ^double unit)) - -(defn isometric-staggered-tiled-map - [path unit] - (IsometricStaggeredTiledMapRenderer. ^TiledMap (tiled-map path) ^double unit)) - -(defn hexagonal-tiled-map - [path unit] - (HexagonalTiledMapRenderer. ^TiledMap (tiled-map path) ^double unit)) - -(defn stage - [] - (Stage.)) - ; cameras (defn orthographic-camera [] (OrthographicCamera.)) +(defmacro orthographic-camera! + [screen k & options] + `(u/call! ^OrthographicCamera (:camera ~screen) ~k ~@options)) + (defn perspective-camera [] (PerspectiveCamera.)) +(defmacro perspective-camera! + [screen k & options] + `(u/call! ^PerspectiveCamera (:camera ~screen) ~k ~@options)) + (defn size! [{:keys [^OrthographicCamera camera]} width height] (assert camera) @@ -126,34 +160,3 @@ [screen x y] (move-x! screen x) (move-y! screen y)) - -; interop - -(defmacro orthogonal-tiled-map! - [screen k & options] - `(u/call! ^OrthogonalTiledMapRenderer (:renderer ~screen) ~k ~@options)) - -(defmacro isometric-tiled-map! - [screen k & options] - `(u/call! ^IsometricTiledMapRenderer (:renderer ~screen) ~k ~@options)) - -(defmacro isometric-staggered-tiled-map! - [screen k & options] - `(u/call! ^IsometricStaggeredTiledMapRenderer (:renderer ~screen) - ~k ~@options)) - -(defmacro hexagonal-tiled-map! - [screen k & options] - `(u/call! ^HexagonalTiledMapRenderer (:renderer ~screen) ~k ~@options)) - -(defmacro stage! - [screen k & options] - `(u/call! ^Stage (:renderer ~screen) ~k ~@options)) - -(defmacro orthographic-camera! - [screen k & options] - `(u/call! ^OrthographicCamera (:camera ~screen) ~k ~@options)) - -(defmacro perspective-camera! - [screen k & options] - `(u/call! ^PerspectiveCamera (:camera ~screen) ~k ~@options))