You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

85 lines
2.2 KiB

(ns topdown2d.demoscene
(:require
[topdown2d.collision :as collision]
[topdown2d.input :as input]
[topdown2d.sprites :as sprites]))
(defn init [gamestate scenedata]
(assoc scenedata
:data {
:player {
:x (- (/ (get-in gamestate [:dimensions :w]) 2) 32)
:y (- (/ (get-in gamestate [:dimensions :h]) 2) 32)
:w 64 :h 64
:d :?
:sprite {
:image (.getElementById js/document "demo-player")
:size 64
:d :s
:rows {
:w 1 :e 3
:n 0 :s 2
:? 2
}
:cycle {
:pos 0
:from 1 :count 8
:last-cycle 0
; seconds per cycle
:spc 0.08
}
}
}
:viewport {
:image (.getElementById js/document "demo-background")
:keep-in {
:x 0 :y 0
:w 2239 :h 2235
}
:x 1 :y 1
:d :?
:pps 350
:w (get-in gamestate [:dimensions :w])
:h (get-in gamestate [:dimensions :h])
}
}))
(defn update-player [gamestate player dir]
(let [player-dir (get-in player [:sprite :d])
sprite-dir (if (= :? dir) player-dir dir)]
(as-> player p
(assoc-in p
[:sprite :d]
sprite-dir)
(if-not (= :? dir)
(sprites/proc-cycle gamestate p)
p))))
(defn update-viewport [gamestate viewport dir]
(collision/move-inside
(assoc viewport :d dir)
(:keep-in viewport)
(collision/pps->px gamestate viewport)))
(defn update-scene [gamestate scenedata]
(let [player (get-in scenedata [:data :player])
viewport (get-in scenedata [:data :viewport])
dir (input/dirinput)]
(-> scenedata
(assoc-in [:data :player]
(update-player gamestate player dir))
(assoc-in [:data :viewport]
(update-viewport gamestate viewport dir)))))
(defn draw-scene [gamestate scenedata]
(let [viewport (get-in scenedata [:data :viewport])
{:keys [x y w h background]} viewport]
(.drawImage
(:ctx gamestate)
(:image viewport)
x y w h
0 0 w h))
(sprites/draw
gamestate
(get-in scenedata [:data :player])))