From 4781d34efe35d021d5a666ada5180127af91bcef Mon Sep 17 00:00:00 2001 From: oakes Date: Sat, 8 Feb 2014 01:57:42 -0500 Subject: [PATCH] Allow rendering a subset of layers in a tiled map --- src/play_clj/core.clj | 3 ++- src/play_clj/core_graphics.clj | 45 ++++++++++++++++++++++++++++------ 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/src/play_clj/core.clj b/src/play_clj/core.clj index ecdce96..d4f1c02 100644 --- a/src/play_clj/core.clj +++ b/src/play_clj/core.clj @@ -1,5 +1,6 @@ (ns play-clj.core - (:require [play-clj.utils :as u]) + (:require [clojure.set] + [play-clj.utils :as u]) (:import [com.badlogic.gdx Application Audio Files Game Gdx Graphics Input InputMultiplexer InputProcessor Net Screen] [com.badlogic.gdx.audio Sound] diff --git a/src/play_clj/core_graphics.clj b/src/play_clj/core_graphics.clj index a645c82..58ecfa5 100644 --- a/src/play_clj/core_graphics.clj +++ b/src/play_clj/core_graphics.clj @@ -61,6 +61,13 @@ from the tiled map in `screen` that matches `layer` [object k & options] `(u/call! ^TiledMapTileLayer (cast TiledMapTileLayer ~object) ~k ~@options)) +(defn tiled-map-layer-names + "Returns a list with strings cooresponding to the name of each layer in the +tiled map in `screen`" + [screen] + (for [layer (tiled-map-layers screen)] + (tiled-map-layer! layer :get-name))) + (defn tiled-map-cell* "The function version of `tiled-map-cell`" [screen layer x y] @@ -268,19 +275,41 @@ with the tiled map file at `path` and `unit` scale ; render -(defn ^:private render-map! - "Internal use only" - [{:keys [^BatchTiledMapRenderer renderer ^Camera camera]}] - (when camera (.setView renderer camera)) - (.render renderer)) +(defn render-map! + "Calls the tiled-map renderer from `screen`, optionally allowing you to +specify which layers to render with or without -(defn ^:private render-stage! - "Internal use only" + (render-map! screen :with \"water\" \"grass\") + (render-map! screen :without \"desert\" \"rocks\")" + [{:keys [^BatchTiledMapRenderer renderer ^Camera camera] :as screen} + & [k & layer-names]] + (when camera (.setView renderer camera)) + (if k + (let [all-layer-names (tiled-map-layer-names screen)] + ; make sure the layer names exist + (doseq [n layer-names] + (when-not (contains? (set all-layer-names) n) + (throw (Exception. (format "Layer \"%s\" does not exist." n))))) + ; render with or without the supplied layers + (->> (case k + :with (set layer-names) + :without (clojure.set/difference (set all-layer-names) + (set layer-names)) + (u/throw-key-not-found k)) + (map #(.indexOf ^java.util.List all-layer-names %)) + int-array + (.render renderer))) + (.render renderer)) + nil) + +(defn render-stage! + "Calls the stage renderer from `screen`" [{:keys [^Stage renderer ^Camera camera]}] (when camera (.setCamera renderer camera) (.setViewport renderer (. camera viewportWidth) (. camera viewportHeight))) - (doto renderer .act .draw)) + (doto renderer .act .draw) + nil) (defn render! "Calls the renderer from `screen` and optionally draws and returns the