diff --git a/desktop/src-common/advent/screens/title.clj b/desktop/src-common/advent/screens/title.clj index f1807b31..1aba0fee 100644 --- a/desktop/src-common/advent/screens/title.clj +++ b/desktop/src-common/advent/screens/title.clj @@ -16,16 +16,7 @@ [com.badlogic.gdx Application Audio Files Game Gdx Graphics Input InputMultiplexer InputProcessor Net Preferences Screen])) -(defn tween [id screen path start end time finish] - (let [start-time (or (:total-time screen) 0.0)] - (fn [e total-time] - (let [delta-time (- total-time start-time) - pct-done (min (/ delta-time time) 1.0) - e (assoc-in e path (+ start (* pct-done (- end start))))] - (if (= 1.0 pct-done) - (update-in (finish e) [:tweens] dissoc id) - e) - )))) + (defscreen title-screen :on-show @@ -44,15 +35,14 @@ :volume 1.0 :start-showing? false :start-playing start-playing - :tweens {:fade-in (tween :fade-in screen [:fade :opacity] 1.0 0.0 1.0 #(do (utils/play-sound (:music %)) %))} + :tweens {:fade-in (utils/tween :fade-in screen [:fade :opacity] 1.0 0.0 1.0 + :finish #(do (utils/play-sound (:music %)) %) + :power 10.0)} })) :on-render (fn [screen [entities]] - (let [entities (reduce (fn [e f] - (f e (:total-time screen))) - entities - (vals (:tweens entities)))] + (let [entities (utils/apply-tweens screen entities (:tweens entities))] (music! (:music entities) :set-volume (:volume entities)) (render! screen [(:overlay entities) (:start-playing entities) (:fade entities)]) entities)) @@ -66,13 +56,14 @@ :on-touch-up (fn [screen [entities]] (-> entities (assoc-in [:tweens :fade-out] - (tween :fade-out screen [:fade :opacity] 0.0 1.0 2.0 - (fn [entities] - (utils/stop-sound (:music entities)) - (set-screen! @(resolve 'advent.core/advent) scene/scene dialogue/talking-screen dialogue/choice-screen inventory/inventory-screen safe/safe-screen) - entities))) + (utils/tween :fade-out screen [:fade :opacity] 0.0 1.0 2.0 + :finish (fn [entities] + (utils/stop-sound (:music entities)) + (set-screen! @(resolve 'advent.core/advent) scene/scene dialogue/talking-screen dialogue/choice-screen inventory/inventory-screen safe/safe-screen) + entities) + :power 3.0)) (assoc-in [:tweens :fade-out-music] - (tween :fade-out-music screen [:volume] 1.0 0.0 1.8 identity)))) + (utils/tween :fade-out-music screen [:volume] 1.0 0.0 1.8)))) :on-resize (fn [screen entities] (size! screen 1280 960))) diff --git a/desktop/src-common/advent/utils.clj b/desktop/src-common/advent/utils.clj index 55e99e42..9e139eac 100644 --- a/desktop/src-common/advent/utils.clj +++ b/desktop/src-common/advent/utils.clj @@ -125,3 +125,23 @@ (defn make-music [r] (doto (music r) (music! :set-looping true))) +(defn tween [id screen path start end duration & {:keys [finish power]}] + (let [power (or power 1.0) + finish (or finish identity) + start-time (or (:total-time screen) 0.0) + delta (- end start)] + (fn [e total-time] + (let [delta-time (- total-time start-time) + pct-done (min (/ delta-time duration) 1.0) + pct-done (Math/pow pct-done power) + e (assoc-in e path (+ start (* pct-done delta)))] + (if (= 1.0 pct-done) + (update-in (finish e) [:tweens] dissoc id) + e) + )))) + +(defn apply-tweens [screen entities tweens] + (reduce (fn [e f] + (f e (:total-time screen))) + entities + (vals tweens)))