Fix how the screen is updated
This commit is contained in:
@@ -45,8 +45,9 @@
|
|||||||
|
|
||||||
(defn ^:private reset-changed!
|
(defn ^:private reset-changed!
|
||||||
[e-atom e-old e-new]
|
[e-atom e-old e-new]
|
||||||
(when (not= e-old e-new)
|
(when (and (not= e-old e-new)
|
||||||
(compare-and-set! e-atom e-old e-new)))
|
(compare-and-set! e-atom e-old e-new))
|
||||||
|
e-new))
|
||||||
|
|
||||||
(defn ^:private normalize
|
(defn ^:private normalize
|
||||||
[entities]
|
[entities]
|
||||||
@@ -72,34 +73,33 @@
|
|||||||
#(normalize (func screen-map old-entities))
|
#(normalize (func screen-map old-entities))
|
||||||
(meta func))
|
(meta func))
|
||||||
(wrapper screen)
|
(wrapper screen)
|
||||||
(reset-changed! entities old-entities)))))
|
(reset-changed! entities old-entities)
|
||||||
total-time (atom 0)]
|
(update-screen! @screen)))))
|
||||||
; update screen when either the screen or entities are changed
|
update-fn! (fn [func args]
|
||||||
(add-watch screen :changed (fn [_ _ old-screen new-screen]
|
(doto (apply swap! screen func args)
|
||||||
(update-screen! new-screen)))
|
update-screen!))]
|
||||||
(add-watch entities :changed (fn [_ _ _ new-entities]
|
|
||||||
(update-screen! @screen new-entities)))
|
|
||||||
; return a map with all values related to the screen
|
|
||||||
{:screen screen
|
{:screen screen
|
||||||
:entities entities
|
:entities entities
|
||||||
:options options
|
:options options
|
||||||
:show (fn []
|
:show (fn []
|
||||||
(swap! screen assoc
|
(update-fn! assoc
|
||||||
:total-time 0
|
[:total-time 0
|
||||||
:update-fn! #(apply swap! screen %1 %2)
|
:update-fn! update-fn!
|
||||||
:execute-fn! execute-fn!
|
:execute-fn! execute-fn!
|
||||||
:on-timer on-timer
|
:on-timer on-timer
|
||||||
:input-listeners (input-listeners options execute-fn!)
|
:input-listeners (input-listeners options execute-fn!)
|
||||||
:ui-listeners (ui-listeners options execute-fn!))
|
:ui-listeners (ui-listeners options execute-fn!)])
|
||||||
(execute-fn! on-show)
|
(execute-fn! on-show)
|
||||||
(->> (contact-listener @screen options execute-fn!)
|
(->> (contact-listener @screen options execute-fn!)
|
||||||
(swap! screen assoc :contact-listener)))
|
(swap! screen assoc :contact-listener)))
|
||||||
:render (fn [d]
|
:render (fn [d]
|
||||||
(swap! total-time + d)
|
(swap! screen #(assoc % :total-time (+ (:total-time %) d)))
|
||||||
(execute-fn! on-render :delta-time d :total-time @total-time))
|
(execute-fn! on-render :delta-time d))
|
||||||
:hide #(execute-fn! on-hide)
|
:hide #(execute-fn! on-hide)
|
||||||
:pause #(execute-fn! on-pause)
|
:pause #(execute-fn! on-pause)
|
||||||
:resize #(execute-fn! on-resize :width %1 :height %2)
|
:resize (fn [w h]
|
||||||
|
(execute-fn! on-resize :width w :height h)
|
||||||
|
(update-screen! @screen))
|
||||||
:resume #(execute-fn! on-resume)}))
|
:resume #(execute-fn! on-resume)}))
|
||||||
|
|
||||||
(defmacro defscreen
|
(defmacro defscreen
|
||||||
@@ -119,6 +119,7 @@ via the screen map.
|
|||||||
:on-render ; the screen must be rendered (many times per second)
|
:on-render ; the screen must be rendered (many times per second)
|
||||||
(fn [screen entities]
|
(fn [screen entities]
|
||||||
(println (:delta-time screen)) ; time (ms) elapsed since last frame
|
(println (:delta-time screen)) ; time (ms) elapsed since last frame
|
||||||
|
(println (:total-time screen)) ; time (ms) elapsed since :on-show
|
||||||
entities)
|
entities)
|
||||||
:on-hide ; the screen was replaced
|
:on-hide ; the screen was replaced
|
||||||
(fn [screen entities]
|
(fn [screen entities]
|
||||||
@@ -438,22 +439,23 @@ via the screen map.
|
|||||||
|
|
||||||
(set-screen! my-game main-screen text-screen)"
|
(set-screen! my-game main-screen text-screen)"
|
||||||
[^Game game-object & screen-objects]
|
[^Game game-object & screen-objects]
|
||||||
(let [add-inputs! (fn []
|
(let [run-fn! (fn [k & args]
|
||||||
(input! :set-input-processor (InputMultiplexer.))
|
|
||||||
(doseq [{:keys [screen]} screen-objects]
|
|
||||||
(doseq [[_ listener] (:input-listeners @screen)]
|
|
||||||
(add-input! listener))))
|
|
||||||
run-fn! (fn [k & args]
|
|
||||||
(doseq [screen screen-objects]
|
(doseq [screen screen-objects]
|
||||||
(apply (get screen k) args)))]
|
(apply (get screen k) args)))]
|
||||||
(.setScreen game-object (reify Screen
|
(.setScreen game-object
|
||||||
(show [this] (run-fn! :show) (add-inputs!))
|
(reify Screen
|
||||||
(render [this d] (run-fn! :render d))
|
(show [this]
|
||||||
(hide [this] (run-fn! :hide))
|
(input! :set-input-processor (InputMultiplexer.))
|
||||||
(pause [this] (run-fn! :pause))
|
(run-fn! :show)
|
||||||
(resize [this w h] (run-fn! :resize w h))
|
(doseq [{:keys [screen]} screen-objects]
|
||||||
(resume [this] (run-fn! :resume))
|
(doseq [[_ listener] (:input-listeners @screen)]
|
||||||
(dispose [this])))))
|
(add-input! listener))))
|
||||||
|
(render [this d] (run-fn! :render d))
|
||||||
|
(hide [this] (run-fn! :hide))
|
||||||
|
(pause [this] (run-fn! :pause))
|
||||||
|
(resize [this w h] (run-fn! :resize w h))
|
||||||
|
(resume [this] (run-fn! :resume))
|
||||||
|
(dispose [this])))))
|
||||||
|
|
||||||
(defn set-screen-wrapper!
|
(defn set-screen-wrapper!
|
||||||
"Sets a function that wraps around all screen functions, allowing you to
|
"Sets a function that wraps around all screen functions, allowing you to
|
||||||
|
|||||||
Reference in New Issue
Block a user