|
|
@ -9,6 +9,23 @@
|
|
|
|
(< (+ x w) (+ cx cw))
|
|
|
|
(< (+ x w) (+ cx cw))
|
|
|
|
(< (+ y h) (+ cy ch)))))
|
|
|
|
(< (+ y h) (+ cy ch)))))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(defn collide? [obj obj2]
|
|
|
|
|
|
|
|
(let [{:keys [x y w h]} obj
|
|
|
|
|
|
|
|
{ox :x oy :y ow :w oh :h} obj2]
|
|
|
|
|
|
|
|
(or
|
|
|
|
|
|
|
|
; top left corner
|
|
|
|
|
|
|
|
(and (>= x ox) (>= y oy)
|
|
|
|
|
|
|
|
(<= x (+ ox ow)) (<= y (+ oy oh)))
|
|
|
|
|
|
|
|
; top right corner
|
|
|
|
|
|
|
|
(and (>= (+ x h) ox) (>= y oy)
|
|
|
|
|
|
|
|
(<= (+ x h) (+ ox ow)) (<= y (+ oy oh)))
|
|
|
|
|
|
|
|
; bottom left corner
|
|
|
|
|
|
|
|
(and (>= x ox) (>= (+ y h) oy)
|
|
|
|
|
|
|
|
(<= x (+ ox ow)) (<= (+ y h) (+ oy oh)))
|
|
|
|
|
|
|
|
; bottom right corner
|
|
|
|
|
|
|
|
(and (>= (+ x w) ox) (>= (+ y h) oy)
|
|
|
|
|
|
|
|
(<= (+ x w) (+ ox ow)) (<= (+ y h) (+ oy oh))))))
|
|
|
|
|
|
|
|
|
|
|
|
(defn moved-object [obj pxs]
|
|
|
|
(defn moved-object [obj pxs]
|
|
|
|
(let [{:keys [x y d]} obj]
|
|
|
|
(let [{:keys [x y d]} obj]
|
|
|
|
(cond
|
|
|
|
(cond
|
|
|
@ -26,14 +43,24 @@
|
|
|
|
:y (+ y pxs))
|
|
|
|
:y (+ y pxs))
|
|
|
|
:else obj)))
|
|
|
|
:else obj)))
|
|
|
|
|
|
|
|
|
|
|
|
(defn bump-in-wall [obj container]
|
|
|
|
(defn bump-into [obj obj2]
|
|
|
|
|
|
|
|
(let [{:keys [x y w h d]} obj
|
|
|
|
|
|
|
|
{ox :x oy :y ow :w oh :h} obj2]
|
|
|
|
|
|
|
|
(case d
|
|
|
|
|
|
|
|
:w (assoc obj :x (+ ox ow 1))
|
|
|
|
|
|
|
|
:e (assoc obj :x (dec (- ox w)))
|
|
|
|
|
|
|
|
:n (assoc obj :y (+ oy oh 1))
|
|
|
|
|
|
|
|
:s (assoc obj :y (dec (- oy h)))
|
|
|
|
|
|
|
|
obj)))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(defn bump-inside-container [obj container]
|
|
|
|
(let [{:keys [x y w h d]} obj
|
|
|
|
(let [{:keys [x y w h d]} obj
|
|
|
|
{cx :x cy :y cw :w ch :h} container]
|
|
|
|
{cx :x cy :y cw :w ch :h} container]
|
|
|
|
(case d
|
|
|
|
(case d
|
|
|
|
:w (assoc obj :x (inc cx))
|
|
|
|
:w (assoc obj :x (inc cx))
|
|
|
|
:e (update obj :x #(- (+ cx cw) w 1))
|
|
|
|
:e (assoc obj :x (- (+ cx cw) w 1))
|
|
|
|
:n (assoc obj :y (inc cy))
|
|
|
|
:n (assoc obj :y (inc cy))
|
|
|
|
:s (update obj :y #(- (+ cy ch) h 1))
|
|
|
|
:s (assoc obj :y (- (+ cy ch) h 1))
|
|
|
|
:? obj)))
|
|
|
|
:? obj)))
|
|
|
|
|
|
|
|
|
|
|
|
(defn pps->px [gamestate obj]
|
|
|
|
(defn pps->px [gamestate obj]
|
|
|
@ -47,7 +74,7 @@
|
|
|
|
(let [moved (moved-object obj pxs)]
|
|
|
|
(let [moved (moved-object obj pxs)]
|
|
|
|
(if (in? moved container)
|
|
|
|
(if (in? moved container)
|
|
|
|
moved
|
|
|
|
moved
|
|
|
|
(bump-in-wall obj container))))
|
|
|
|
(bump-inside-container obj container))))
|
|
|
|
|
|
|
|
|
|
|
|
(defn move-inside-gamestate [gamestate obj]
|
|
|
|
(defn move-inside-gamestate [gamestate obj]
|
|
|
|
(let [pxs (pps->px gamestate obj)
|
|
|
|
(let [pxs (pps->px gamestate obj)
|
|
|
|