Make defscreen more functional
This commit is contained in:
@@ -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))
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user