From 9d12bc549c7b39bb32b05e6947872d65c255795e Mon Sep 17 00:00:00 2001 From: Bryce Covert Date: Wed, 16 Nov 2016 08:43:17 -0800 Subject: [PATCH] dialogue thing looks nice. --- .../src-common/advent/screens/dialogue.clj | 71 +++++++++++++++++++ desktop/src-common/advent/screens/scene.clj | 65 ++++------------- desktop/src-common/advent/screens/title.clj | 2 +- desktop/src-common/advent/utils.clj | 9 ++- 4 files changed, 92 insertions(+), 55 deletions(-) diff --git a/desktop/src-common/advent/screens/dialogue.clj b/desktop/src-common/advent/screens/dialogue.clj index ca5c8b8f..c7eae4f3 100644 --- a/desktop/src-common/advent/screens/dialogue.clj +++ b/desktop/src-common/advent/screens/dialogue.clj @@ -258,3 +258,74 @@ :on-resize (fn [{:keys [^FitViewport viewport]} entities {:keys [width height]}] (.update viewport width height))) + + +(defscreen tooltip-screen + :on-show + (fn [screen entities options] + (let [screen (utils/setup-viewport screen 1280 960)] + (let [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 (* utils/ui-scale 0.25)))))] + {:label (as-> (label "" style) l + (do (label! l :set-alignment (if utils/mobile? Align/bottomLeft Align/center)) + l) + (assoc l :x 0 :y 0 :baseline 10000) + (utils/add-actor-to-stage screen l)) + :all-icons (texture! (texture (pixmap "cursor.png")) :split 18 16) + :action-icon nil}))) + + :on-render + (fn [{:keys [camera ^FitViewport viewport] :as screen} entities options] + (.apply viewport) + (render! screen [(:label entities) (:action-icon entities)]) + entities) + + :on-hover-start + (fn [screen {:keys [all-icons] :as entities} {:keys [hover-text x y scene-viewport cursor ]}] + (let [x (if utils/mobile? x (+ 8 x)) + [scene-x scene-y] (scene-world->talk-world scene-viewport [x y]) + depressed? (< 0.5 (- (or (:total-time screen) 0) (int (or (:total-time screen) 0))))] + (label! (get-in entities [:label]) :set-text hover-text) + (cond-> entities + true (assoc-in [:label :text] hover-text) + + utils/mobile? (update-in [:label] assoc :x (* 20 4) :y 12) + + (and utils/mobile? (or (:cursor (first (:last cursor))) (first (:last cursor)))) + (assoc-in [:action-icon] + (assoc + (texture (aget all-icons 0 (.indexOf utils/+all-cursors+ (or (:cursor (first (:last cursor))) (utils/translate-depressed (first (:last cursor)) + depressed?))))) + :x 4 :y 4 + :width (* 18 4) :height (* 16 4))) + + (not utils/mobile?) (update-in [:label] assoc :x scene-x :y scene-y) + + true (update-in [:label] ensure-on-screen)))) + + #_#_:on-update-camera + (fn [{:keys [^FitViewport viewport] :as screen} entities {:keys [scene-viewport scene-camera]}] + (reduce-kv (fn [entities id e] + (if (:id e) + (let [[x y] (scene-world->talk-world scene-viewport [(:source-x e) + (:source-y e)])] + (-> entities + (assoc-in [id :x] (- x (/ (label! e :get-width) 2))) + (assoc-in [id :y] y) + (update-in [id] ensure-on-screen))) + entities)) + entities + entities)) + + #_#_:on-hover-end + (fn [screen entities {:keys [id]}] + (utils/remove-actor-from-stage entities (or id :fg-actions)) + (dissoc entities (or id :fg-actions))) + + + :on-resize (fn [{:keys [^FitViewport viewport]} entities {:keys [width height]}] + (.update viewport width height))) diff --git a/desktop/src-common/advent/screens/scene.clj b/desktop/src-common/advent/screens/scene.clj index 68fd4dd7..6e0e53c1 100644 --- a/desktop/src-common/advent/screens/scene.clj +++ b/desktop/src-common/advent/screens/scene.clj @@ -37,7 +37,7 @@ [advent.screens.rooms.space :as rooms.space] [advent.screens.rooms.held :as rooms.held] [advent.screens.rooms.cat-tree :as rooms.cat-tree] - [advent.screens.dialogue :refer [talking-screen toast-screen]] + [advent.screens.dialogue :refer [talking-screen toast-screen tooltip-screen]] [advent.screens.inventory :refer [inventory-screen]] [clojure.core.async :refer [put! ! chan go thread take! alts!! poll! dropping-buffer]]) (:import [com.badlogic.gdx.graphics Pixmap$Format Pixmap Pixmap$Filter Texture Texture$TextureFilter GL20 GL30] @@ -893,12 +893,7 @@ void main () entities) entities)) -(defn translate-depressed [cursor depressed?] - (if depressed? - (get {:hand :hand-depressed - :talk :talk-depressed - :look :look-depressed} cursor cursor) - cursor)) + (defn update-cursor [{:keys [total-time] :as screen} {{:keys [override last depressed? time-changed] :or {time-changed 0}} :cursor :as entities}] (let [new-current (or override (get-selected-inventory-item) :main) @@ -917,7 +912,7 @@ void main () :else (do (graphics! :set-cursor (utils/cursor "cursor.png" - (translate-depressed (or (:cursor new-current) new-current) + (utils/translate-depressed (or (:cursor new-current) new-current) depressed?))) (update-in entities [:cursor ] assoc :last [new-current depressed?] @@ -1163,12 +1158,6 @@ void main () 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 (* utils/ui-scale 0.0625))))) _ (update! screen :shader shader) rooms {:inside-house (rooms.inside-house/make screen) @@ -1249,14 +1238,6 @@ void main () :value 0.0} :music-override {:object nil :value nil} - :label (as-> (label "Sheep" style :set-alignment Align/center) l - (if utils/mobile? - (do l (label! l :set-alignment Align/bottomLeft) - l) - (do (label! l :set-alignment Align/center) - l)) - (assoc l :x 0 :y 0 :baseline 10000) - (utils/add-actor-to-stage screen l)) :cursor {:id "cursor" :last nil :override :hourglass @@ -1341,34 +1322,6 @@ void main () [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 (cond-> entities - (not utils/mobile?) (update-in [:label] assoc - :x (unchecked-subtract last-pos-x - cursor-offset-x) - :y (unchecked-add (unchecked-subtract last-pos-y 24 ) - cursor-offset-y)) - utils/mobile? (update-in [:label] - (fn [l] - (let [[x y] (utils/unproject screen options [(.getScreenX (:viewport screen)) (.getScreenHeight (:viewport screen))])] - (assoc l :x (unchecked-add 25 x) :y (unchecked-add 3 y))))) - - (not utils/mobile?) (update-in [:label] ensure-on-screen)) - - entities (cond-> entities - utils/mobile? (update-in [:action-icon] (fn [ai] - (let [all-items (texture! (texture (pixmap "cursor.png")) :split 18 16) - [x y] (utils/unproject screen options [(.getScreenX (:viewport screen)) (.getScreenHeight (:viewport screen))])] - (try - - (assoc - (texture (aget all-items 0 (.indexOf utils/+all-cursors+ (or (:cursor (first (:last (:cursor entities)))) (first (:last (:cursor entities))))))) - :x x :y (unchecked-add 1 y) - :baseline 9000) - (catch Exception e nil) - ))))) - - entities (if (and (@utils/settings :camera-man? true) (not (get-in entities [:cam :paused?])) (nil? (get-in entities [:tweens :cam-x])) @@ -1410,7 +1363,15 @@ 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])) + + (screen! tooltip-screen :on-hover-start {:hover-text (get-in entities [:label :text]) + :scene-viewport (:viewport screen) + :cursor (:cursor entities) + :x (unchecked-subtract last-pos-x + cursor-offset-x) + :y (unchecked-add (unchecked-subtract last-pos-y 16 ) + cursor-offset-y)}) + (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])}) @@ -1429,8 +1390,6 @@ void main () (if (:parallax e) (render-parallax screen e) (render! screen [e]))) - (render! screen [(:label entities) (:action-icon entities)]) - entities)))) diff --git a/desktop/src-common/advent/screens/title.clj b/desktop/src-common/advent/screens/title.clj index 60d8f0a9..83ae664a 100644 --- a/desktop/src-common/advent/screens/title.clj +++ b/desktop/src-common/advent/screens/title.clj @@ -124,7 +124,7 @@ :finish (fn [entities] (utils/stop-music (:music entities)) (reset! utils/selected-save save) - (set-screen! @(resolve 'advent.core/advent) scene/scene #_scene/demo scene/hud dialogue/talking-screen dialogue/choice-screen dialogue/toast-screen inventory/inventory-screen safe/safe-screen fade/fade-screen + (set-screen! @(resolve 'advent.core/advent) scene/scene #_scene/demo scene/hud dialogue/tooltip-screen dialogue/talking-screen dialogue/choice-screen dialogue/toast-screen inventory/inventory-screen safe/safe-screen fade/fade-screen ) entities) :ease tween/ease-in-cubic)) diff --git a/desktop/src-common/advent/utils.clj b/desktop/src-common/advent/utils.clj index 090dde16..9e71ffec 100644 --- a/desktop/src-common/advent/utils.clj +++ b/desktop/src-common/advent/utils.clj @@ -30,7 +30,7 @@ entity) -(def ui-scale 1.5) +(def ui-scale 1.0) (def mobile? (= 1.5 ui-scale)) (defn clear-stage [{:keys [^Stage renderer]}] @@ -650,3 +650,10 @@ (defn stop-all-sounds! [entities] (doseq [snd (get-in entities [:current-sounds :value])] (sound! (:sound snd) :stop (:id snd)))) + +(defn translate-depressed [cursor depressed?] + (if depressed? + (get {:hand :hand-depressed + :talk :talk-depressed + :look :look-depressed} cursor cursor) + cursor))