summaryrefslogtreecommitdiff
path: root/README.md
blob: 0d2b140346fea3eee5fa03e478e98081ee339075 (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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106

# Animise

*General purpose tweens and easing*

Animise is a small library that you may use to orchestrate any
time-varying numerical values. While animise is intended to be used as
a general purpose
[tweening](https://en.wikipedia.org/wiki/Inbetweening) solution for
your Common Lisp projects, you could use it for other purposes as well
(e.g. modulating audio signals).

As a taste of the animise language, here is a snip from an example
that animates a box with SDL2:

NOTE: These gifs are jumpier looking than the "real thing" - my gif
recorder makes chopy gifs I guess :(


    ;; ... snip
    
    (let* ((rect (sdl2:make-rect 0 0 100 100))
           (color (list 255 0 0 255))
        
      (anim 
        (sequencing (:loop-mode :looping :targeting rect)
          (pausing :for 200 :at (sdl2:get-ticks))
          (grouping (:for 1200)
            (animating :the 'cadddr :of color :to 0)
            (animating :the 'sdl2:rect-x :to 400 :by :quading-out)
            (animating :the 'sdl2:rect-y :to 300 :by :bouncing-out))
          (grouping (:for 1000)
            (animating  :the 'cadddr :of color :to 255)
            (animating :the 'sdl2:rect-x :to 0 :by #'elastic-out))
            (animating :the 'sdl2:rect-y :to 0 :for 800 :by :cubic-in-out))))

    ;; ... end snip

And here is what the above looks like

![Animise Example](.images/animise-eg-3.gif)


## More Examples

### Animating a few distinct properties at different "rates"

![Animise Example](.images/eg1.gif)



     (let* ((rect (sdl2:make-rect 0 0 100 100))
            (dur 2200)
            (dur/3 (round (/ dur 3)))
            (anim
              (sequencing (:loop-mode :looping :targeting rect :at (sdl2:get-ticks))
                (grouping (:for dur)
                  (animating :by :springing-out  :the 'sdl2:rect-x :to 500)
                  (animating :by :quading-out :the 'sdl2:rect-height :to 20)
                  (animating :by :quading-out :the 'sdl2:rect-width :to 20))
                (grouping (:for dur)
                  (animating :by :quading-out :the 'sdl2:rect-width :to 100)
                  (animating :by :quading-out :the 'sdl2:rect-height :to 100)
                  (animating :by :bouncing-out :the 'sdl2:rect-x :to 0))))
            (other-anim
              (sequencing (:targeting rect :loop-mode :looping :at (sdl2:get-ticks))
                (animating :by :quading-in-out :the 'sdl2:rect-y :to 150 :for dur/3 )
                (animating :by :quading-in-out :the 'sdl2:rect-y :to 0 :for dur/3))))
  

 Then to update each of the animations ~anim~ and ~other-anim~, the above calls



    (animise:run-tween anim (sdl2:get-ticks))
    (animise:run-tween other-anim (sdl2:get-ticks))


 before the start of the rendering step.

**** Making batches of animations to run

![another example](.images/wavy.gif)

 The code is not quite as nice for this one, but not too bad:



     (let* ((animise::*duration* 1000)
            (rects (loop :for y :from 0 :to 48
                         :collect (sdl2:make-rect 1 (* y 8) 30 8)))
  
            (out-anims  (apply #'as-group
                               (loop :for (r . rest) :on rects
                                     :collect (animating :the 'sdl2:rect-x
                                                         :of r :to 620 :by :cubing-in-out
                                                         :at (1+ (* 100 (length rest)))))))
            (in-anims (apply #'as-group
                             (loop :for (r . rest) :on rects
                                   :collect (animating :the 'sdl2:rect-x
                                                       :of r :to 1 :by :cubing-in-out
                                                       :at (1+ (* 100 (length rest)))))))
            (anim (funcall #'in-sequence out-anims in-anims)))
  
       (setf (loop-mode anim) :looping)