siam-farmer/src/sprite_atlas.clj

78 lines
2.4 KiB
Clojure

(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"))
:-)