(import scheme (chicken base) (only srfi-1 iota) (prefix sdl2 "sdl2:") (prefix sdl2-ttf "ttf:") downstroke-engine downstroke-world downstroke-renderer downstroke-entity downstroke-tween) ;; ── Constants ──────────────────────────────────────────────────────────────── (define +ease-duration+ 2600) (define +ease-syms+ '(linear quad-in quad-out quad-in-out cubic-in cubic-out cubic-in-out sine-in-out expo-in expo-out expo-in-out back-out)) (define +ease-colors+ '((220 90 90) (240 140 60) (240 200 60) (180 220 70) ( 80 200 120) ( 70 180 200) (100 140 240) (160 100 220) (220 80 180) (100 100 110) (140 180 200) (200 120 80))) ;; ── State ──────────────────────────────────────────────────────────────────── (define *label-font* #f) (define *title-font* #f) ;; ── Ease grid ──────────────────────────────────────────────────────────────── (define (make-ease-entity ease-sym y rgb) (let* ((left 20) (right (+ left 120)) (base (list #:x left #:y y))) (list #:type 'tween-demo #:x left #:y y #:width 14 #:height 14 #:vx 0 #:vy 0 #:gravity? #f #:solid? #f #:color rgb #:ease-name ease-sym #:tween (make-tween base props: `((#:x . ,right)) duration: +ease-duration+ ease: ease-sym repeat: -1 yoyo?: #t)))) ;; ── Rendering ──────────────────────────────────────────────────────────────── (define (draw-ease-labels! renderer entities) (let ((white (sdl2:make-color 255 255 255 255))) (draw-ui-text renderer *title-font* "Tween demo - easing curves" white 12 6) (draw-ui-text renderer *label-font* "Each box ping-pongs with repeat: -1 yoyo?: #t" white 12 32) (for-each (lambda (e) (let ((name (entity-ref e #:ease-name #f))) (when name (draw-ui-text renderer *label-font* (symbol->string name) white 158 (- (entity-ref e #:y 0) 2))))) entities))) ;; ── Game ───────────────────────────────────────────────────────────────────── (define *game* (make-game title: "Demo: Tweens" width: 640 height: 480 preload: (lambda (_game) (set! *title-font* (ttf:open-font "demo/assets/DejaVuSans.ttf" 22)) (set! *label-font* (ttf:open-font "demo/assets/DejaVuSans.ttf" 13))) create: (lambda (game) (game-scene-set! game (make-scene entities: (map (lambda (ease i) (make-ease-entity ease (+ 52 (* i 20)) (list-ref +ease-colors+ i))) +ease-syms+ (iota (length +ease-syms+))) tilemap: #f camera: (make-camera x: 0 y: 0) tileset-texture: #f camera-target: #f background: '(26 28 34)))) update: (lambda (game dt) (game-scene-set! game (scene-update-entities (game-scene game) (cut step-tweens <> dt)))) render: (lambda (game) (draw-ease-labels! (game-renderer game) (scene-entities (game-scene game)))))) (game-run! *game*)