(import scheme (chicken base) (chicken process-context) (srfi 197) (only (list-utils alist) plist->alist) (prefix sdl2 "sdl2:") (prefix sdl2-ttf "ttf:") (prefix sdl2-image "img:") (downstroke engine) (downstroke world) (downstroke input) (downstroke physics) (downstroke assets) (downstroke entity) (downstroke sound) (downstroke tween) (downstroke scene-loader)) (define +debug?+ (and (member "--debug" (command-line-arguments)) #t)) ;; Momentum, number of pixels/s a movement accelerates after pressing/release (define +horizontal-momentum+ 0.01) (define +wind-force+ 0.1) (define +max-leaf-speed+ 3) (set! *gravity* 0.1) (define (make-leaf) (plist->alist (list #:type 'leaf #:x 100 #:y 200 #:width 32 #:height 32 #:ax 0 #:ay 0 #:vx 0 #:vy 0 #:gravity? #t #:on-ground? #f #:tile-id 41 #:tags '(leaf) ;; #:tween (make-tween '((#:x . 100) (#:y . 200)) ;; props: '((#:x . 120)) ;; duration: 500 ;; ease: 'linear ;; repeat: -1 ;; yoyo?: #t) ))) (define (clamp value maximum . args) (let ((minimum (if (null? args) (- maximum) (car args)))) (max (min value maximum) minimum))) (define (leaf-ax vx input) (cond ((input-held? input 'left) (- +wind-force+)) ((input-held? input 'right) +wind-force+) ((> vx 0.1) (- +horizontal-momentum+)) ((< vx -0.1) +horizontal-momentum+) (else 0))) (define (update-leaf leaf input dt) (let ((ax (leaf-ax (entity-ref leaf #:vx) input))) (chain leaf (entity-set _ #:vx (clamp (+ (entity-ref leaf #:vx) (* ax dt)) +max-leaf-speed+)) ;; Clamp gravity (entity-set _ #:vy (clamp (entity-ref leaf #:vy) +max-leaf-speed+))))) (define (scene-get-leaf scene) ;; leaf is being added as the first entity in the scene, so we can cheat here. (car (scene-entities scene))) (define *game* (make-game title: "Free Fall" width: 320 height: 240 debug?: +debug?+ scale: 2 preload: (lambda (game) game) create: (lambda (game) (game-scene-set! game (chain (game-load-scene! game "level0.tmx") (scene-add-entity _ (make-leaf)) (update-scene _ camera-target: 'leaf) (update-scene _ background: '(173 216 230 255))))) update: (lambda (game dt) (let* ((input (game-input game)) (scene (game-scene game)) (leaf (update-leaf (scene-get-leaf scene) input dt))) (game-scene-set! game (update-scene scene entities: (list leaf))))))) ;; (game-run! *game*)