progress on new save menu.
This commit is contained in:
@@ -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))
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user