From 8ecc23eae18af6747b243809912e826277886d51 Mon Sep 17 00:00:00 2001 From: Bryce Covert Date: Fri, 12 Aug 2016 08:16:09 -0700 Subject: [PATCH] a number of cool improvements, hotspots for cursors, non-jumpy text. --- .../src-common/advent/screens/dialogue.clj | 3 +- .../advent/screens/rooms/common.clj | 1 + .../advent/screens/rooms/outside_house.clj | 4 + desktop/src-common/advent/screens/scene.clj | 257 ++++++++++-------- desktop/src-common/advent/utils.clj | 23 +- 5 files changed, 163 insertions(+), 125 deletions(-) diff --git a/desktop/src-common/advent/screens/dialogue.clj b/desktop/src-common/advent/screens/dialogue.clj index 83f619c9..733fdf93 100644 --- a/desktop/src-common/advent/screens/dialogue.clj +++ b/desktop/src-common/advent/screens/dialogue.clj @@ -53,7 +53,8 @@ :on-talk (fn [screen entities {:keys [create-talk target-id color text x y scale scene-viewport id]}] - (let [font (bitmap-font "ego/font.fnt" ) + (let [font (doto (bitmap-font "ego/font.fnt" ) + (bitmap-font! :set-use-integer-positions false)) p (NinePatchEntity. (skin! (skin "ui/ui.json") :get-patch "ui-bg")) _ (nine-patch! p :set-padding 25 25 5 15) diff --git a/desktop/src-common/advent/screens/rooms/common.clj b/desktop/src-common/advent/screens/rooms/common.clj index 0f11c4b9..2494514a 100644 --- a/desktop/src-common/advent/screens/rooms/common.clj +++ b/desktop/src-common/advent/screens/rooms/common.clj @@ -66,6 +66,7 @@ disappear-left {1 [:disappear 0.7]} } :night-profile :sprite + :label "Gandarf" :cursor :talk :origin-x 0 :origin-y 0 diff --git a/desktop/src-common/advent/screens/rooms/outside_house.clj b/desktop/src-common/advent/screens/rooms/outside_house.clj index 260db83e..c1c439fb 100644 --- a/desktop/src-common/advent/screens/rooms/outside_house.clj +++ b/desktop/src-common/advent/screens/rooms/outside_house.clj @@ -697,6 +697,7 @@ [:stand 1] sheep-1 [:stand 2] sheep-2 [:stand 3] sheep-3 + :label "Sheep" :cursor :hand :origin-y 3 :origin-x 6 @@ -798,6 +799,7 @@ ) :lamb (assoc (utils/get-texture "outsidehouse/lamb.png") :cursor :look + :label "Baby lamb" :x 10 :y 163 :baseline 77 :right {:stand (animation 0.1 [lamb-stand]) :walk lamb-walk} @@ -827,6 +829,7 @@ :cauldron (rooms/make-entity :cauldron (assoc (animation->texture screen cauldron) :cursor :look :x 139 :y 73 :baseline 167 + :label "Magical cauldron" :anim cauldron :anim-start 0 :night-profile :none @@ -836,6 +839,7 @@ :charcoal (rooms/make-entity :charcoal (assoc (animation->texture screen charcoal) :cursor :hand + :label "Charcoal" :anim charcoal :anim-start 0 :night-profile :none diff --git a/desktop/src-common/advent/screens/scene.clj b/desktop/src-common/advent/screens/scene.clj index 6b0b70fb..92955bd8 100644 --- a/desktop/src-common/advent/screens/scene.clj +++ b/desktop/src-common/advent/screens/scene.clj @@ -44,6 +44,8 @@ [com.badlogic.gdx.graphics.g2d TextureRegion Animation Batch] [com.badlogic.gdx.math Vector3 Matrix4] [com.badlogic.gdx.utils.viewport FitViewport] + + [com.badlogic.gdx.utils Align] [com.badlogic.gdx.scenes.scene2d Actor Stage] [com.badlogic.gdx.graphics.glutils ShaderProgram] [java.lang Object] @@ -902,12 +904,12 @@ void main () :else (do - (graphics! :set-cursor (utils/cursor "cursor.png" (translate-depressed (or (:cursor new-current) new-current) - depressed?))) + (graphics! :set-cursor (utils/cursor "cursor.png" + (translate-depressed (or (:cursor new-current) new-current) + depressed?))) (update-in entities [:cursor ] assoc :last [new-current depressed?] - :time-changed total-time)) - ))) + :time-changed total-time))))) (defn get-looped-animation-point ^double [^Animation animation ^double total-time] @@ -1138,120 +1140,128 @@ void main () :on-show (fn [screen entities options] (log/info "Initializing scene.") - - (let [screen (assoc screen :total-time 0)] - (let [{cam :camera} (utils/setup-viewport screen 320 240)] - (set! (. cam zoom) 0.95) - (let [shader (ShaderProgram. ^String v-shader ^String pix-shader) - _ (log/info "shader log:" (.getLog shader)) - state (get-state @utils/selected-save) - start-pos [(:x state) (:y state)] - has-start-pos? (:x state) + (let [{cam :camera :as screen} (utils/setup-viewport screen 320 240) + screen (assoc screen :total-time 0)] + (set! (. cam zoom) 0.95) + (let [shader (ShaderProgram. ^String v-shader ^String pix-shader) + _ (log/info "shader log:" (.getLog shader)) + state (get-state @utils/selected-save) + start-pos [(:x state) (:y state)] + has-start-pos? (:x state) + font (doto (bitmap-font "label-font.fnt" ) + (bitmap-font! :set-use-integer-positions false)) + tr (bitmap-font! font :get-region) + _ (.setFilter (.getTexture tr) Texture$TextureFilter/Linear Texture$TextureFilter/Linear) + style (doto (style :label font (color :white)) + (#(-> % .font .getData (.setScale 0.0625)))) - _ (update! screen :shader shader) - rooms {:inside-house (rooms.inside-house/make screen) - :inside-stash (rooms.inside-stash/make screen) - :outside-house (rooms.outside-house/make screen) - :behind-house (rooms.behind-house/make screen) - :cat-tree (rooms.cat-tree/make screen) - :inside-castle (rooms.inside-castle/make screen) - :space (rooms.space/make screen) - :held (rooms.held/make screen) - :inside-cafeteria (rooms.inside-cafeteria/make screen) - :inside-antique (rooms.inside-antique/make screen) - :inside-jail (rooms.inside-jail/make screen) - :dream (rooms.dream/make screen) - :ending (rooms.ending/make screen) - :castle-gate (rooms.castle-gate/make screen) - :outside-jail (rooms.outside-jail/make screen) - :outside-castle (rooms.outside-castle/make screen)} - rooms (add-georgia-to-all-rooms screen rooms) - entities {:rooms rooms - :step-particles (assoc (particle-effect "particles/step") :x 100 :y 100 :baseline 241) - :cam {:zoom 0.95 - :paused? false - :object nil} - - :current-sounds {:object nil - :value []} - :musics {:object nil - :inside-antique (utils/make-music "music/inside-antique.ogg") - :town-1 (utils/make-music "music/town-music-1.ogg") - :town-2 (utils/make-music "music/town-music-2.ogg") - :love (utils/make-music "music/love.ogg") - :inside-fangald (utils/make-music "music/inside-fangald.ogg") - :fight (utils/make-music "music/megaboss.mp3") - :pull-sword (utils/make-music "music/pull-sword.ogg") - :night (utils/make-music "music/night.ogg") - :dream (utils/make-music "dream/music.ogg") - :secret-hideout (utils/make-music "music/secret-hideout.ogg") - :wind (utils/make-music "music/wind.ogg")} - :state state - :time-profiles {:object nil - :default utils/default-night-merge - :sprite utils/default-night-merge-sprite - :none {}} + _ (update! screen :shader shader) + rooms {:inside-house (rooms.inside-house/make screen) + :inside-stash (rooms.inside-stash/make screen) + :outside-house (rooms.outside-house/make screen) + :behind-house (rooms.behind-house/make screen) + :cat-tree (rooms.cat-tree/make screen) + :inside-castle (rooms.inside-castle/make screen) + :space (rooms.space/make screen) + :held (rooms.held/make screen) + :inside-cafeteria (rooms.inside-cafeteria/make screen) + :inside-antique (rooms.inside-antique/make screen) + :inside-jail (rooms.inside-jail/make screen) + :dream (rooms.dream/make screen) + :ending (rooms.ending/make screen) + :castle-gate (rooms.castle-gate/make screen) + :outside-jail (rooms.outside-jail/make screen) + :outside-castle (rooms.outside-castle/make screen)} + rooms (add-georgia-to-all-rooms screen rooms) + entities {:rooms rooms + :step-particles (assoc (particle-effect "particles/step") :x 100 :y 100 :baseline 241) + :cam {:zoom 0.95 + :paused? false + :object nil} + + :current-sounds {:object nil + :value []} + :musics {:object nil + :inside-antique (utils/make-music "music/inside-antique.ogg") + :town-1 (utils/make-music "music/town-music-1.ogg") + :town-2 (utils/make-music "music/town-music-2.ogg") + :love (utils/make-music "music/love.ogg") + :inside-fangald (utils/make-music "music/inside-fangald.ogg") + :fight (utils/make-music "music/megaboss.mp3") + :pull-sword (utils/make-music "music/pull-sword.ogg") + :night (utils/make-music "music/night.ogg") + :dream (utils/make-music "dream/music.ogg") + :secret-hideout (utils/make-music "music/secret-hideout.ogg") + :wind (utils/make-music "music/wind.ogg")} + :state state + :time-profiles {:object nil + :default utils/default-night-merge + :sprite utils/default-night-merge-sprite + :none {}} - :closing? {:object nil - :value false} - :sounds {:blink (utils/load-sound "ego/blink2.ogg") - :pickup (utils/load-sound "pickup.ogg") - :disappear (utils/load-sound "inside-house/disappear.ogg") - :grow-sound (utils/load-sound "ego/potion.ogg") + :closing? {:object nil + :value false} + :sounds {:blink (utils/load-sound "ego/blink2.ogg") + :pickup (utils/load-sound "pickup.ogg") + :disappear (utils/load-sound "inside-house/disappear.ogg") + :grow-sound (utils/load-sound "ego/potion.ogg") + :object nil} + :fade {:object nil + :opacity 0.0} + :white-fade (assoc (utils/get-texture "white.png") + :scale-x 30 + :scale-y 30 + :baseline 9500 + :opacity 0.0 + :origin-x 0 + :origin-y 0 + :x -20 + :y -20) + :fg-actions {:object nil + :channel (chan) + :current nil + :script-running? false + :started? false + :script-chan (chan (dropping-buffer 1))} + :bg-actions {:object nil + :channel (chan) + :current nil + :script-running? false + :started? false + :script-chan (chan (dropping-buffer 1))} + :volume {:object nil + :value 0.0} + :music-override {:object nil + :value nil} + :label (utils/add-actor-to-stage screen + (assoc (label "Sheep" style :set-alignment Align/left) + :x 0 :y 0 :baseline 10000)) + :cursor {:id "cursor" + :last nil + :override :hourglass + :last-pos [0 0] + :down-target nil} + + :all-items (assoc items/items :object nil) + :started? {:value false :object nil} - :fade {:object nil - :opacity 0.0} - :white-fade (assoc (utils/get-texture "white.png") - :scale-x 30 - :scale-y 30 - :baseline 9500 - :opacity 0.0 - :origin-x 0 - :origin-y 0 - :x -20 - :y -20) - :fg-actions {:object nil - :channel (chan) - :current nil - :script-running? false - :started? false - :script-chan (chan (dropping-buffer 1))} - :bg-actions {:object nil - :channel (chan) - :current nil - :script-running? false - :started? false - :script-chan (chan (dropping-buffer 1))} - :volume {:object nil - :value 0.0} - :music-override {:object nil - :value nil} - :cursor {:id "cursor" - :last nil - :override :hourglass - :last-pos [0 0] - :down-target nil} - - :all-items (assoc items/items :object nil) - :started? {:value false - :object nil} - :room (as-> (get rooms (:last-room state)) room - (assoc-in room [:entities :ego] (get-ego screen (if has-start-pos? - start-pos - (:start-pos room)) - ((:scale-fn room) - (if has-start-pos? - start-pos - (:start-pos room))))))}] + :room (as-> (get rooms (:last-room state)) room + (assoc-in room [:entities :ego] (get-ego screen (if has-start-pos? + start-pos + (:start-pos room)) + ((:scale-fn room) + (if has-start-pos? + start-pos + (:start-pos room))))))}] - (doseq [[k [start time fn]] (get-in entities [:room :timers])] - (add-timer! screen k start time)) - - (log/info "[done] Initializing scene.") + (doseq [[k [start time fn]] (get-in entities [:room :timers])] + (add-timer! screen k start time)) + + (log/info "[done] Initializing scene.") - (if-let [apply-state (get-in entities [:room :apply-state])] - (apply-state screen entities) - entities))))) + (if-let [apply-state (get-in entities [:room :apply-state])] + (apply-state screen entities) + entities)))) :on-resume (fn [screen {{:keys [current override last active was-active]} :cursor :as entities} options] (let [current (or override (get-selected-inventory-item) :main) @@ -1268,13 +1278,13 @@ void main () nil) :on-render - (fn [{:keys [^OrthographicCamera camera ^FitViewport viewport ^Stage renderer] :as screen} entities options] + (fn [{:keys [^OrthographicCamera camera ^FitViewport viewport ^Stage renderer] :as screen} {{:keys [last-pos]} :cursor :keys [tweens] :as entities} options] (steam/update) (.apply viewport) (if (get-in entities [:closing? :value]) - (let [entities (utils/apply-tweens screen entities (:tweens entities)) + (let [entities (utils/apply-tweens screen entities tweens) entities (update-current-sound-vols! entities) entities (remove-ended-sounds screen entities) get-rendered (partial get-rendered entities) @@ -1298,7 +1308,7 @@ void main () (render! screen [e]))) entities) (let [entities (fade-in-first-time-if-necessary screen entities) - entities (utils/apply-tweens screen entities (:tweens entities)) + entities (utils/apply-tweens screen entities tweens) entities (update-cursor screen entities) entities (start-script-if-necessary screen entities :fg-actions) entities (update-from-script screen entities :fg-actions) @@ -1306,6 +1316,13 @@ void main () entities (update-from-script screen entities :bg-actions) entities (update-from-room screen entities) entities (update-from-hotspots screen entities) + [last-pos-x last-pos-y] (utils/unproject screen nil last-pos) + last-pos-x (double last-pos-x) + last-pos-y (double last-pos-y) + + entities (update-in entities [:label] assoc + :x (unchecked-add last-pos-x 20.0) + :y (unchecked-subtract last-pos-y 12 )) entities (if (and (@utils/settings :camera-man? true) @@ -1349,6 +1366,7 @@ void main () (assoc-in entities [:room :entities] (persistent! room)))) layers (get-in entities [:room :current-layers]) all-entities (concat layers (vals (get-in entities [:room :entities])))] + (label! (:label entities) :set-text (get-in entities [:label :text])) (clear!) (screen! talking-screen :on-update-camera { :scene-viewport (:viewport screen) :scene-camera (:camera screen)}) (screen! fade-screen :update-fade { :opacity (get-in entities [:fade :opacity])}) @@ -1367,6 +1385,7 @@ void main () (if (:parallax e) (render-parallax screen e) (render! screen [e]))) + (render! screen [(:label entities)]) entities)))) @@ -1818,7 +1837,7 @@ void main () :mouse-in? (zone/box 278 0 320 42) :opacity 0.8) :all-items (texture! (texture (pixmap "cursor.png")) :split 18 16) - :fps (->> (assoc (label "" (color :white) ) :x 5 :baseline 0 :opacity 0.1) + #_#_:fps (->> (assoc (label "" (color :white) ) :x 5 :baseline 0 :opacity 0.1) (utils/add-actor-to-stage screen))})) :on-render @@ -1849,14 +1868,14 @@ void main () (grow-hud screen entities :save false))) entities (or (process-fsm screen entities) entities)] - (label! (:fps entities) :set-text (str (game :fps))) + #_(label! (:fps entities) :set-text (str (game :fps))) (render! screen [ (if (and hud-interactable? (not (:already-saved? entities))) (:save entities) (assoc (:save entities) :opacity 0.5)) - (:fps entities) + #_(:fps entities) (if hud-interactable? (:inventory entities) (assoc (:inventory entities) :opacity 0.5)) diff --git a/desktop/src-common/advent/utils.clj b/desktop/src-common/advent/utils.clj index 9ea40f06..a4ea57ff 100644 --- a/desktop/src-common/advent/utils.clj +++ b/desktop/src-common/advent/utils.clj @@ -47,6 +47,9 @@ (def ^:const +all-cursors+ [:main :wool :mushrooms :carrot :right :down :left :up :flask :flask-with-contents :trophy :ladder :stick :cat-toy :balloon :frog-legs :teddy :portrait :recipe :glass-eye :motivational-tapes :used-earplugs :grass :slobber :flask-with-strength :medal :kiss :sword :hourglass :mandrake :ball-n-chain :key :rope :crowbar :note-1 :ash :sack-lunch :flies :spear :monocle :feather :spell-component :money :charcoal :broken-clock :slingshot :camera :walkie-talkies :alarm-clock :walkie-talkie :flask-water :flask-water-stuff :flask-water-stuff-2 :note-2 :magic-slingshot :active-main :shovel :broom :tune :hand :hand-depressed :talk :talk-depressed :look :look-depressed]) +(def ^:const +cursor-hotspots+ {:look [8 8] + :look-depressed [8 8]}) + (def settings (atom {:music-volume 50.0 :sound-volume 75.0 :fullscreen true})) @@ -69,12 +72,15 @@ target-width (* 16 scale) target-height (* 16 scale) resized (Pixmap. target-width target-height (.getFormat base-cursor)) - index (.indexOf +all-cursors+ which)] + index (.indexOf +all-cursors+ which) + [hot-x hot-y] (+cursor-hotspots+ which [0 0]) + hot-x (int hot-x) + hot-y (int hot-y)] (Pixmap/setFilter Pixmap$Filter/NearestNeighbour) (pixmap! resized :draw-pixmap base-cursor (* index 18) 0 16 16 0 0 target-width target-height) - (graphics! :new-cursor resized 0 0 ))) + (graphics! :new-cursor resized (* hot-x scale) (* hot-y scale) ))) (defn get-texture [path] (let [atlas-name (str/replace path #".png" "") @@ -388,6 +394,7 @@ (first raw-pos) (last raw-pos))) hovering-ego (hovering-ego entities last-pos) current (get-in entities [:cursor :current]) + entities (assoc-in entities [:label :text] "") selected-inventory-item (@(resolve 'advent.screens.scene/get-selected-inventory-item))] (cond @@ -408,13 +415,19 @@ (assoc-in [:cursor :override] nil)) (and mouse-override (:only-script mouse-override)) - (assoc-in entities [:cursor :override] (:cursor mouse-override)) + (-> entities + (assoc-in [:cursor :override] (:cursor mouse-override)) + (assoc-in [:label :text] (:label mouse-override))) selected-inventory-item - (assoc-in entities [:cursor :override] selected-inventory-item) + (-> entities + (assoc-in [:cursor :override] selected-inventory-item) + (assoc-in [:label :text] (:label mouse-override))) mouse-override - (assoc-in entities [:cursor :override] (:cursor mouse-override)) + (-> entities + (assoc-in [:cursor :override] (:cursor mouse-override)) + (assoc-in [:label :text] (:label mouse-override))) :else (assoc-in entities [:cursor :override] :main))))