aboutsummaryrefslogtreecommitdiff
path: root/demo/tweens.scm
blob: b56676e0bc942e10c4b582fd736ba24278368eb1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
(import scheme
        (chicken base)
        (only srfi-1 iota)
        (only (list-utils alist) plist->alist)
        (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  (plist->alist (list #:x left #:y y))))
    (plist->alist
     (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))))

   render: (lambda (game)
             (draw-ease-labels! (game-renderer game)
                                (scene-entities (game-scene game))))))

(game-run! *game*)