From 4f1f881c0f81822e71560fd24e87493ef515d6de Mon Sep 17 00:00:00 2001 From: = Date: Mon, 8 Sep 2014 19:16:52 -0700 Subject: [PATCH] cursor overhaul. --- desktop/src-common/advent/screens/scene.clj | 57 ++++++++++++--------- 1 file changed, 34 insertions(+), 23 deletions(-) diff --git a/desktop/src-common/advent/screens/scene.clj b/desktop/src-common/advent/screens/scene.clj index 88bcd20c..ff511056 100644 --- a/desktop/src-common/advent/screens/scene.clj +++ b/desktop/src-common/advent/screens/scene.clj @@ -14,31 +14,39 @@ (def +screen-width+ 320) (def +screen-height+ 240) (def +num-cursors+ 4) -(def +next-cursor+ (into {} (map vector (range +num-cursors+) (drop 1 (cycle (range +num-cursors+)))))) +(def +next-cursor+ (into {} (map vector [:walk :touch :look :talk] (drop 1 (cycle [:walk :touch :look :talk]))))) +(def +all-cursors+ [:walk :touch :look :talk :right :down :left :up]) -(defn +next-cursor+ [x] - (first (drop 1 (drop-while #(not= x %) (cycle (range +num-cursors+)))))) +(def +cursor-defaults+ {:walk (fn [screen entities [x y]] + (assoc-in entities [:ego :actions] (actions/from-path screen entities :ego [x y]))) + :look (fn [screen entities _] + (assoc-in entities [:ego :actions] [(actions/stop :ego) + (actions/talk :ego "Looks pretty uninteresting to me.")])) + :touch (fn [screen entities _] + (assoc-in entities [:ego :actions] [(actions/stop :ego) + (actions/talk :ego "Can't do anything with it.")])) + :talk (fn [screen entities _] + (assoc-in entities [:ego :actions] [(actions/stop :ego) + (actions/talk :ego "It's not much of a conversationalist.")]))}) -(defn cursor [filename index] +(defn cursor [filename which] (let [scale 2 base-cursor (pixmap filename) target-width (* 16 scale) target-height (* 16 scale) - resized (Pixmap. target-width target-height (.getFormat base-cursor))] + resized (Pixmap. target-width target-height (.getFormat base-cursor)) + index (.indexOf +all-cursors+ which)] (Pixmap/setFilter Pixmap$Filter/NearestNeighbour) (pixmap! resized :draw-pixmap base-cursor (* index 16) 0 16 16 0 0 target-width target-height) resized )) (defn right-click [screen entities] - (let [entities (update-in entities [:cursor] #(assoc % :cursor-index (+next-cursor+ (:cursor-index %))))] - (input! :set-cursor-image (cursor "cursor.png" (get-in entities [:cursor :cursor-index])) 0 0) + (let [entities (update-in entities [:cursor] #(assoc % :current (+next-cursor+ (:current %))))] + (input! :set-cursor-image (cursor "cursor.png" (get-in entities [:cursor :current])) 0 0) entities)) -(defn walk-click [screen entities [x y]] - (assoc-in entities [:ego :actions] (actions/from-path screen entities :ego [x y]))) - (defn walk-override-click [screen entities [x y]] (let [target-location (->> (get-in entities [:background :mouse-overrides]) (filter #((:mouse-in? %) x y)) @@ -48,11 +56,14 @@ (defn left-click [screen entities] (let [{:keys [x y]} (input->screen screen {:x (:input-x screen) :y (:input-y screen)}) - interaction (first (filter #((:mouse-in? %) x y) (get-in entities [:background :interactions])))] + interaction (first (filter #((:mouse-in? %) x y) (get-in entities [:background :interactions]))) + current-cursor (get-in entities [:cursor :current]) + interaction-fn (when interaction + (interaction current-cursor))] (cond (get-in entities [:cursor :override]) (walk-override-click screen entities [x y]) - interaction ((:click-fn interaction) screen entities [x y]) - - :else (walk-click screen entities [x y])))) + (and interaction interaction-fn) (interaction-fn screen entities [x y]) + :else + ((+cursor-defaults+ current-cursor) screen entities [x y])))) (defn get-ego [screen] (let [player-sheet (texture! (texture "player.png") :split 18 36) @@ -92,7 +103,7 @@ (fn [screen entities] (update! screen :renderer (stage) :camera (orthographic)) (let [ - _ (input! :set-cursor-image (cursor "cursor.png" 0) 0 0) + _ (input! :set-cursor-image (cursor "cursor.png" :walk) 0 0) background (texture "bg5.png") background-trees (texture "background-trees.png") house (texture "house.png") @@ -101,23 +112,23 @@ ;; _ (sound! music :loop) ] { - :cursor {:id "cursor" :cursor-index 0 } + :cursor {:id "cursor" :current :walk } :background (assoc {} :collision (advent.pathfind/map-from-resource "pathfind-test-big.png") :baseline 0 :mouse-overrides [{:mouse-in? (zone/box 300 131 320 224) - :cursor-override 4 + :cursor-override :right :go-to [319 160]} {:mouse-in? (zone/box 60 180 224 240) - :cursor-override 7 + :cursor-override :up :go-to [137 204]} {:mouse-in? (zone/box 0 40 20 140) - :cursor-override 6 + :cursor-override :left :go-to [0 80]}] :interactions [{:mouse-in? (zone/box 258 100 281 160) - :click-fn (fn [screen entities [x y]] - (assoc-in entities [:ego :actions] [(actions/stop :ego) - (actions/talk :ego (str "The last time I went through that door, Fangald turned me into a frog."))]))}] + :look (fn [screen entities [x y]] + (assoc-in entities [:ego :actions] [(actions/stop :ego) + (actions/talk :ego (str "The last time I went through that door, Fangald turned me into a frog."))]))}] :scale-fn (scaler-fn-with-baseline 110 0.10 1.00) :layers [(assoc background :x 0 :y 0 :baseline 0) (assoc house :x 0 :y 0 :baseline 122) @@ -150,7 +161,7 @@ (assoc-in entities [:cursor :override] true))) (when (get-in entities [:cursor :override]) - (do (input! :set-cursor-image (cursor "cursor.png" (get-in entities [:cursor :cursor-index])) 0 0) + (do (input! :set-cursor-image (cursor "cursor.png" (get-in entities [:cursor :current])) 0 0) (assoc-in entities [:cursor :override] false)))))) :on-touch-down (fn [screen [entities]]