diff --git a/desktop/resources/cursor.png b/desktop/resources/cursor.png index 0c56ca30..a2f14807 100644 Binary files a/desktop/resources/cursor.png and b/desktop/resources/cursor.png differ diff --git a/desktop/src-common/advent/core.clj b/desktop/src-common/advent/core.clj index 5c626533..63e52f68 100644 --- a/desktop/src-common/advent/core.clj +++ b/desktop/src-common/advent/core.clj @@ -9,6 +9,11 @@ (def scale 4) (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+)))))) + +(defn +next-cursor+ [x] + (first (drop 1 (drop-while #(not= x %) (cycle (range +num-cursors+)))))) (defn cursor [filename index] (let [base-cursor (pixmap filename) @@ -17,68 +22,72 @@ resized (Pixmap. target-width target-height (.getFormat base-cursor))] (Pixmap/setFilter Pixmap$Filter/NearestNeighbour) (pixmap! resized :draw-pixmap base-cursor (* index 16) 0 16 16 - 0 0 target-width target-height) + 0 0 target-width target-height) resized )) (defn right-click [screen entities] - (if (= (button-code :right) (:button screen)) - (for [entity entities] - (if (= (:id entity) "cursor") - (let [entity (assoc entity :cursor-index (case (:cursor-index entity) - 0 1 - 1 0))] - (input! :set-cursor-image (cursor "cursor.png" (:cursor-index entity)) 0 0 ) - entity) - entity)))) + (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 ) + entities)) +(defn left-click [screen entities] + (let [{:keys [x y]} (input->screen screen {:x (:input-x screen) :y (:input-y screen)})] + (assoc-in entities [:ego :target] {:x x :y y}))) + +(defn get-ego [screen] + (let [player-sheet (texture! (texture "player.png") :split 18 36) + ego {:right (animation 0.075 (for [i (range 8)] + (texture (aget player-sheet 0 i)))) + :left (animation 0.075 (for [i (range 8)] + (texture (aget player-sheet 1 i)))) + :anim (animation 0.075 (for [i (range 8)] + (texture (aget player-sheet 0 i)))) + :x 100 :y 75 :x-velocity 1 + :id "ego"}] + (merge (animation->texture screen (:anim ego)) ego))) + +(defn update-ego [screen entities ego] + + (let [ego (merge ego (animation->texture screen (:anim ego))) + target (:target ego)] + (if target + (let [delta-x (- (:x target) (:x ego)) + delta-y (- (:y target) (:y ego)) + mag (Math/sqrt (+ (* delta-x delta-x) (* delta-y delta-y))) + vector-x (* 2 (/ delta-x mag)) + vector-y (* 2 (/ delta-y mag))] + (if (< mag 1) + (dissoc ego :target) + (-> ego + (update-in [:x] #(+ % vector-x)) + (update-in [:y] #(+ % vector-y))))) + + ego))) (defscreen main-screen :on-show (fn [screen entities] (update! screen :renderer (stage) :camera (orthographic)) - (let [player-sheet (texture! (texture "player.png") :split 18 36) + (let [ _ (input! :set-cursor-image (cursor "cursor.png" 0) 0 0) background (texture "bg5.png")] - [{:id "cursor" :cursor-index 0} - (assoc background :origin-y 0 :origin-x 0 :ego? false :x 0 :y 0 :scale-x 1 :scale-y 1) - {:right (animation 0.075 (for [i (range 8)] - (texture (aget player-sheet 0 i)))) - :left (animation 0.075 (for [i (range 8)] - (texture (aget player-sheet 1 i)))) - :anim (animation 0.075 (for [i (range 8)] - (texture (aget player-sheet 0 i)))) - :x 0 :y 75 :origin-x 0 :origin-y 0 :x-velocity 1 - :ego? true}])) + {:cursor {:id "cursor" :cursor-index 0} + :background (assoc background :origin-y 0 :origin-x 0 :id "background" :x 0 :y 0 :scale-x 1 :scale-y 1) + :ego (get-ego screen)})) :on-render - (fn [screen entities] + (fn [screen [entities]] (clear!) - (render! screen (for [entity entities] - (if (:ego? entity) - (merge (animation->texture screen (:anim entity)) - {:ego? (:ego? entity) :x (+ (:x entity) (:x-velocity entity)) :y 75 :origin-x 0 :origin-y 0 :anim (:anim entity) :x-velocity (:x-velocity entity) :left (:left entity) :right (:right entity)} - (when (> (:x entity) (width screen)) - {:x-velocity -1 :anim (:left entity)}) - (when (< (:x entity) 0) - {:x-velocity 1 :anim (:right entity)})) - - entity)))) + (let [entities (assoc entities :ego (update-ego screen entities (:ego entities)))] + (render! screen (vals entities)) + entities)) :on-resize (fn [screen entities] (size! screen 320 240)) - #_:on-mouse-moved #_(fn [screen entities] - (for [entity entities] - (if (= (:id entity) "cursor") - (let [{:keys [x y]} (input->screen screen (min +screen-width+ (max 0 (:input-x screen))) (max 0 (min +screen-height+ (:input-y screen))))] - (assoc entity :x x :y y)) - entity))) - :on-touch-down (fn [screen entities] - (right-click screen entities)) - - #_:on-scrolled - #_(fn [screen entities] - (set! (. (:camera screen) zoom) (min 1.5 (max (+ (.zoom (:camera screen)) (* 0.01 (:amount screen))) 1))) - nil)) + :on-touch-down (fn [screen [entities]] + (if (= (button-code :right) (:button screen)) + (right-click screen entities) + (left-click screen entities)))) (defgame advent :on-create