aboutsummaryrefslogtreecommitdiff
path: root/demo/tweens.scm
blob: 609c5418a2511750661b5fd58ca21b8e5fe1aede (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
(import scheme
        (chicken base)
        (only srfi-1 iota)
        (prefix sdl2 "sdl2:")
        (prefix sdl2-ttf "ttf:")
        downstroke-engine
        downstroke-world
        downstroke-renderer
        downstroke-entity)

;; ── 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))))

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

(game-run! *game*)