Make defscreen more functional

This commit is contained in:
oakes
2013-12-31 12:59:52 -05:00
parent 7f1ef44aa7
commit 8d01b4da17
2 changed files with 24 additions and 60 deletions

View File

@@ -16,57 +16,35 @@
(load "core_global") (load "core_global")
(load "core_render") (load "core_render")
(defn find-pos
[val coll]
(let [pos (if (number? val)
val
(.indexOf coll val))]
(if (and (>= pos 0) (< pos (count coll)))
pos
nil)))
(defn defscreen* (defn defscreen*
[{:keys [on-show on-render on-dispose on-hide on-pause on-resize on-resume [{:keys [on-show on-render on-dispose on-hide on-pause on-resize on-resume
state renderer camera] state renderer camera]
:as options}] :as options}]
(let [screen (atom {}) (let [screen (atom {})
entities (atom [])
on-show (or on-show (fn [s])) on-show (or on-show (fn [s]))
on-render (or on-render (fn [s d])) on-render (or on-render (fn [s d]))
on-dispose (or on-dispose (fn [s]))
on-hide (or on-hide (fn [s])) on-hide (or on-hide (fn [s]))
on-pause (or on-pause (fn [s])) on-pause (or on-pause (fn [s]))
on-resize (or on-resize (fn [s w h])) on-resize (or on-resize (fn [s w h]))
on-resume (or on-resume (fn [s])) on-resume (or on-resume (fn [s]))]
add-entity (fn [entity]
(->> entity
(conj (:entities @screen))
(swap! screen assoc :entities)))
rem-entity (fn [entity]
(when-let [pos (find-pos entity (:entities @screen))]
(->> (subvec (:entities @screen) (inc pos))
(concat (subvec (:entities @screen) 0 pos))
vec
(swap! screen assoc :entities))))
upd-entity (fn [entity args]
(when-let [pos (find-pos entity (:entities @screen))]
(swap! screen assoc-in
[:entities pos] (apply assoc entity args))))]
(proxy [Screen] [] (proxy [Screen] []
(show [] (show []
(swap! screen assoc (->> (swap! screen assoc
:renderer (create-renderer renderer) :renderer (create-renderer renderer)
:camera (create-camera camera) :camera (create-camera camera)
:total-time 0 :total-time 0
:entities [] :delta-time 0)
:add-entity add-entity on-show
:rem-entity rem-entity (reset! entities)))
:upd-entity upd-entity)
(when state (swap! screen assoc :state state))
(on-show @screen))
(render [delta-time] (render [delta-time]
(swap! screen assoc :total-time (+ (:total-time @screen) delta-time)) (let [total-time (+ (:total-time @screen) delta-time)
(on-render @screen delta-time)) screen-map (swap! screen assoc
(dispose [] (on-dispose @screen)) :total-time total-time
:delta-time delta-time)]
(->> (on-render screen-map @entities)
(reset! entities)
(draw! screen-map))))
(hide [] (on-hide @screen)) (hide [] (on-hide @screen))
(pause [] (on-pause @screen)) (pause [] (on-pause @screen))
(resize [w h] (on-resize @screen w h)) (resize [w h] (on-resize @screen w h))
@@ -76,18 +54,6 @@
[name & {:keys [] :as options}] [name & {:keys [] :as options}]
`(def ~name (defscreen* ~options))) `(def ~name (defscreen* ~options)))
(defn add!
[{:keys [add-entity]} e]
(add-entity e))
(defn remove!
[{:keys [rem-entity]} e]
(rem-entity e))
(defn update!
[{:keys [upd-entity]} e & args]
(upd-entity e args))
(defn set-screen! (defn set-screen!
[^Game game ^Screen screen] [^Game game ^Screen screen]
(.setScreen game screen)) (.setScreen game screen))

View File

@@ -11,16 +11,14 @@
(.getSpriteBatch (:renderer screen))) (.getSpriteBatch (:renderer screen)))
(defn draw! (defn draw!
([screen] [screen entities]
(draw! screen (:entities screen))) (let [batch (sprite-batch screen)]
([screen entities] (.begin batch)
(let [batch (sprite-batch screen)] (doseq [{:keys [image x y width height]} entities]
(.begin batch) (when (and image x y width height)
(doseq [{:keys [image x y width height]} entities] (.draw batch image (float x) (float y) (float width) (float height))))
(when (and image x y width height) (.end batch)
(.draw batch image (float x) (float y) (float width) (float height)))) batch))
(.end batch)
batch)))
; textures ; textures