progress on new save menu.

This commit is contained in:
Bryce Covert
2015-11-04 07:43:27 -08:00
parent 19ac21fe0a
commit a8976e079d

View File

@@ -18,8 +18,9 @@
(:import [com.badlogic.gdx.graphics Pixmap Pixmap$Filter Texture Texture$TextureFilter] (:import [com.badlogic.gdx.graphics Pixmap Pixmap$Filter Texture Texture$TextureFilter]
[com.badlogic.gdx.graphics.g2d TextureRegion] [com.badlogic.gdx.graphics.g2d TextureRegion]
[com.badlogic.gdx.utils.viewport FitViewport] [com.badlogic.gdx.utils.viewport FitViewport]
[com.badlogic.gdx.scenes.scene2d.ui Slider$SliderStyle] [com.badlogic.gdx.scenes.scene2d.ui Slider$SliderStyle Widget]
[com.badlogic.gdx.scenes.scene2d.utils Align] [play_clj.entities ActorEntity]
[com.badlogic.gdx.scenes.scene2d.utils Align NinePatchDrawable]
[com.badlogic.gdx Application Audio Files Game Gdx Graphics Input [com.badlogic.gdx Application Audio Files Game Gdx Graphics Input
InputMultiplexer InputProcessor Net Preferences Screen])) InputMultiplexer InputProcessor Net Preferences Screen]))
@@ -117,6 +118,22 @@
(assoc-in [:tweens :fade-out-music] (assoc-in [:tweens :fade-out-music]
(tween/tween :fade-out-music screen [:volume] 1.0 0.0 1.0))))) (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 (defn make-label
([msg] ([msg]
(make-label msg nil)) (make-label msg nil))
@@ -128,110 +145,80 @@
center center
(doto (label! :set-alignment Align/center)))))) (doto (label! :set-alignment Align/center))))))
(defn make-slider [initial-value] (defn make-slider [initial-value & rest]
(let [ui-skin (skin "ui/ui.json")] (let [ui-skin (skin "ui/ui.json")
(-> slider (->
(slider {:min 0 :max 100 :step 1} ui-skin :set-value initial-value) (slider {:min 0 :max 100 :step 1} ui-skin :set-value initial-value)
(assoc :width 305 (assoc :width 305
:hover (skin! ui-skin :get "default-horizontal-hover" Slider$SliderStyle) :hover (skin! ui-skin :get "default-horizontal-hover" Slider$SliderStyle)
:default (skin! ui-skin :get "default-horizontal" Slider$SliderStyle) :default (skin! ui-skin :get "default-horizontal" Slider$SliderStyle)
:z 8)))) :z 8)
(merge (apply hash-map rest)))]
(doto slider
(slider! :set-user-object slider))))
(defn stack-y [label base index] (defn stack-y [label base index]
(assoc label :y (- base (* 32 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 [] (defn main-menu []
(let [start-playing-label (quest-label) (let [start-playing-label (quest-label)
is-starting? (= "Begin quest" start-playing-label)] is-starting? (= "Begin quest" start-playing-label)]
{:start-playing (-> (make-label start-playing-label) (make-table [[ (make-button start-playing-label :key :continue-or-start) :height 32]
(stack-y 305 0) :row
(assoc :z 8 [ (make-button "Chapters" :key :chapters) :height 32]
:interactable true)) :row
:rewind (-> (make-label "Previous chapter" (when is-starting? (color :gray))) [ (make-button "Load") :height 32]
(stack-y 305 1) :row
(assoc :z 8 [(make-label "Music" (color :white)) :height 32]
:interactable (not is-starting?))) :row
[(make-slider (:music-volume @utils/settings) :key :music-volume-slider) :height 32 :width 305]
:music-label (-> (make-label "Music" (color :white)) :row
(stack-y 305 2) [(make-label "FX" (color :white)) :height 32]
(assoc :z 8)) :row
[(make-slider (:sound-volume @utils/settings) :key :sound-volume-slider) :height 32 :width 305]
:music-volume-slider (-> (make-slider (:music-volume @utils/settings)) :row
center [(make-button "Fullscreen" :key :toggle-fullscreen) :height 32]
(stack-y 305 3) :row
(assoc :z 8)) [(make-button "End quest" :key :end-quest) :height 32]
])))
: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))}))
(defn get-selected-save [entities [x y]] (defn get-selected-save [entities [x y]]
(first (filter (first (filter
(every-pred :save #(utils/intersects? % [x y])) (every-pred :save #(utils/intersects? % [x y]))
(vals entities)))) (vals entities))))
(defn saves-menu [entities [save screenshot]] (defn saves-menu []
(let [last? (= save (-> (:saves-list entities) last first)) (make-table (concat [[(make-label "Save Title") :colspan 3 :height 32]
first? (= save (-> (:saves-list entities) first first)) :row
window (sliding-window (:save-index entities) 5 (:saves-list entities))] [(scroll-pane (table [[(image (utils/get-texture "title/screenshot-backdrop.png")) :width 142 :pad 4 4 4 4 :height 104]
(into [(image (utils/get-texture "title/screenshot-backdrop.png")) :width 142 :pad 4 4 4 4 :height 104]
{:back (-> (make-label "Back") [(image (utils/get-texture "title/screenshot-backdrop.png")) :width 142 :pad 4 4 4 4 :height 104]
(stack-y 305 7) :row
(assoc :z 8 :interactable true)) [(image (utils/get-texture "title/screenshot-backdrop.png")) :width 142 :pad 4 4 4 4 :height 104]
:title (-> (make-label (str save)) [(image (utils/get-texture "title/screenshot-backdrop.png")) :width 142 :pad 4 4 4 4 :height 104]
(stack-y 305 0) [(image (utils/get-texture "title/screenshot-backdrop.png")) :width 142 :pad 4 4 4 4 :height 104]
(assoc :z 8 :row
:interactable true [(image (utils/get-texture "title/screenshot-backdrop.png")) :width 142 :pad 4 4 4 4 :height 104]
:save (saves/name->save save))) [(image (utils/get-texture "title/screenshot-backdrop.png")) :width 142 :pad 4 4 4 4 :height 104]
:screenshot-backdrop (-> (utils/get-texture "title/screenshot-backdrop.png") [(image (utils/get-texture "title/screenshot-backdrop.png")) :width 142 :pad 4 4 4 4 :height 104]])
(assoc :x (/ 1280 2) (style :scroll-pane nil nil nil nil nil))
:y 214 :colspan 3 :height 224]
:scale-x 4 :row
:scale-y 4 [(ActorEntity. (Widget.)) :width 150]
:origin-y 19 [(make-button "Back" :key :back) :width 150]
:origin-x 24 [(make-button "Continue" :key :continue) :width 150]])))
: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)))
: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 (defscreen title-screen
:on-show :on-show
@@ -280,7 +267,7 @@
:particle-clouds (assoc (particle-effect "particles/particle-clouds" :reset :start) :x 640 :y 480 :z 1) :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) :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 :y 58 :width 500 :height 297
:z 7) :z 7)
center) center)
@@ -308,13 +295,13 @@
entities (fly-ego screen entities) entities (fly-ego screen entities)
entities (fly-balloon screen entities) entities (fly-balloon screen entities)
entities (update-in entities [:balloon] merge (animation->texture screen (:anim (:balloon 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 (update-in entities [:banner-back] merge (animation->texture screen (:anim (:banner-back entities))))]
entities (style-ui entities)]
(when (:fullscreen entities) (when (:fullscreen entities)
(label! (:fullscreen entities) :set-text (if (.isFullscreen Gdx/graphics) (label! (:fullscreen entities) :set-text (if (.isFullscreen Gdx/graphics)
"Fullscreen" "Fullscreen"
"Windowed"))) "Windowed")))
(music! (:music entities) :set-volume (utils/current-music-volume (:volume entities))) (music! (:music entities) :set-volume (utils/current-music-volume (:volume entities)))
(render! screen (sort-by :z (filter :object (vals entities))) ) (render! screen (sort-by :z (filter :object (vals entities))) )
@@ -323,13 +310,9 @@
:show-screen (fn [entities] :show-screen (fn [entities]
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 :on-key-up
(fn [screen entities] (fn [screen entities]
(when (= (key-code :escape) (:key screen)) (when (= (key-code :escape) (:key screen))
@@ -337,54 +320,54 @@
nil) nil)
:on-ui-changed :on-ui-changed
(fn [screen [entities]] (fn [{:keys [actor] :as screen} [entities]]
(swap! utils/settings (let [e (-> actor .getUserObject)
assoc actor-key (:key e)]
:music-volume (slider! (:music-volume-slider entities) :get-value)
:sound-volume (slider! (:sound-volume-slider entities) :get-value)) (cond
(utils/save-settings!) (= :music-volume-slider actor-key)
entities) (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}]] :on-touch-up (fn [screen [{:keys [prev next saves-list save-index] :as entities}]]
(when-not (get-in entities [:tweens :fade-out]) (when-not (get-in entities [:tweens :fade-out])
(let [[x y] (utils/unproject screen) (let [[x y] (utils/unproject screen)
selected-save (get-selected-save entities [x y])] selected-save (get-selected-save entities [x y])]
(cond (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 selected-save
(start-playing screen entities (:save selected-save)) (start-playing screen entities (:save selected-save))