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]
|
||||
[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))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user