Allow rendering a subset of layers in a tiled map

This commit is contained in:
oakes
2014-02-08 01:57:42 -05:00
parent 99a69f5d47
commit 4781d34efe
2 changed files with 39 additions and 9 deletions

View File

@@ -1,5 +1,6 @@
(ns play-clj.core (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 (:import [com.badlogic.gdx Application Audio Files Game Gdx Graphics Input
InputMultiplexer InputProcessor Net Screen] InputMultiplexer InputProcessor Net Screen]
[com.badlogic.gdx.audio Sound] [com.badlogic.gdx.audio Sound]

View File

@@ -61,6 +61,13 @@ from the tiled map in `screen` that matches `layer`
[object k & options] [object k & options]
`(u/call! ^TiledMapTileLayer (cast TiledMapTileLayer ~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* (defn tiled-map-cell*
"The function version of `tiled-map-cell`" "The function version of `tiled-map-cell`"
[screen layer x y] [screen layer x y]
@@ -268,19 +275,41 @@ with the tiled map file at `path` and `unit` scale
; render ; render
(defn ^:private render-map! (defn render-map!
"Internal use only" "Calls the tiled-map renderer from `screen`, optionally allowing you to
[{:keys [^BatchTiledMapRenderer renderer ^Camera camera]}] specify which layers to render with or without
(when camera (.setView renderer camera))
(.render renderer))
(defn ^:private render-stage! (render-map! screen :with \"water\" \"grass\")
"Internal use only" (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]}] [{:keys [^Stage renderer ^Camera camera]}]
(when camera (when camera
(.setCamera renderer camera) (.setCamera renderer camera)
(.setViewport renderer (. camera viewportWidth) (. camera viewportHeight))) (.setViewport renderer (. camera viewportWidth) (. camera viewportHeight)))
(doto renderer .act .draw)) (doto renderer .act .draw)
nil)
(defn render! (defn render!
"Calls the renderer from `screen` and optionally draws and returns the "Calls the renderer from `screen` and optionally draws and returns the