From c64189ebe56e8132282335fcb9cf5e48e5c3961e Mon Sep 17 00:00:00 2001 From: "Jakob L. Kreuze" Date: Wed, 24 Oct 2018 15:44:36 -0400 Subject: Reimplementing features from two commits back + fixes for significant graphical bugs --- camera.fnl | 45 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 4 deletions(-) (limited to 'camera.fnl') diff --git a/camera.fnl b/camera.fnl index ba8a435..b46142d 100644 --- a/camera.fnl +++ b/camera.fnl @@ -15,9 +15,46 @@ ;;;; You should have received a copy of the GNU General Public License along ;;;; with slime-the-world. If not, see . -;; Returns a new camera object initially focused at the given world coordinates, -;; (`x', `y'). -(fn new-camera [x y] - {:x-pos x :y-pos y}) +(local lume (require :lib.lume)) + +(local tile-sheet (. (require :world) :tile-sheet)) + +;; TODO: Document this +(fn focus-on-object [camera object dt] + (let [last-x (. camera :x-pos) + last-y (. camera :y-pos) + max-x (. camera :max-x) + max-y (. camera :max-y) + object-x (. object :x-pos) + object-y (. object :y-pos) + width (. object :width) + height (. object :height) + screen-width (. camera :screen-width) + screen-height (. camera :screen-height) + x-offset (math.floor (- (/ screen-width 2) (/ width 2))) + y-offset (math.floor (- (/ screen-height 2) (/ height 2))) + x (lume.lerp last-x (- object-x x-offset) (* 4 dt)) + x (lume.clamp x 0 max-x) + y (lume.lerp last-y (- object-y y-offset) (* 4 dt)) + y (lume.clamp y 0 max-y)] + (values x y))) + +;; Returns a new camera object, aware of the bounds of `world' and the camera +;; lock parameters entailed by the given screen dimensions. +(fn new-camera [world screen-width screen-height] + (let [tile-width (. tile-sheet :width) + tile-height (. tile-sheet :height) + max-x (- (* tile-width (. world :width)) screen-width) + max-y (- (* tile-height (. world :height)) screen-height)] + {:x-pos 0 + :y-pos 0 + + :screen-width screen-width + :screen-height screen-height + + :max-x max-x + :max-y max-y + + :focus-on-object focus-on-object})) {:new new-camera} -- cgit v1.3