diff options
| author | Jakob L. Kreuze <jakob@memeware.net> | 2018-10-24 15:44:36 -0400 |
|---|---|---|
| committer | Jakob L. Kreuze <jakob@memeware.net> | 2018-10-24 15:44:36 -0400 |
| commit | c64189ebe56e8132282335fcb9cf5e48e5c3961e (patch) | |
| tree | f3246d419db035d559a36622a70def583456fe1e /camera.fnl | |
| parent | d2a4535049a9feccb611e6a7b80c872075de0b96 (diff) | |
Reimplementing features from two commits back + fixes for significant graphical bugs
Diffstat (limited to 'camera.fnl')
| -rw-r--r-- | camera.fnl | 45 |
1 files changed, 41 insertions, 4 deletions
@@ -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} |