(ns sprite-atlas (:require [clojure.java.io :as io] [engine] [rl :as rl])) (defonce state (atom {})) (defn init-sprite-atlas [config] (let [path (:sprite-path @state)] (if (.exists (io/file path)) {:atlas (rl/load-texture path)} {}))) (defn handle-sprite-atlas-input [_ game] (cond-> game (rl/mouse-button-pressed? rl/mouse-button-left) (assoc :drag-start (rl/get-mouse-position)) (rl/mouse-button-released? rl/mouse-button-left) (assoc :event-drag-ended true) :always (as-> g (cond-> g (contains? g :drag-start) (assoc :current-mouse-pos (rl/get-mouse-position)))))) (defn- get-selection-rect [{ax :x ay :y} {bx :x by :y}] (let [start-x (min ax bx) start-y (min ay by) end-x (max ax bx) end-y (max ay by)] {:x start-x :y start-y :w (- end-x start-x) :h (- end-y start-y)})) (defn update-sprite-atlas [_ game] (cond-> game (contains? game :event-drag-ended) (-> (assoc :selected-sprite (get-selection-rect (:drag-start game) (:current-mouse-pos game))) (dissoc :event-drag-ended :drag-start :current-mouse-pos)))) (defn draw-sprite-atlas [_ {:keys [atlas drag-start current-mouse-pos selected-sprite]}] (rl/clear-background!* rl/black) (when atlas (rl/draw-texture!* (:seg atlas) 0 0 rl/white) (when drag-start (let [start-x (:x drag-start) start-y (:y drag-start) end-x (:x current-mouse-pos) end-y (:y current-mouse-pos)] (rl/draw-rectangle-lines!* start-x start-y (- end-x start-x) (- end-y start-y) rl/white))) (when selected-sprite (let [{:keys [x y w h]} selected-sprite] (rl/draw-texture-rec!* (:seg atlas) (rl/rect-seg x y w h) (rl/vec2-seg 30 30) rl/white))) (rl/draw-fps 10 10))) (defn watch-sprite-atlas [config game] {}) (defn unload-sprite-atlas [game] (rl/unload-texture! (:atlas game))) (defn -main [& sprite-path] (swap! state assoc :sprite-path (first sprite-path)) (engine/run-game! {:title "Sprite Atlas" :width 1280 :height 900 :init #'init-sprite-atlas :input #'handle-sprite-atlas-input :update #'update-sprite-atlas :draw #'draw-sprite-atlas :unload #'unload-sprite-atlas :watch-fn #'watch-sprite-atlas})) (comment (future (-main "./source-assets/thai_village.png")) :-)