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 /player.fnl | |
| parent | d2a4535049a9feccb611e6a7b80c872075de0b96 (diff) | |
Reimplementing features from two commits back + fixes for significant graphical bugs
Diffstat (limited to 'player.fnl')
| -rw-r--r-- | player.fnl | 61 |
1 files changed, 56 insertions, 5 deletions
@@ -15,23 +15,65 @@ ;;;; 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/>. +(local lume (require :lib.lume)) + (local draw (require :draw)) +(local gravity 128) + +;; Returns a pair, (x, y) that represents the player's next position, assuming +;; that it did /not/ collide with anything. The role of collision detection, and +;; further, setting the player's position, is on the world. +(fn next-position [player dt] + (let [x (+ (. player :x-pos) (* dt (. player :x-vel))) + y (+ (. player :y-pos) (* dt (. player :y-vel)))] + (values x y))) + +(fn next-x-vel [player dt] + (let [last-x-vel (. player :x-vel) + moving-right (. player :action :right) + moving-left (. player :action :left) + abs-x-vel (. player :goal-x-vel) + goal-x-vel (if moving-right abs-x-vel moving-left (- abs-x-vel) 0)] + (lume.lerp last-x-vel goal-x-vel dt))) + +(fn next-y-vel [player dt] + (let [last-y-vel (. player :y-vel) + jumping (. player :action :jump) + grounded (. player :grounded) + jumping-y-vel (- last-y-vel (. player :goal-y-vel))] + (if (and jumping grounded) jumping-y-vel + grounded 0 + :else (+ (. player :y-vel) (* gravity dt))))) + +(fn impact-bottom [player] + (tset player :grounded true)) + +(fn impact-top [player]) + +(fn impact-left [player]) + +(fn impact-right [player]) + (fn move-right [player] (tset player :orientation :right) (tset player :action :right true) (tset player :action :left false) (tset player :x-vel (/ (. player :x-vel) 2))) +(fn stop-right [player] + (tset player :action :right false) + (tset player :x-vel (/ (. player :x-vel) 2))) + (fn move-left [player] (tset player :orientation :left) (tset player :action :left true) (tset player :action :right false) (tset player :x-vel (/ (. player :x-vel) 2))) -(fn position-at [player x y] - (tset player :x-pos x) - (tset player :y-pos y)) +(fn stop-left [player] + (tset player :action :left false) + (tset player :x-vel (/ (. player :x-vel) 2))) (local player-sheet {:img (love.graphics.newImage "art/swanky.png") @@ -40,7 +82,8 @@ :padding-x 8 :padding-y 10}) (fn draw-player [player x y] - (draw.tile x y player-sheet 0 0)) + (let [x-offset (if (= (. player :orientation) :left) 4 0)] + (draw.tile x y player-sheet x-offset 0))) ;; Returns a new player object. (fn new-player [] @@ -67,9 +110,17 @@ :right false :left false} - :position-at position-at + :next-position next-position + :next-x-vel next-x-vel + :next-y-vel next-y-vel + :impact-bottom impact-bottom + :impact-top impact-top + :impact-left impact-left + :impact-right impact-right :move-right move-right + :stop-right stop-right :move-left move-left + :stop-left stop-left :draw draw-player}) |