cursor overhaul.
This commit is contained in:
@@ -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]]
|
||||
|
||||
Reference in New Issue
Block a user