Slide 1

Slide 1 text

Modern JavaScript HTML5 Engine Flow in Details Animatron Player API Anton shaman.sir Kotenko Animatron, June 2013

Slide 2

Slide 2 text

Place to go http://animatron.com/player

Slide 3

Slide 3 text

Docs

Slide 4

Slide 4 text

Sandbox

Slide 5

Slide 5 text

Games

Slide 6

Slide 6 text

Files player.js builder.js *.module.js *.import.js internals API Extending API Import scenes

Slide 7

Slide 7 text

Files player.js builder.js *.module.js *.import.js var pl = createPlayer('...'); var scene = new anm.Scene(); var oval = new anm.Element('oval', null, function(ctx) { ... }); scene.add(oval); player.load(scene).play(); createPlayer('...').load( b('oval').oval(...) ).play(); b(this.$).collides(...) createPlayer('...').load(project, new AnimatronImporter());

Slide 8

Slide 8 text

Flow

Slide 9

Slide 9 text

Scene consists of Elements A B

Slide 10

Slide 10 text

...actually, internally structured A B X A A w

Slide 11

Slide 11 text

Everything is an Element A shape path text image

Slide 12

Slide 12 text

Everything is an Element A shape path text even sprite

Slide 13

Slide 13 text

Everything is an Element A shape path text sprite b('my-star').star(5) b('fish').path('...'); b('a-letter').text('A'); b('alien').sprite('...');

Slide 14

Slide 14 text

Elements may have children A B X i A A w

Slide 15

Slide 15 text

Elements may have children A B X i A A w b('parent').sprite(...).add(b('child').star(5))

Slide 16

Slide 16 text

...even while not being something for themselves B X i A A w b('parent').add(b('child').star(5))

Slide 17

Slide 17 text

Which way a single element is rendered?

Slide 18

Slide 18 text

It stores transformations (state)

Slide 19

Slide 19 text

It stores transformations (state) ...and a brush (visuals) A

Slide 20

Slide 20 text

It stores transformations (state) ...and a brush (visuals)

Slide 21

Slide 21 text

state visuals

Slide 22

Slide 22 text

state visuals f(t) → f(t) → f(t) → ← f(ctx) ← f(ctx) ← f(ctx) Paint Modify

Slide 23

Slide 23 text

state visuals f(t) → f(t) → f(t) → ← f(ctx) ← f(ctx) ← f(ctx) Painters Modifiers

Slide 24

Slide 24 text

state visuals f(t) → f(t) → f(t) → ← f(ctx) ← f(ctx) ← f(ctx) Painters Modifiers Time band

Slide 25

Slide 25 text

state visuals f(t) → f(t) → f(t) → ← f(ctx) ← f(ctx) ← f(ctx) Painters Modifiers Time band

Slide 26

Slide 26 text

state visuals tweens → events → f(t) → ← f(ctx) ← morphs ← f(ctx, t) Painters Modifiers Time band

Slide 27

Slide 27 text

state visuals tweens → events → f(t) → ← f(ctx) ← morphs ← f(ctx, t) Painters Modifiers Time band Browser time between calls is unpredictable, though has delta δ δ δ δ δ

Slide 28

Slide 28 text

Animatron Player

Slide 29

Slide 29 text

Animatron Player createPlayer('canvas-id').load(my_scene).play();

Slide 30

Slide 30 text

Animatron Player createPlayer('canvas-id').load(my_scene).play(3); 3 3

Slide 31

Slide 31 text

createPlayer('canvas-id', { 'mode': C.M_VIDEO, // C.M_PREVIEW (no controls) or C.M_DYNAMIC (for games) 'zoom': 1.0, 'repeat': false, 'bgcolor': '#ffffff', 'anim': { 'width': 400, 'height': 250, 'bgfill': { color: '#fff' }, 'duration': 10 } } ).load(my_scene); Options ⚙ 10

Slide 32

Slide 32 text

Import and Export createPlayer('canvas-id').load(my_scene, new AnimatronImporter()); new AnimatronExporter().create(source_scene) (NYI)

Slide 33

Slide 33 text

Embedding • w and h — forced width and forced height of the player. Will add black ribbons if scene ratio will be different. • bg — the background color of the player in format of ff00a6; Default is transparent. Appears below the scene background. • m — mode of the player, PREVIEW (no controls, no handling mouse/kb) is 0, DYNAMIC (no controls, handling mouse/kb) is 4, VIDEO (controls are shown, no mouse/kb handling, default) is 11. • r — repeating mode, 1 is to repeat (loop), 0 (default) — play once. • z is zoom of the scene, may be a float value • t is time to start play from when scene is loaded. t=370 means "play from 3s 700ms" • p is time to pause at when scene is loaded. p=370 means "pause at 3s 700ms" • debug flag (0 or 1, off by default) allows to turn on debug information such as FPS and exact time. Any of the parameters is optional, here is a definition for each one http://player.animatron.com/go/3f68b131-8a6a-4e0f-82f8-99a2576ab9d9? w=600&h=500&bg=f0fff0&m=0&r=0&z=1&t=25&p=37&debug=0 ⚙

Slide 34

Slide 34 text

Supports • Еmbedding • Static modification • Structures of any deep • Masks • Tweens and Easings • Jumping in time • Sprites • Time bands • Repeat modes • Events • Live changes • Simple collisions • Band-restricted modifiers • Relative modifiers α 5 0.3:1 9:17 ! x,y

Slide 35

Slide 35 text

Overview

Slide 36

Slide 36 text

Construction • b() — unnamed empty element • b('name') — empty element with a name • b(this.$) — from low-level element • b(b()) — find in cache & return • b().add(b()) — add child (even live) • b().remove(child) — remove child (even live) 'name'

Slide 37

Slide 37 text

A Shapes • b().rect([30, 30], [53, 53]).fill('#00f') — square | rectangle • b().oval([30, 30], [53, 53]).fill('#00f') — circle | oval • b().path([30, 30], 'M0 0...').stroke('#000').nofill() — path • b().image([30, 30], '/....jpg') — image • b().text([30, 30], 'A', 53).stroke('#000').nofill() — text • b().sprite([30, 30], '/....png', [53, 53]) — sprite

Slide 38

Slide 38 text

A Shapes • b().rect([30, 30], 53).fill('#00f') — square | rectangle • b().oval([30, 30], 53).fill('#00f') — circle | oval • b().path([30, 30], B.path([...])).stroke('#000').nofill() — path • b().image([30, 30], '/....svg') — image • b().text([30, 30], 'A', 53).stroke('#000').nofill() — text • b().sprite([30, 30], '/....png', 53) — sprite

Slide 39

Slide 39 text

Base state change (NYI) • b()...pos([30, 30]) — move • b()...angle(Math.PI / 3) — rotate • b()...size([2, 7], [2, 1.5]) — scale • b()...opacity(0.8) — change opacity

Slide 40

Slide 40 text

Bands & Repeat Modes • b().band([2, 10]) — lives from 0s to 10s of parent time • b().band([2, 10]).once() — the same • b().band([2, 10]).stay() — keep last state inst. of disappearing • b().band([2, 10]).loop() — loop during life of a parent • b().band([2, 10]).bounce() — bounce during life of a parent

Slide 41

Slide 41 text

Tweens • b()...trans([2, 7], [[5, 5], [10, 10]) — translate • b()...transP([2, 7], [...pts...]) — translate by path • b()...rotate([2, 7], [0, Math.PI * 2]) — rotate • b()...rotateP([2, 7], [...pts...]) — rotate to path • b()...scale([2, 7], [[2, 2], [0.5, 0.3]) — scale • b()...xscale([2, 7], [2, .5]) — equally scale • b()...alpha([2, 7], [0, 0.8]) — alpha

Slide 42

Slide 42 text

Tweens • b()...trans([2, 7], [[5, 5], [10, 10]) — translate • b()...transP([2, 7], [...pts...]) — translate by path • b()...rotate([2, 7], [0, Math.PI * 2]) — rotate • b()...rotateP([2, 7], [...pts...]) — rotate to path • b()...scale([2, 7], [[2, 2], [0.5, 0.3]) — scale • b()...xscale([2, 7], [2, .5]) — equally scale • b()...alpha([2, 7], [0, 0.6]) — alpha

Slide 43

Slide 43 text

Relative Tweens • b()...rtrans([0.18, 0.6], [[5, 5], [10, 10]) — translate • b()...rtransP([0.18, 0.6], [...pts...]) — translate by path • b()...rrotate([0.18, 0.6], [0, Math.PI * 2]) — rotate • b()...rrotateP([0.18, 0.6], [...pts...]) — rotate to path • b()...rscale([0.18, 0.6], [[2, 2], [0.5, 0.3]) — scale • b()...rxscale([0.18, 0.6], [2, .5]) — equally scale • b()...ralpha([0.18, 0.6], [0, 0.6]) — alpha

Slide 44

Slide 44 text

Composing Tweens b()...xscale([2, 7], [.5, 2.2]) .rotate([2, 7], [0, Math.PI / 2]) .alpha([2, 7], [0, 1])

Slide 45

Slide 45 text

Composing Tweens b()...xscale([2, 7], [.5, 2.2]) .rotate([2, 7], [0, Math.PI / 2]) .alpha([2, 7], [0, 1])

Slide 46

Slide 46 text

Composite Tweens (NYI) b()...rotate([2, 3, 5, 7], [0, 1/2 * Math.PI, Math.PI, 2 * Math.PI]) 0 π / 2 π 2π 0 2 5 7 3

Slide 47

Slide 47 text

Relative Composite Tweens (NYI) b()...rrotate([0.3, 0.5, 0.6, 1], [0, 1/2 * Math.PI, Math.PI, 2 * Math.PI]) 0 π / 2 π 2π 0 0.3 0.6 1 0.5

Slide 48

Slide 48 text

Easings • b()...trans([2, 2], [[5, 5], [10, 10]], C.E_IN) — predefined IN • b()...trans([2, 2], [[5, 5], [10, 10]], C.E_OUT) — predefined OUT • b()...trans([2, 2], [[5, 5], [10, 10]], C.E_INOUT) — predefined INOUT • b()...trans([2, 2], [[5, 5], [10, 10]], C.E_CIN) — predefined CIN • b()...trans([2, 2], [[5, 5], [10, 10]], C.E_COUT) — predefined COUT • ... • b()...trans([2, 2], [[5, 5], [10, 10]], [...pts...]) — path-based easing • b()...trans([2, 2], [[5, 5], [10, 10]], function(t) { return 1 - t; }) — custom

Slide 49

Slide 49 text

Modifiers & Painters • b().modify(function(t) { this.x = y / t; }) — normal modifier • b().modify([6, 7], function(t) { this.x = y / t; }) — band-restricted modifier • b().rmodify([0.25, 0.9], function(t) { this.x = y / t; }) — relative band-restricted modifier • b().modify(5, function(t) { this.x = y / t; }) — trigger-modifier (NYI) • b().rmodify(0.3, function(t) { this.x = y / t; }) — relative trigger-modifier (NYI) • b().modify(function(t) { this.x = y / t; }, C.E_IN) — modifier with easing • b().paint(function(ctx, t) { ctx.fillText(0, 0, t); }) — painter 10 f(t)

Slide 50

Slide 50 text

Events • b().on(C.M_CLICK, function(evt, t) { this.x = evt.x; }) • b().on_click(function(evt, t) { this.x = evt.x; }) • ...double-click, mouseover, mouseout, mousemove, mouseup, mousedown, keydown, keypress, keyup, draw • NYI: touchstart, touchend, touchmove... on() A

Slide 51

Slide 51 text

Timing • b().on(C.M_CLICK, function(evt, t) { this.t = 5; }) — jump to time • b().on(C.M_CLICK, function(evt, t) { this.rt = 0.3; }) — jump to relative time • b().key(5, 'jump').on(C.M_CLICK, function(evt, t) { this.key = 'jump'; }) — jump by key • b().rkey(0.2, 'jump').on(C.M_CLICK, function(evt, t) { this.key = 'jump'; }) — (NIY) relative • b().time(C.E_QIN) — predefined time easing • b().time(function(t) { return t / 2; }) — time easing • b().rtime(function(t) { return 1 - t; }) — relative time easing (NYI) t 5 .3 jump .jump

Slide 52

Slide 52 text

Sprites • b().sprite([30, 30], 'my_sprite.png', [40, 40], ...) — create sprite and define frames / frames names • b().switch(['jump', 'walk'], 10) — switch to given frames and FPS, waiting for run() call • b().run(7) — animate stored frames starting from given time • b().animate(7, ['jump', 'walk'], 10) — animate frames starting from given time with given FPS

Slide 53

Slide 53 text

Composition & Masks • b().acomp(C.C_SRC_OVER) — Source over • b().acomp(C.C_SRC_IN) — Source in • b().acomp(C.C_DST_ATOP) — Destination atop • b().acomp(C.C_LIGHTER) — Lighter • ... • b().mask(b()) — Use element as a mask SRC_IN

Slide 54

Slide 54 text

Other • b().enable() — enable • b().disable() — disable element • b().show() — (NYI) show element • b().hide() — (NYI) hide element • b().each(function(elm) { ... }) — iterate over direct children • b().deach() — iterate deeply over sub*-children • b().take(b()) — copy another element • b().use(b()) — clone another element • B.grad(...), B.path(...), B.sheet(...), B.easing(...) ... — helpers for you to make things

Slide 55

Slide 55 text

Everything with the help of modifiers and painters

Slide 56

Slide 56 text

May be head to the docs now?)

Slide 57

Slide 57 text

...or Sandbox?

Slide 58

Slide 58 text

Version 1.0 is coming soon

Slide 59

Slide 59 text

Thank you!

Slide 60

Slide 60 text

my homesite http://shamansir.github.io Player Home http://animatron.com/player/ GitHub http://github.com/Animatron/player Slides https://speakerdeck.com/shamansir/ animatron-player-api-in-details-v2