Files
play-clj/common/src/play_clj/render.clj
2013-12-29 14:03:12 -05:00

70 lines
2.0 KiB
Clojure

(ns play-clj.render)
(in-ns 'play-clj.core)
; tiled map renderers
(defmulti create-tiled-map-renderer :type :default :orthogonal)
(defmethod create-tiled-map-renderer :orthogonal [options]
(OrthogonalTiledMapRenderer. (:map options) (:unit-scale options)))
(defmethod create-tiled-map-renderer :isometric [options]
(IsometricTiledMapRenderer. (:map options) (:unit-scale options)))
(defmethod create-tiled-map-renderer :isometric-staggered [options]
(IsometricStaggeredTiledMapRenderer. (:map options) (:unit-scale options)))
(defmethod create-tiled-map-renderer :hexagonal [options]
(HexagonalTiledMapRenderer. (:map options) (:unit-scale options)))
(defn tiled-map
[& {:keys [file tile-size type] :as options}]
(assert (string? file))
(assert (number? tile-size))
(fn []
(let [tiled-map (.load (TmxMapLoader.) file)
unit-scale (float (/ 1 tile-size))
options (assoc options
:map tiled-map
:unit-scale unit-scale)]
(create-tiled-map-renderer options))))
(defn render-tiled-map!
[{:keys [^BatchTiledMapRenderer renderer ^OrthographicCamera camera]}]
(.setView renderer camera)
(.render renderer))
; cameras
(defmulti create-camera identity :default :orthographic)
(defmethod create-camera :orthographic [_]
(OrthographicCamera.))
(defmethod create-camera :perspective [_]
(PerspectiveCamera.))
(defn resize-camera!
[{:keys [^Camera camera]} width height]
(.setToOrtho camera false width height))
; draw entities
(defmulti sprite-batch (fn [screen] (class (:renderer screen))) :default nil)
(defmethod sprite-batch nil [screen]
(SpriteBatch.))
(defmethod sprite-batch BatchTiledMapRenderer [screen]
(.getSpriteBatch (:renderer screen)))
(defn draw-entities!
[screen entities]
(let [batch (sprite-batch screen)]
(.begin batch)
(doseq [{:keys [image x y width height]} entities]
(when (and image x y width height)
(.draw batch image x y width height)))
(.end batch)))