(import scheme (chicken base) (chicken process-context) (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-scene-loader) (define +debug?+ (and (member "--debug" (command-line-arguments)) #t)) (define (make-player) (list #:type 'player #:x 100 #:y 50 #:width 16 #:height 16 #:vx 0 #:vy 0 #:gravity? #t #:on-ground? #f #:tile-id 1 #:tags '(player))) (define (player-vx input) (cond ((input-held? input 'left) -3) ((input-held? input 'right) 3) (else 0))) (define (update-player player input) (let* ((jump? (and (input-pressed? input 'a) (entity-ref player #:on-ground? #f))) (player (entity-set player #:vx (player-vx input)))) (when jump? (play-sound 'jump)) (if jump? (entity-set player #:ay (- *jump-force*)) player))) (define *game* (make-game title: "Demo: Platformer" width: 600 height: 400 debug?: +debug?+ preload: (lambda (game) (init-audio!) (load-sounds! '((jump . "demo/assets/jump.wav")))) create: (lambda (game) (let* ((s0 (game-load-scene! game "demo/assets/level-0.tmx")) (s1 (scene-add-entity s0 (make-player))) (s2 (update-scene s1 camera-target: 'player))) (game-scene-set! game s2))) update: (lambda (game dt) (let* ((input (game-input game)) (scene (game-scene game)) (player (update-player (car (scene-entities scene)) input))) (game-scene-set! game (update-scene scene entities: (list player))))))) (game-run! *game*)