From a8976e079d145a362cc51f712da6d0bf38ae54d9 Mon Sep 17 00:00:00 2001 From: Bryce Covert Date: Wed, 4 Nov 2015 07:43:27 -0800 Subject: [PATCH] progress on new save menu. --- desktop/src-common/advent/screens/title.clj | 265 +++++++++----------- 1 file changed, 124 insertions(+), 141 deletions(-) diff --git a/desktop/src-common/advent/screens/title.clj b/desktop/src-common/advent/screens/title.clj index 689b21b8..039a014b 100644 --- a/desktop/src-common/advent/screens/title.clj +++ b/desktop/src-common/advent/screens/title.clj @@ -18,8 +18,9 @@ (:import [com.badlogic.gdx.graphics Pixmap Pixmap$Filter Texture Texture$TextureFilter] [com.badlogic.gdx.graphics.g2d TextureRegion] [com.badlogic.gdx.utils.viewport FitViewport] - [com.badlogic.gdx.scenes.scene2d.ui Slider$SliderStyle] - [com.badlogic.gdx.scenes.scene2d.utils Align] + [com.badlogic.gdx.scenes.scene2d.ui Slider$SliderStyle Widget] + [play_clj.entities ActorEntity] + [com.badlogic.gdx.scenes.scene2d.utils Align NinePatchDrawable] [com.badlogic.gdx Application Audio Files Game Gdx Graphics Input InputMultiplexer InputProcessor Net Preferences Screen])) @@ -117,6 +118,22 @@ (assoc-in [:tweens :fade-out-music] (tween/tween :fade-out-music screen [:volume] 1.0 0.0 1.0))))) +(defn button-style [] + (let [font (utils/get-font "ego/font.fnt") + style (style :text-button nil nil nil font)] + (set! (.fontColor style) (color 1.0 0.3 0.3 1.0)) + (set! (.overFontColor style) (color :yellow)) + (set! (.downFontColor style) (color 0.7 0.2 0.2 1.0)) + (set! (.disabledFontColor style) (color :gray)) + style)) + +(defn make-button + ([msg & rest] + (let [button (merge (text-button msg (button-style)) + (apply hash-map rest))] + (doto button + (text-button! :set-user-object button) )))) + (defn make-label ([msg] (make-label msg nil)) @@ -128,110 +145,80 @@ center (doto (label! :set-alignment Align/center)))))) -(defn make-slider [initial-value] - (let [ui-skin (skin "ui/ui.json")] - (-> - (slider {:min 0 :max 100 :step 1} ui-skin :set-value initial-value) - (assoc :width 305 - :hover (skin! ui-skin :get "default-horizontal-hover" Slider$SliderStyle) - :default (skin! ui-skin :get "default-horizontal" Slider$SliderStyle) - :z 8)))) +(defn make-slider [initial-value & rest] + (let [ui-skin (skin "ui/ui.json") + slider (-> + (slider {:min 0 :max 100 :step 1} ui-skin :set-value initial-value) + (assoc :width 305 + :hover (skin! ui-skin :get "default-horizontal-hover" Slider$SliderStyle) + :default (skin! ui-skin :get "default-horizontal" Slider$SliderStyle) + :z 8) + (merge (apply hash-map rest)))] + (doto slider + (slider! :set-user-object slider)))) (defn stack-y [label base index] (assoc label :y (- base (* 32 index)))) +(defn make-table [children] + (-> children + (table) + (doto (table! :background (NinePatchDrawable. + (:object (nine-patch {:region (:object (utils/get-texture "talk-bg-2.png")) :left 9 :top 9 :right 9 :bottom 9}))))) + (assoc + :y 32 :width 500 :height 335 + :x (- (/ 1280 2) (/ 500 2)) + :z 8 + :opacity 1.0))) + (defn main-menu [] (let [start-playing-label (quest-label) is-starting? (= "Begin quest" start-playing-label)] - {:start-playing (-> (make-label start-playing-label) - (stack-y 305 0) - (assoc :z 8 - :interactable true)) - :rewind (-> (make-label "Previous chapter" (when is-starting? (color :gray))) - (stack-y 305 1) - (assoc :z 8 - :interactable (not is-starting?))) - - :music-label (-> (make-label "Music" (color :white)) - (stack-y 305 2) - (assoc :z 8)) - - :music-volume-slider (-> (make-slider (:music-volume @utils/settings)) - center - (stack-y 305 3) - (assoc :z 8)) - - :sound-label (-> (make-label "FX" (color :white)) - (stack-y 305 4) - (assoc :z 8)) - :sound-volume-slider (-> (make-slider (:sound-volume @utils/settings)) - center - (stack-y 305 5) - (assoc :z 8)) - - :fullscreen (-> (make-label "Fullscreen") - (stack-y 305 6) - (assoc :z 8 :interactable true)) - :quit (-> (make-label "End quest") - (stack-y 305 7) - (assoc :z 8 :interactable true))})) + (make-table [[ (make-button start-playing-label :key :continue-or-start) :height 32] + :row + [ (make-button "Chapters" :key :chapters) :height 32] + :row + [ (make-button "Load") :height 32] + :row + [(make-label "Music" (color :white)) :height 32] + :row + [(make-slider (:music-volume @utils/settings) :key :music-volume-slider) :height 32 :width 305] + :row + [(make-label "FX" (color :white)) :height 32] + :row + [(make-slider (:sound-volume @utils/settings) :key :sound-volume-slider) :height 32 :width 305] + :row + [(make-button "Fullscreen" :key :toggle-fullscreen) :height 32] + :row + [(make-button "End quest" :key :end-quest) :height 32] + ]))) (defn get-selected-save [entities [x y]] (first (filter (every-pred :save #(utils/intersects? % [x y])) (vals entities)))) -(defn saves-menu [entities [save screenshot]] - (let [last? (= save (-> (:saves-list entities) last first)) - first? (= save (-> (:saves-list entities) first first)) - window (sliding-window (:save-index entities) 5 (:saves-list entities))] - (into - {:back (-> (make-label "Back") - (stack-y 305 7) - (assoc :z 8 :interactable true)) - :title (-> (make-label (str save)) - (stack-y 305 0) - (assoc :z 8 - :interactable true - :save (saves/name->save save))) - :screenshot-backdrop (-> (utils/get-texture "title/screenshot-backdrop.png") - (assoc :x (/ 1280 2) - :y 214 - :scale-x 4 - :scale-y 4 - :origin-y 19 - :origin-x 24 - :z 8)) - :screenshot (-> (image (texture screenshot)) - (assoc :z 9 :x (- (/ 1280 2) 80) :y (- 214 60) :height 120 :width 160 - :save (saves/name->save save))) +(defn saves-menu [] + (make-table (concat [[(make-label "Save Title") :colspan 3 :height 32] + :row + [(scroll-pane (table [[(image (utils/get-texture "title/screenshot-backdrop.png")) :width 142 :pad 4 4 4 4 :height 104] + [(image (utils/get-texture "title/screenshot-backdrop.png")) :width 142 :pad 4 4 4 4 :height 104] + [(image (utils/get-texture "title/screenshot-backdrop.png")) :width 142 :pad 4 4 4 4 :height 104] + :row + [(image (utils/get-texture "title/screenshot-backdrop.png")) :width 142 :pad 4 4 4 4 :height 104] + [(image (utils/get-texture "title/screenshot-backdrop.png")) :width 142 :pad 4 4 4 4 :height 104] + [(image (utils/get-texture "title/screenshot-backdrop.png")) :width 142 :pad 4 4 4 4 :height 104] + :row + [(image (utils/get-texture "title/screenshot-backdrop.png")) :width 142 :pad 4 4 4 4 :height 104] + [(image (utils/get-texture "title/screenshot-backdrop.png")) :width 142 :pad 4 4 4 4 :height 104] + [(image (utils/get-texture "title/screenshot-backdrop.png")) :width 142 :pad 4 4 4 4 :height 104]]) + (style :scroll-pane nil nil nil nil nil)) + :colspan 3 :height 224] + :row + [(ActorEntity. (Widget.)) :width 150] + [(make-button "Back" :key :back) :width 150] + [(make-button "Continue" :key :continue) :width 150]]))) - :next (-> (make-label "Next >" (when last? (color :gray))) - (assoc :x 780 :y 203 - :interactable (not last?))) - :prev (as-> (make-label "< Prev" (when first? (color :gray))) prev - (assoc prev :x (- 500 (.getWidth (:object prev))) :y 203 - :interactable (not first?)))} - (for [[[save-l] index] (map vector window (range)) - :let [image (if (= save-l save) - (utils/get-texture "title/save-indicator-active.png") - (utils/get-texture "title/save-indicator.png"))]] - - [[:save-indicator save-l] (assoc image - :y 116 :x (- (+ 640 (* index 7 4)) - (/ (* (dec (count window)) 7 4) 2)) - :z 8 :scale-x 4 :scale-y 4)])))) - -(defn style-ui [entities] - (doseq [entity (vals entities) - :let [[x y] (:last-pos entities)] - :when (and (:object entity) x y)] - (cond (label? entity) - (style-label entity (get-in entities [:font]) [x y]) - - (slider? entity) - (style-slider entity [x y]))) - entities) (defscreen title-screen :on-show @@ -280,7 +267,7 @@ :particle-clouds (assoc (particle-effect "particles/particle-clouds" :reset :start) :x 640 :y 480 :z 1) :ego-jet (assoc (particle-effect "particles/jet" :reset :start) :x 450 :y 650 :z 4) - :toolbox (-> (assoc (nine-patch {:region (:object (utils/get-texture "talk-bg-2.png")) :left 9 :top 9 :right 9 :bottom 9}) + #_#_:toolbox (-> (assoc (nine-patch {:region (:object (utils/get-texture "talk-bg-2.png")) :left 9 :top 9 :right 9 :bottom 9}) :y 58 :width 500 :height 297 :z 7) center) @@ -308,13 +295,13 @@ entities (fly-ego screen entities) entities (fly-balloon screen entities) entities (update-in entities [:balloon] merge (animation->texture screen (:anim (:balloon entities)))) - entities (update-in entities [:banner-back] merge (animation->texture screen (:anim (:banner-back entities)))) - entities (style-ui entities)] + entities (update-in entities [:banner-back] merge (animation->texture screen (:anim (:banner-back entities))))] (when (:fullscreen entities) (label! (:fullscreen entities) :set-text (if (.isFullscreen Gdx/graphics) "Fullscreen" "Windowed"))) + (music! (:music entities) :set-volume (utils/current-music-volume (:volume entities))) (render! screen (sort-by :z (filter :object (vals entities))) ) @@ -323,13 +310,9 @@ :show-screen (fn [entities] entities) - :on-mouse-moved (fn [screen [entities]] - (let [[x y] (utils/unproject screen)] - (assoc entities :last-pos [x y]))) + - :on-touch-dragged (fn [screen [entities]] - (let [[x y] (utils/unproject screen)] - (assoc entities :last-pos [x y]))) + :on-key-up (fn [screen entities] (when (= (key-code :escape) (:key screen)) @@ -337,54 +320,54 @@ nil) :on-ui-changed - (fn [screen [entities]] - (swap! utils/settings - assoc - :music-volume (slider! (:music-volume-slider entities) :get-value) - :sound-volume (slider! (:sound-volume-slider entities) :get-value)) - - (utils/save-settings!) - entities) + (fn [{:keys [actor] :as screen} [entities]] + (let [e (-> actor .getUserObject) + actor-key (:key e)] + + (cond + + (= :music-volume-slider actor-key) + (do (swap! utils/settings assoc :music-volume (slider! e :get-value)) + (utils/save-settings!) + entities) + + (= :sound-volume-slider actor-key) + (do (swap! utils/settings assoc :sound-volume (slider! e :get-value)) + (utils/save-settings!) + entities) + + (#{:back } actor-key) + (-> entities + (dissoc :save-menu) + (assoc :main-menu (main-menu))) + + (= :chapters actor-key) + (-> entities + (dissoc :main-menu) + (assoc :save-menu (saves-menu))) + + (= :toggle-fullscreen actor-key) + (utils/toggle-fullscreen!) + + (= :end-quest actor-key) + (quit screen entities) + + (= :continue-or-start actor-key) + (start-playing screen entities (if (= "Begin quest" (quest-label)) + nil + :autosave)) + + :else + entities))) :on-touch-up (fn [screen [{:keys [prev next saves-list save-index] :as entities}]] (when-not (get-in entities [:tweens :fade-out]) (let [[x y] (utils/unproject screen) selected-save (get-selected-save entities [x y])] (cond - (utils/intersects? (:start-playing entities) [x y]) + - (start-playing screen entities (if (= "Begin quest" (quest-label)) - nil - :autosave)) - (and (utils/intersects? (:rewind entities) [x y]) - (-> entities :rewind :interactable)) - (-> (apply dissoc entities (keys (:main-menu entities))) - (merge (saves-menu entities (nth saves-list save-index)))) - - (utils/intersects? (:quit entities) [x y]) - (quit screen entities) - - (utils/intersects? (:fullscreen entities) [x y]) - (utils/toggle-fullscreen!) - - (and (:back entities) (utils/intersects? (:back entities) [x y])) - (as-> entities entities - (dissoc entities :screenshot :back :title :prev :next :screenshot-backdrop) - (apply dissoc entities (map #(vector :save-indicator (first %)) - (:saves-list entities))) - (merge entities(:main-menu entities))) - - (and next (:interactable next) (utils/intersects? next [x y])) - (as-> entities entities - (update-in entities [:save-index] inc) - (merge entities (saves-menu entities (nth saves-list (:save-index entities))))) - - (and prev (:interactable prev) (utils/intersects? prev [x y])) - (as-> entities entities - (update-in entities [:save-index] dec) - (merge entities (saves-menu entities (nth saves-list (:save-index entities))))) - selected-save (start-playing screen entities (:save selected-save))