summaryrefslogtreecommitdiffstats
path: root/useCases.md
diff options
context:
space:
mode:
Diffstat (limited to 'useCases.md')
-rw-r--r--useCases.md330
1 files changed, 0 insertions, 330 deletions
diff --git a/useCases.md b/useCases.md
deleted file mode 100644
index d6acdcb..0000000
--- a/useCases.md
+++ /dev/null
@@ -1,330 +0,0 @@
-
-
-# Tagged Animations
-
-The user can tag and control the runner for any animation
-
-```js
-
-var animation = element
- .loop(300, true)
- .tag('first')
- .rotate(360)
- .translate(50)
- .animate(300, 200)
- .tag('second')
- .scale(3)
-
-element.timeline.finish()
-element.timeline.pause()
-element.timeline.stop()
-element.timeline.play()
-
-```
-
-
-# Absolute Timeline Times
-
-The user can specify their time which is relative to the timelines time.
-
-
-```js
-
-var animation = element.animate(2000).move(200, 200)
-
-// after 1000 ms
-animation.animate(1000, 500, 'absolute').scale(2)
-
-
-var runner = elemenet.move(0, 0).animate(1000)
-
-// after 500ms
-runner.move(200, 200)
-
-```
-
-This block of code would:
-- Spend the first 1000ms moving the element
-- At this time, it will snap the scale to 1.5 (halfway to 2)
-- After this time, the scale and the move should go together
-
-
-# Rotating While Scaling
-
-The user may want to run multiple animations concurrently and have
-control over each animation that they define.
-
-```js
-
-let animationA = element.loop(300, ">").rotate(360)
-let animationB = element.loop(200, "><").scale(2)
-
-// Maybe they want to disable a runner - which acts like pausing
-animationB.active(false)
-
-// Maybe they want to remove an animation matching a tag
-animationB.tag('B')
-element.timeline().remove('B')
-
-// They can move around a runner as well
-element.timeline()
- .schedule('B', 300, 'absolute') // Moves a runner to start at 300
- // time(currentAbsolute - newAbsolute)
- .shift('B', 300) // Shifts the runner start time by 300
- // which is sugar to
- .schedule('B', 300, 'relative')
- // seek(shiftTime)
-
-```
-
-Lets demonstrate the difference between the schedule and shift
-
-```
-Given this:
-
- --------
- --------------
- ----------------
-
-Schedule:
- --------
- --------------
- ----------------
-
-Shift:
- --------
- --------------
- ----------------
-```
-
-
-
-# A Sequenced Animation
-
-The user might want to be able to run a long sequenced animation that they have
-predesigned as they please.
-
-```js
-
-let timeline = element.loop(300, "><").scale(2)
- .animate(300).rotate(30)
- .animate(300, 200).fill(blue)
-
-// They might want to move forwards or backwards
-timeline.seek(-300)
-
-// They might want to set a specific time
-timeline.time(200)
-
-// Or a specific position
-timeline.position(0.3)
-
-// Maybe they want to clear the timeline
-timeline.reset()
-
-```
-
-
-# User wants to Loop Something
-
-If the user wants to loop something, they should be able to call the loop
-method at any time, and it will just change the behaviour of the current
-runner. If we are running declaratively, we will throw an error.
-
-## Correct Usages
-
-They can invoke this from the timeline
-
-```js
-element.loop(duration, times, swing)
-```
-
-If they want to work with absolute times, they should animate first
-
-```js
-element.animate(300, 200, true)
- .loop(Infinity, true)
-```
-
-Or alternatively, they could equivalently do this:
-
-```js
-element.loop({
- now: true,
- times: Infinity,
- delay: 200,
- duration: 300,
- swing: true,
- wait: [200, 300]
-})
-```
-
-## Error Case
-
-
-
-# Declarative Animations
-
-The user might want to have something chase their mouse around. This would
-require a declarative animation.
-
-```js
-
-el.animate((curr, target, dt, ctx) => {
-
- // Find the error and the value
- let error = target - current
- ctx.speed = (ctx.error - error) / dt
- ctx.error = error
- return newPos
-
-})
-
-SVG.on(document, 'mousemove', (ev) => {
-
- el.timeline(controller)
- .move(ev.pageX, ev.pageY)
-
-})
-
-```
-
-
-## Springy Mouse Chaser
-
-Pretend we gave the user a springy controller that basically springs to a
-target in 300ms for example. They might be constantly changing the target with:
-
-```js
-
-el.animate(Spring(500), 200)
- .tag('declarative')
- .persist()
- .move(10, 10)
-
-el.animate('declarative')
- .move(300, 200)
-
-
-
-SVG.on(document, 'mousemove', function (ev) {
-
- el.animate(springy, 200)
- .tag('declarative')
- .move(ev.pageX, ev.pageY)
-
-})
-
-```
-
-
-# Repeated Animations
-
-The user might want to duplicate an animation and have it rerun a few times
-
-```js
-
-// User makes two copies of an animation
-let animA = el.animate(300, 300, 'now')...(animation)...
-let animB = animA.clone() // Deep copy
-
-// Now let the user attach and reschedule their animations
-el.timeline()
- .schedule(animA, 500, 'absolute')
- .schedule(animB, 2000, 'absolute')
-
-```
-
-Then the user can loop the timeline, by changing its play mode
-
-```js
-el.timeline()
- .loop(times, swing, waits)
-```
-
-
-# Advanced Animations
-
-The user can create their own runners and then attach it to the timeline
-themselves if they like.
-
-```js
-
-// They declare their animation
-let rotation = () => new SVG.Runner().rotate(500)
-
-// They attach an element, and schedule the runner
-let leftAnimation = rotation().element(leftSquare).reverse()
-
-// They might want to animate another
-let rightAnimation = rotation().element(rightSquare)
-
-// They can schedule these two runners to a master element
-timelineElement.timeline()
- .schedule(leftAnimation, 300, 'absolute')
- .schedule(rightAnimation, 500, 'now')
- .schedule(rightAnimation, 300, 'end')
-
-// Or they can schedule it to a timeline as well
-let timeline = new SVG.Timeline()
- .schedule(leftAnimation, 300, 'absolute')
- .schedule(rightAnimation, 500, 'now')
-
-```
-
-
-# Modifying Controller Parameters
-
-Some user might want to change the speed of a controller, or how the controller
-works in the middle of an animation. For example, they might do:
-
-```js
-
-var pid = PID(30, 20, 40)
-let animation = el.animate(pid).move(.., ..)
-
-
-// Some time later, the user slides a slider, and they can do:
-slider1.onSlide( v => pid.p(v) )
-
-```
-
-
-# Bidirectional Scheduling **(TODO)**
-
-We would like to schedule a runner to a timeline, or to do the opposite
-
-```js
-
-// If we have a runner and a timeline
-let timeline = new Timeline()...
-let runner = new Runner()...
-
-// Since the user can schedule a runner onto a timeline
-timeline.schedule(runner, ...rest)
-
-// It should be possible to do the opposite
-runner.schedule(timeline, ...rest)
-
-// It could be Implemented like this
-runner.schedule = (t, duration, delay, now) {
- this._timeline.remove(this) // Should work even if its not scheduled
- t.schedule(this, duration, delay, now)
- return this
-}
-
-// The benefit would be that they could call animate afterwards: eg:
-runner.schedule(timeline, ...rest)
- .animate()...
-
-```
-
-# Binding Events
-
-The user might want to react to some events that the runner might emit. We will
-emit the following events from the runner:
-- start - when a runner first initialises
-- finish - when a runner finishes
-- step - on every step
-
-Maybe they also want to react to timeline events as well