diff --git a/desktop/src-common/advent/screens/dialogue.clj b/desktop/src-common/advent/screens/dialogue.clj index 8e7d5136..c4c08688 100644 --- a/desktop/src-common/advent/screens/dialogue.clj +++ b/desktop/src-common/advent/screens/dialogue.clj @@ -6,6 +6,7 @@ [clojure.pprint] [clojure.set :as set] [advent.pathfind] + [advent.utils :as utils] [clojure.core.async :refer [put! ! >!! chan go thread take! alts!!]] #_[advent.screens.scene :as scene]) (:import [com.badlogic.gdx.graphics Pixmap Pixmap$Filter Texture Texture$TextureFilter] @@ -65,13 +66,10 @@ (def choice-height 30) -(defn intersects? [e [x y]] - (and (:object e) - (< (:x e) x (+ (:x e) (.getWidth (:object e)))) - (< (:y e) y (+ (:y e) (:height e))))) + (defn get-color [e mouse-pos] - (if (intersects? e mouse-pos) + (if (utils/intersects? e mouse-pos) (color :yellow) (color 0.6 1.0 1.0 1.0) )) @@ -121,7 +119,7 @@ :on-touch-up (fn [screen [entities]] (let [{:keys [x y]} (input->screen screen {:x (:input-x screen) :y (:input-y screen)})] (when (seq (get-in entities [:state :choices])) - (when-let [choice (first (filter #(intersects? % [x y]) (vals entities)))] + (when-let [choice (first (filter #(utils/intersects? % [x y]) (vals entities)))] ((get-in entities [:state :callback]) (:index choice)) (-> entities (assoc-in [:state :callback] nil) @@ -130,8 +128,8 @@ :on-mouse-moved (fn [screen [entities]] (let [{:keys [x y]} (input->screen screen {:x (:input-x screen) :y (:input-y screen)}) - entities (assoc-in entities [:state :last-pos] [x y]) - choice-count (dec (count entities))] + entities (assoc-in entities [:state :last-pos] [x y]) + choice-count (dec (count entities))] (doseq [e (vals entities) :when (:object e)] (style-label e (get-in entities [:state :font]) [x y])) diff --git a/desktop/src-common/advent/screens/title.clj b/desktop/src-common/advent/screens/title.clj index 1aba0fee..fe5dcabd 100644 --- a/desktop/src-common/advent/screens/title.clj +++ b/desktop/src-common/advent/screens/title.clj @@ -17,12 +17,27 @@ InputMultiplexer InputProcessor Net Preferences Screen])) +(defn get-color [e mouse-pos] + (if (utils/intersects? e mouse-pos) + (color :yellow) + (color 0.6 1.0 1.0 1.0))) + +(defn style-label [e font mouse-pos] + (label! e :set-style (style :label font (get-color e mouse-pos))) + e) + +(defn center [e] + (assoc e :x (- (/ 1280 2) (/ (.getWidth (:object e)) 2)))) (defscreen title-screen :on-show (fn [screen entities] (update! screen :renderer (stage) :camera (orthographic)) - (let [start-playing (assoc (label "Start Game" (style :label (utils/get-font "ego/font.fnt") (color :red))) :x 0 :y 850 :width 1280) + (let [font (utils/get-font "ego/font.fnt") + start-playing (assoc (label "Embark on thy adventure" (style :label font (color 0.6 1.0 1.0 1.0))) :x 0 :y 100) + start-playing (center start-playing) + quit (assoc (label "Quit thy adventure" (style :label font (color 0.6 1.0 1.0 1.0))) :x 0 :y 50) + quit (center quit) music (utils/make-music "intro.ogg")] (label! start-playing :set-alignment Align/center) @@ -31,10 +46,12 @@ :scale-x 80 :scale-y 80 :opacity 1.0) + :font font :music music :volume 1.0 :start-showing? false :start-playing start-playing + :quit quit :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)} @@ -44,26 +61,43 @@ (fn [screen [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)]) + (render! screen [(:overlay entities) (:start-playing entities) (:quit entities) (:fade entities)]) entities)) :show-screen (fn [entities] entities) :on-mouse-moved (fn [screen [entities]] - nil) + (let [{:keys [x y]} (input->screen screen {:x (:input-x screen) :y (:input-y screen)})] + (style-label (:start-playing entities) (get-in entities [:font]) [x y]) + (style-label (:quit entities) (get-in entities [:font]) [x y]) + entities)) :on-touch-up (fn [screen [entities]] - (-> entities - (assoc-in [:tweens :fade-out] - (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] - (utils/tween :fade-out-music screen [:volume] 1.0 0.0 1.8)))) + (let [{:keys [x y]} (input->screen screen {:x (:input-x screen) :y (:input-y screen)})] + (cond + (utils/intersects? (:start-playing entities) [x y]) + (-> entities + (assoc-in [:tweens :fade-out] + (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] + (utils/tween :fade-out-music screen [:volume] 1.0 0.0 1.8))) + (utils/intersects? (:quit entities) [x y]) + (-> entities + (assoc-in [:tweens :fade-out] + (utils/tween :fade-out screen [:fade :opacity] 0.0 1.0 2.0 + :finish (fn [entities] + (System/exit 0) + entities) + :power 3.0))) + + :else + nil))) :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 9e139eac..bbde3f47 100644 --- a/desktop/src-common/advent/utils.clj +++ b/desktop/src-common/advent/utils.clj @@ -145,3 +145,8 @@ (f e (:total-time screen))) entities (vals tweens))) + +(defn intersects? [e [x y]] + (and (:object e) + (< (:x e) x (+ (:x e) (or (:width e) (.getWidth (:object e))))) + (< (:y e) y (+ (:y e) (or (:height e) (.getHeight (:object e)))))))