summaryrefslogtreecommitdiff
path: root/camera.fnl
diff options
context:
space:
mode:
authorJakob L. Kreuze <jakob@memeware.net>2018-10-24 15:44:36 -0400
committerJakob L. Kreuze <jakob@memeware.net>2018-10-24 15:44:36 -0400
commitc64189ebe56e8132282335fcb9cf5e48e5c3961e (patch)
treef3246d419db035d559a36622a70def583456fe1e /camera.fnl
parentd2a4535049a9feccb611e6a7b80c872075de0b96 (diff)
Reimplementing features from two commits back + fixes for significant graphical bugs
Diffstat (limited to 'camera.fnl')
-rw-r--r--camera.fnl45
1 files changed, 41 insertions, 4 deletions
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 <http://www.gnu.org/licenses/>.
-;; 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}