Make all mutations entities to allow pure functional games

This commit is contained in:
oakes
2013-12-31 15:28:50 -05:00
parent 49ea7602e8
commit f66b8dd597
4 changed files with 56 additions and 25 deletions

View File

@@ -12,20 +12,36 @@
IsometricTiledMapRenderer
OrthogonalTiledMapRenderer]))
(defmulti execute-entity :command :default :draw)
(load "core_2d")
(load "core_global")
(load "core_render")
(defn transform
[l]
(->> l list flatten (remove nil?)))
(defn expand-entity
[entity]
(if (keyword? entity)
{:command entity}
entity))
(defn transform-entities
[entities]
(->> entities list flatten (remove nil?) (map expand-entity)))
(defn execute-entities
[screen entities]
(->> entities
(map #(assoc % :screen screen))
(map execute-entity)
(remove #(not (:persistent? %)))
doall))
(defn defscreen*
[{:keys [on-show on-render on-dispose on-hide on-pause on-resize on-resume
state renderer camera]
:as options}]
(let [screen (atom {})
entities (atom [])
entities (atom '())
on-show (or on-show (fn [s]))
on-render (or on-render (fn [s d]))
on-hide (or on-hide (fn [s]))
@@ -40,7 +56,7 @@
:total-time 0
:delta-time 0)
on-show
transform
transform-entities
(reset! entities)))
(render [delta-time]
(let [total-time (+ (:total-time @screen) delta-time)
@@ -48,9 +64,9 @@
:total-time total-time
:delta-time delta-time)]
(->> (on-render screen-map @entities)
transform
(reset! entities)
(draw! screen-map))))
transform-entities
(execute-entities screen-map)
(reset! entities))))
(hide [] (on-hide @screen))
(pause [] (on-pause @screen))
(resize [w h] (on-resize @screen w h))

View File

@@ -10,15 +10,13 @@
(defmethod sprite-batch BatchTiledMapRenderer [screen]
(.getSpriteBatch (:renderer screen)))
(defn draw!
[screen entities]
(defmethod execute-entity :draw [{:keys [screen image x y width height] :as entity}]
(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 (float x) (float y) (float width) (float height))))
(.end batch)
batch))
(when (and image x y width height)
(.draw batch image (float x) (float y) (float width) (float height)))
(.end batch))
entity)
; textures

View File

@@ -2,12 +2,11 @@
; graphics
(defn clear!
([] (clear! 0 0 0 0))
([r g b a]
(doto (Gdx/gl)
(.glClearColor r g b a)
(.glClear GL20/GL_COLOR_BUFFER_BIT))))
(defmethod execute-entity :clear [{:keys [r g b a] :as entity}]
(doto (Gdx/gl)
(.glClearColor (or r 0) (or g 0) (or b 0) (or a 0))
(.glClear GL20/GL_COLOR_BUFFER_BIT))
entity)
(defn game*
[key]

View File

@@ -12,10 +12,22 @@
(assert (number? tile-size))
(float (/ 1 tile-size)))
(defn render-tiled-map!
[{:keys [^BatchTiledMapRenderer renderer ^OrthographicCamera camera]}]
(.setView renderer camera)
(.render renderer))
(defmethod execute-entity :render-tiled-map [{:keys [screen] :as entity}]
(doto (:renderer screen)
(.setView (:camera screen))
.render)
entity)
(defn tiled-map-layer
[{:keys [^BatchTiledMapRenderer renderer]} layer]
(-> renderer .getMap .getLayers (.get layer)))
(defn tiled-map-cell
[{:keys [^BatchTiledMapRenderer renderer] :as screen} layer x y]
(-> (if (or (string? layer) (number? layer))
(tiled-map-layer screen layer)
layer)
(.getCell x y)))
(defmulti create-renderer :type :default :orthogonal-tiled-map)
@@ -44,3 +56,9 @@
(defn resize-camera!
[{:keys [^Camera camera]} width height]
(.setToOrtho camera false width height))
(defn move-camera!
[{:keys [^Camera camera]} x y]
(when x (set! (. camera x) x))
(when y (set! (. camera y) y))
(.update camera))