diff --git a/desktop/src-common/advent/screens/scene.clj b/desktop/src-common/advent/screens/scene.clj index 4b3b8c6a..bcc69bfa 100644 --- a/desktop/src-common/advent/screens/scene.clj +++ b/desktop/src-common/advent/screens/scene.clj @@ -613,22 +613,47 @@ :hud-active? (fn [{:keys [hud-active?]} [entities]] (assoc-in entities [:state :hud-active?] hud-active?))) + +(defn grow-hud [screen entities target up?] + + (let [grow-or-shrink (if up? :grow :shrink) + scale-from (if up? 1.0 1.1) + scale-to (if up? 1.1 1.0) + opacity-from (if up? 0.8 1.0) + opacity-to (if up? 1.0 0.8)] + (if (and (not (get-in entities [:tweens [target grow-or-shrink :x]])) + (not= scale-to (get-in entities [target :scale-y] 1.0))) + (-> entities + (assoc-in [:tweens [target grow-or-shrink :y]] + (tween/tween [target grow-or-shrink :y] screen [target :scale-y] scale-from scale-to 0.15 :ease tween/ease-in-out-quadratic)) + (assoc-in [:tweens [target grow-or-shrink :x]] + (tween/tween [target grow-or-shrink :x] screen [target :scale-x] scale-from scale-to 0.15 :ease tween/ease-in-out-quadratic)) + (assoc-in [:tweens [target grow-or-shrink :opacity]] + (tween/tween [target grow-or-shrink :opacity] screen [target :opacity] opacity-from opacity-to 0.15 :ease tween/ease-in-out-quadratic))) + entities))) + (defscreen hud :on-show (fn [screen entities] (let [screen (assoc screen :total-time 0)] (utils/setup-viewport screen 320 240) - {:close (assoc (texture "close.png") :x 304 :y 224 :width 16 :height 16 :baseline 9000) + {:close (assoc (texture "close.png") + :x 304 :y 224 + :width 16 :height 16 + :baseline 9000 + :opacity 0.8) :inventory (assoc (texture "inventory.png") :x 278 :y 0 :baseline 9000 - :mouse-in? (zone/box 278 0 320 42)) - :fps (assoc (label "0" (color :white) ) :x 5 :baseline 0)})) + :mouse-in? (zone/box 278 0 320 42) + :opacity 0.8) + :fps (assoc (label "0" (color :white) ) :x 5 :baseline 0 :opacity 0.3)})) :on-render (fn [screen [entities]] - (label! (:fps entities) :set-text (str (game :fps))) - (render! screen [(:fps entities) (:inventory entities) (:close entities)]) - entities) + (let [entities (utils/apply-tweens screen entities (:tweens entities))] + (label! (:fps entities) :set-text (str (game :fps))) + (render! screen [(:fps entities) (:inventory entities) (:close entities)]) + entities)) :on-resize (fn [screen entities] @@ -636,9 +661,22 @@ :on-mouse-moved (fn [screen [entities]] - (let [[x y] (utils/unproject screen)] - (screen! scene :hud-active? :hud-active? (or ((:mouse-in? (:inventory entities)) x y) - (utils/intersects? (:close entities) [x y]))))) + (let [[x y] (utils/unproject screen) + hovered-inventory? ((:mouse-in? (:inventory entities)) x y) + hovered-close? (utils/intersects? (:close entities) [x y])] + (screen! scene :hud-active? :hud-active? (or hovered-close? hovered-inventory?)) + (cond hovered-inventory? + (grow-hud screen entities :inventory true) + + hovered-close? + (grow-hud screen entities :close true) + + :else + (let [entities (update-in entities [:tweens] dissoc :inventory-grow-x :inventory-grow-y) + entities (grow-hud screen entities :inventory false) + entities (grow-hud screen entities :close false)] + entities + )))) :on-touch-up