0

Cómo crear animaciones Web Con Paper.js

La Web se está empezando a utilizar la animación también. Durante años, los archivos GIF animados y Flash gobernados. Texto movido y brilló, pero nunca fue perfecta. Animaciones había cajas a su alrededor como los vídeos de YouTube. HTML5 canvas todo cambia sobre la animación web. El canvas elemento hace posible la integración de los dibujos y animaciones con el resto de la página. Lo puedes combinar con el texto y hacer animaciones interactivas. Este mecanismo de dibujo es de gran alcance, pero muy bajo nivel. Animaciones obtener más poder y necesita menos código, cuando se combina el canvas la etiqueta con el más alto nivel, tales como bibliotecas Paper.js . Este artículo introduce HTML5 animación y le guía a través de la creación de una animación de las semillas de diente de león en el viento.
[Editor's note: A must-have for professional Web designers and developers: The Printed Smashing Books Bundleis full of practical insight for your daily work. Get the bundle right away!]

Neat es fácil, pero desordenado es difícil

Computadoras encanta limpio. Ellos hacen las hojas de cálculo y hacer las estadísticas y las curvas de la trama multivariados, siempre dentro de las líneas de color. En el mundo real, las cosas más simples son sucios. Las hojas que caen de los árboles, las salpicaduras de agua - todas las interacciones que nos rodean se sienten poco simple debido a que estamos acostumbrados a ellos, pero pequeñas ráfagas de viento son en realidad desordenada e impredecible. Para este artículo, vamos a animar a las semillas de diente de león que soplan en la brisa. Dientes de león son difíciles porque todos sabemos lo que parecen: les hemos sentido y tocado sus semillas fuera. Objetos comunes producir un reconocimiento instantáneo y los sentimientos. No tengo que decirte lo que son los dientes de león - que acaba de saber. Dientes de león son un caos de semillas apilados uno encima del otro. screenshot (Imagen: Arnoldius ) Nuestra animación de diente de león nunca reproducir la complejidad de lo real, y funcionará mejor si no lo intentamos: que sea demasiado cerca de la real y que se siente raro. En su lugar, vamos a crear un diente de león estilizada que hace que la impresión correcta, sin todos los detalles. screenshot

Paper.js

Dibujo de formas simples con el canvas la etiqueta, sin ningún tipo de bibliotecas especiales de giro, es fácil. Crear un canvas :
1 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><canvas id="canvas" width="300" height="300"></canvas></span> <canvas id="canvas" width="300" height="300"> </ lienzo></span>
A continuación, agregue un poco de JavaScript.
01 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">// Get our canvas</span> / / Obtener nuestro lienzo</span>
02 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var canvas = $('#canvas')[0].getContext("2d");</span> var lienzo = $ ('# lienzo') [0] getContext ("2D").;</span>
03
04 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">// Draw a circle</span> / / Dibujar un círculo</span>
05 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">canvas.beginPath();</span> canvas.beginPath ();</span>
06 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">canvas.arc(100, 100, 15, 0, Math.PI*2, true);</span> canvas.arc (100, 100, 15, 0, Math.PI * 2, true);</span>
07
08 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">// Close the path</span> / / Cerrar el camino</span>
09 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">canvas.closePath();</span> canvas.closePath ();</span>
10
11 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">// Fill it in</span> / / Llena en</span>
12 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">canvas.fill();</span> canvas.fill ();</span>
screenshot Hojas de trucos para el lienzo que muestran los aspectos básicos, pero cuando te metes en más de dibujo serio, usted querrá una biblioteca de más alto nivel, como Paper.js . Paper.js es una biblioteca JavaScript de dibujos y animaciones. Se basa en gran medida de Scriptographer , un lenguaje de scripting de Adobe Illustrator . Puede escribir código JavaScript con Paper.js , pero la mayoría de las veces usted estará trabajando con una variante de JavaScript llamada PaperScript. Paper.js se llama " La navaja suiza de los gráficos vectoriales de secuencias de comandos , "y el" vector "de todo es importante. Hay dos tipos básicos de gráficos, vectorizados y trama . Los gráficos de trama son como las fotografías tomadas con su cámara: rectángulos grandes con mapas que indican el color de cada píxel. Ampliar ellos y obtendrás puntos borrosos. Los gráficos vectoriales son como se conectan los puntos de las fotos: son conjuntos de líneas y formas que dan instrucciones sobre la forma de dibujar la imagen en cualquier tamaño. Uso de gráficos de vectores, se puede hacer una imagen de la letra Z muy grande y todavía se ven más nítidos. Si usted se convirtió en una trama gráfica de tomar una foto de ella y luego sopla para arriba, la carta tendría todo borroso. Librerías gráficas vectoriales son perfectas para la animación ya que hacen el cambio de tamaño, rotar y mover objetos fácil. También son mucho más rápido, porque el programa tiene instrucciones para dibujar cada objeto en lugar de tener que averiguarlo. La página de Paper.js ejemplos muestran algunas de las cosas asombrosas que usted puede hacer con gráficos vectorizados. El diente de león es un ejemplo de funcionamiento completo, y usted puede ver todas las que se ejecuta en la página de ejemplo . También puede cambiar el código haciendo clic en el botón "Editar", ver los cambios vivir, y copie y pegue el código en su propio sitio web. A lo largo del artículo, vamos a explicar cada parte del código a su vez, pero ten en cuenta que para ejecutar el código de usted mismo, usted tendrá que dirigirse a la página de ejemplo y copiar y pegarlo en su propio entorno .

Nuestro dibujo de diente de león

El primer paso consiste en importar nuestro código JavaScript y archivos PaperScript.
1 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><script src="paper.js" type="text/javascript" charset="utf-8"></script></span> <script type="text/javascript" src="paper.js" charset="utf-8"> </ script></span>
2 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><script type="text/paperscript" canvas="canvas" src="dandelion.pjs" id="script"></script></span> type="text/paperscript" <script canvas="canvas" src="dandelion.pjs" id="script"> </ script></span>
El código PaperScript para el funcionamiento de la animación se declara como text/paperscript . Ahora estamos listos para empezar a dibujar. La primera parte de nuestra diente de león es el tallo. El tallo es el arco verde, con un círculo en la parte superior de la bombilla. Vamos a hacer las dos formas con un camino , una lista de formas, puntos y líneas que el navegador se encargó de mostrar. Las rutas son los elementos básicos de la animación. Hacen líneas, curvas y polígonos. También se pueden rellenar para hacer formas complejas. Nuestro camino es el siguiente:
01 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var path = new Path();</span> var path = ruta de nuevo ();</span>
02 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">path.strokeColor = '#567e37';</span> path.strokeColor = '# 567e37';</span>
03 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">path.strokeWidth = 5;</span> path.strokeWidth = 5;</span>
04
05 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var firstPoint = new Point(0, 550);</span> var firstPoint = new Point (0, 550);</span>
06 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">path.add(firstPoint);</span> path.add (firstPoint);</span>
07
08 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var throughPoint = new Point(75, 400);</span> var través de punto = new Point (75, 400);</span>
09 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var toPoint = new Point(100, 250);</span> var toPoint = new Point (100, 250);</span>
10 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">path.arcTo(throughPoint, toPoint);</span> path.arcTo (través de punto, toPoint);</span>
Nuestro camino es un arco, así que necesita tres puntos: el inicio, el final y un punto medio a través del arco. Tres puntos son suficientes para definir cualquier arco que necesitamos. El arcTo función dibuja la línea entre ellos. El elemento de ruta también es compatible con información de estilo, como el color del trazo y el grosor del trazo; #567e37 y 5 hará que nuestra línea de arco verde y frondosa. Paper.js compatible con las definiciones del mismo color como CSS. Podemos añadir algunos elementos más para hacer todo más fácil de ver:
1 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">path.fullySelected = true;</span> path.fullySelected = true;</span>
2
3 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var circle = new Path.Circle(throughPoint, 5);</span> var = new círculo Path.Circle (través de punto, 5);</span>
4 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">circle.fillColor = '#CC0000';</span> circle.fillColor = "# CC0000";</span>
Totalmente seleccionar la ruta de acceso mostrará unas líneas que nos muestre el arco; el círculo rojo nos muestra dónde está el punto a través. screenshot La raíz termina con un círculo para mostrar el bulbo de la flor y nos dan un lugar para colocar todas las semillas. Los círculos son mucho más fáciles de Paper.js que en directo canvas .
1 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var bulb = new Path.Circle(toPoint, 10);</span> var = nuevo foco Path.Circle (toPoint, 10);</span>
2 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">bulb.fillColor = '#567e37';</span> bulb.fillColor = '# 567e37';</span>
Una línea de código dibuja nuestro círculo, uno más hace que sea verde, y ahora estamos listos para agregar nuestras semillas.

Una vez extraídas las semillas

Cada semilla tiene un bulbo, un tallo pequeño y una parte tenue en la parte superior. screenshot (Imagen: Hmbascom ) Nuestra semilla comienza con un pequeño óvalo de la bombilla y un arco para el vástago. El óvalo es un rectángulo con esquinas redondeadas:
1 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var size = new Size(4, 10);</span> var size = new Size (4, 10);</span>
2 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var rectangle = new Rectangle(p, size);</span> var rectángulo = new Rectangle (p, tamaño);</span>
3 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var bottom = new Path.Oval(rectangle);</span> var fondo = new Path.Oval (rectángulo);</span>
4 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">bottom.fillColor = '#d0aa7b';</span> bottom.fillColor = '# d0aa7b';</span>
El tallo de la semilla es otro arco, pero éste es mucho más delgado que el tallo de la flor:
1 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var stem = new Path();</span> var = Ruta del tallo nuevo ();</span>
2 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">stem.strokeColor = '#567e37';</span> stem.strokeColor = '# 567e37';</span>
3 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">stem.strokeWidth = 1;</span> stem.strokeWidth = 1;</span>
4 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">stem.add(new Point(px + 2, py));</span> stem.add (new Point (px + 2, py));</span>
5
6 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var throughPoint = new Point(px + 4, py - height / 2);</span> var través de punto = new Point (px + 4, PY - altura / 2);</span>
7 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var toPoint = new Point(px + 3, py - height);</span> var toPoint = new Point (px + 3, py - altura);</span>
8 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">stem.arcTo(throughPoint, toPoint);</span> stem.arcTo (través de punto, toPoint);</span>
Los mechones son más arcos con un círculo al final de cada línea. Cada semilla tiene un número aleatorio de mechones que comienzan en la parte superior del arco del vástago y la curva hacia fuera en direcciones diferentes. La aleatoriedad hace que se vean un poco desordenado y por lo tanto más natural. Cada semilla tiene un número aleatorio de jirones, entre 4 y 10.
01 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">for (var i = 0; i < random(4, 10); i++) {</span> for (var i = 0; i <random (4, 10); i + +) {</span>
02     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">path = new Path();</span> path = ruta de nuevo ();</span>
03     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">path.strokeColor = '#fff3c9';</span> path.strokeColor = '# fff3c9';</span>
04     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">path.strokeWidth = 1;</span> path.strokeWidth = 1;</span>
05
06     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var p1 = new Point(px, py);</span> var p1 = new Point (px, py);</span>
07     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">path.add(new Point(p1.x + 2, p1.y + 2));</span> path.add (new Point (p1.x + 2, p1.y + 2));</span>
08
09     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">// Each flutter extends a random amount up in the air</span> / / Cada aleteo se extiende una cantidad al azar en el aire</span>
10     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var y = random(1, 5);</span> var y = aleatorio (1, 5);</span>
11
12     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">// We draw every other stem on the right or the left so they're</span> / / Dibujamos cada tallo otro a la derecha oa la izquierda por lo que son</span>
13     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">// spaced out in the seed.</span> / / Espaciados en la semilla.</span>
14     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">if (i % 2 == 0) {</span> if (i% 2 == 0) {</span>
15         <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">throughPoint = new Point(p1.x + random(1, 3), p1.y - y);</span> través de punto = nuevo punto (p1.x + aleatorio (1, 3), p1.y - y);</span>
16         <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">toPoint = new Point(p1.x + random(5, 35), p1.y - 20 - y);</span> toPoint = new Point (p1.x + random (5, 35), p1.y - 20 - y);</span>
17     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">} else {</span> Else {}</span>
18         <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">throughPoint = new Point(p1.x - random(1, 3), p1.y - y);</span> través de punto = new Point (p1.x - random (1, 3), p1.y - y);</span>
19         <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">toPoint = new Point(p1.x - random(5, 35), p1.y - 20 - y);</span> toPoint = new Point (p1.x - random (5, 35), p1.y - 20 - y);</span>
20     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
21
22     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">path.arcTo(throughPoint, toPoint);</span> path.arcTo (través de punto, toPoint);</span>
23
24     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">// Now we put the circle at the tip of the flutter.</span> / / Ahora ponemos el círculo en la punta del aleteo.</span>
25     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">circle = new Path.Circle(toPoint, 2);</span> círculo = new Path.Circle (toPoint, 2);</span>
26     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">circle.fillColor = '#fff3c9';</span> circle.fillColor = '# fff3c9';</span>
27 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
Ahora que hemos llegado a la semilla, tenemos que gestionar, y más tarde, vamos a querer mover y rotar la misma. La semilla se compone de un montón de partes, y no quiero tener que gestionar cada uno por separado. Paper.js tiene un buen grupo de objetos. Grupos de asociar un conjunto de objetos juntos para que podamos manipular a la vez.
1 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var group = new Group();</span> var grupo = new Grupo ();</span>
2 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">group.addChild(bottom);</span> group.addChild (abajo);</span>
3 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">group.addChild(stem);</span> group.addChild (madre);</span>
4
5 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">this.group = group;</span> this.group = grupo;</span>
El último paso es empaquetar nuestra semilla en un objeto reutilizable llamada Seed . Añadimos todo el código que hemos estado escribiendo una nueva función con el nombre de Seed y agregar una función para crear las variables iniciales. En este ejemplo se llama a esa función create , pero puede que sea lo que quieras.
1 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">function Seed() {</span> Semilla function () {</span>
2
3    <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">this.create = function (/*Point*/ p, /*boolean*/ shortStem) {</span> this.create = function (/ * punto * / p, / * boolean * / shortStem) {</span>
4    <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">…</span> ...</span>
El create función dibuja la semilla a la hora especificada punto , y el shortStem booleano nos dice si se trata de un tallo corto. Pronto nos ocuparemos de tallo corto semillas un poco más tarde. Este tipo de funciones no funcionan como constructores en JavaScript, pero son compatibles con PaperScript.
1 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var seed = new Seed()</span> de semillas de semillas de var = nuevo ()</span>
2 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">seed.create(new Point(100, 100), false);</span> seed.create (nuevo punto (100, 100), false);</span>
Nuestras semillas se verá así cuando los dibuja: screenshot La Seed objeto atrae nuestras semillas de diente de león al azar. Ahora podemos añadir a nuestra flor.

Añadir un poco de caos

Las semillas se verá mejor cuando el espacio fuera de todo el círculo de nuestra bombilla de diente de león para sentirse como un halo de semillas. El bulbo es un círculo, y el círculo es un camino, por lo que puede obtener cada punto de la ruta.
01 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var bulb = new Path.Circle(toPoint, 10); bulb.fillColor = '#567e37';</span> var = nuevo foco Path.Circle (toPoint, 10); bulb.fillColor = '# 567e37';</span>
02
03 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var angle = 360 / bulb.length;</span> var = ángulo de 360 ​​/ bulb.length;</span>
04 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var seeds = [];</span> semillas var = [];</span>
05
06 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">for (var i = 0; i < bulb.length; i++) {</span> for (var i = 0; i <bulb.length; i + +) {</span>
07     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var seed = new Seed()</span> de semillas de semillas de var = nuevo ()</span>
08     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">seed.create(bulb.getPointAt(i));</span> seed.create (bulb.getPointAt (i));</span>
09
10     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">// Rotate each seed so that it points out from the bulb</span> / / Rotar cada semilla de manera que apunte hacia fuera de la bombilla</span>
11     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">seed.rotate(i * angle);</span> seed.rotate (i ángulo *);</span>
12     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">seeds.push(seed);</span> seeds.push (semilla);</span>
13 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
Esto hará que un círculo de semillas alrededor de la bombilla, pero dejan un espacio en el centro. Vamos a añadir unas cuantas semillas más para llenar en el centro. Estamos dando a los centros de semillas de corto surge de modo que muestren el blanco de los mechones más que el beige de los tallos.
1 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">for (var i = 0; i < 18; i++) {</span> for (var i = 0; i <18; i + +) {</span>
2     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var seed = new Seed()</span> de semillas de semillas de var = nuevo ()</span>
3     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var point = new Point(toPoint.x + random(-3, 3),</span> var punto = new Point (toPoint.x + aleatoria (-3, 3),</span>
4                           <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">toPoint.y + random(-3, 3));</span> toPoint.y + aleatorio (-3, 3));</span>
5     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">seed.create(new Point(toPoint), true);</span> seed.create (new Point (toPoint), true);</span>
6     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">seed.rotate(random(0, 360));</span> seed.rotate (aleatorio (0, 360));</span>
7     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">seeds.push(seed);</span> seeds.push (semilla);</span>
8 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
Las semillas en el centro será montón al azar, y haremos el diente de león mira muy bien desordenado. Ahora podemos hacer que vuele.

La animación de The Seeds

Viento empuja las semillas en patrones complejos, y dos semillas nunca soplar la misma manera. Queremos que se vean reales, por lo que vamos a necesitar un poco más de aleatoriedad. La reproducción de viento real es demasiado complicado, así que vamos a hacer que las semillas flotando en un patrón aleatorio de aspecto. Cada semilla se le asigna un punto aleatorio en el lado derecho de la pantalla como un destino final:
1 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">this.dest = new Point(1800, random(-300, 1100));</span> this.dest = new Point (1800, al azar (-300, 1100));</span>
El rotateMove función de cada semilla lleva hacia su punto de destino y lo hace girar. Podemos trabajar con nuestro objeto de semillas como un grupo para rotar y mover con una sola función.
01 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">this.rotateMove = function(/*int*/ angle) {</span> this.rotateMove = function (/ * int * / ángulo) {</span>
02     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">if (this.group.position.x < 850 && this.group.position.y < 650) {</span> if (<850 && this.group.position.x this.group.position.y <650) {</span>
03         <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var vector = this.dest - this.group.position;</span> var = vector this.dest - this.group.position;</span>
04         <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">this.group.position += vector / 150;</span> this.group.position + = vector / 150;</span>
05
06         <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">this.angle += angle;</span> this.angle + = ángulo;</span>
07         <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">this.group.rotate(angle);</span> this.group.rotate (ángulo);</span>
08     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">} else {</span> Else {}</span>
09         <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">this.isOffScreen = true</span> this.isOffScreen = true</span>
10     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
11 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
Esta función se moverá la semilla hasta que es fuera de la pantalla. Llamar rotateMove para cada fotograma de la animación hará que el flotador de semillas a través de la pantalla. Paper.js nos da una manera fácil de hacer animaciones con la onFrame la función, cuando ponemos en práctica onFrame , Paper.js lo llamará para cada fotograma de la animación. Con cada marco, repetir cada semilla y se mueven por la pantalla.
1 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">function onFrame(event) {</span> función de onFrame (evento) {</span>
2     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">for (var i = 0; i < seedCount; i++) {</span> for (var i = 0; i <seedCount; i + +) {</span>
3         <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">if (!seeds[i].isOffscreen()) {</span> if (! semillas [i]. IsOffscreen ()) {</span>
4             <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">seeds[i].rotateMove(random(2, 4));</span> semillas [i] rotateMove (random (2, 4)).;</span>
5         <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
6     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
7 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
Las semillas se deslizan y giran un poco más cerca al punto de destino con cada fotograma de la animación. A partir de todas las semillas en el mismo punto y final a la medida, aparte hace muy bien el espacio a medida que se mueven. screenshot No queremos que todas las semillas que caen a la vez, así que vamos a utilizar un temporizador para que se alejen.
1 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">function start() {</span> inicio function () {</span>
2     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var id = setInterval(function() {</span> var id = setInterval (function () {</span>
3         <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">seedCount++;</span> seedCount + +;</span>
4         <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">if (seedCount === seeds.length) {</span> if (seedCount seeds.length ===) {</span>
5             <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">clearInterval(id);</span> clearInterval (id);</span>
6         <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
7     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}, 1000);</span> }, 1000);</span>
8 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
El temporizador de espera durante un segundo antes de liberar la semilla que viene, dando una sensación de diente de león nuestra flotante agradable. Un poco de hierba verde y cielo azul como imagen de fondo para nuestra canvas lo pone todo en su contexto. Ahora tenemos un diente de león con las semillas que flotan en la brisa. screenshot Ver el diente de león corriendo de aquí . Usted puede editar y ejecutar el código fuente como parte de la animación o descargarlo de la página de GitHub de diente de león .

Paper.js en el mundo real

Paper.js tiene algunos ejemplos impresionantes y un buen modelo de codificación, pero usted debe saber algunas trampas antes de usarlo en su sitio web.

No funciona en navegadores antiguos

Todos los dibujos Paper.js utilizar el canvas la etiqueta y requieren HTML5. Esto significa que se requiere Internet Explorer 9 +, Firefox 4 +, Safari o Chrome 5 +. Si su sitio web debe ser compatible con los navegadores más antiguos, entonces usted no será capaz de utilizar canvas . No hay manera de evitar este requisito, si usted necesita los navegadores más antiguos, que está fuera de suerte. A medida que el sitio web de Paper.js dice: " Vamos a seguir adelante! ".

El rendimiento puede ser lento

Paper.js puede hacer que un navegador detendría incluso si el navegador soporta HTML5. Pixar vuelve a Buzz y Woody en enormes granjas de servidores - lo único que consigue es MacBook barata del usuario. No sólo son las computadoras portátiles más lentos que los clústeres de servidores, pero los navegadores empeorar las cosas que hacen que el canvas la etiqueta con la CPU en lugar de la GPU . Juegos como Halo y Rage aprovechar el procesador gráfico en su tarjeta de vídeo para hacer lanzadores de cohetes y mutantes. La CPU es menos eficiente con los gráficos, por lo que el mismo equipo que se encarga de complejos juegos de video sin problemas puede hacer que las semillas de diente de león flotante mira lenta y desigual. Asegúrese de probar todas sus animaciones con hardware más lento, y ver el uso de la CPU. Utilice los grupos para reducir al mínimo los cálculos, y tener mucho cuidado con lo que haces en cada invocación de la onFrame función.

Los dispositivos móviles son más lentas

El rendimiento móvil es aún peor. La mayoría de dispositivos móviles admiten canvas , pero la mayoría son demasiado lentos para hacer que canvas y animaciones. Dispositivos aún más poderosos, como el iPad 2, no puede manejar las semillas de diente de león sin problemas.

No es compatible con eventos de nivel de objeto

Otras bibliotecas de dibujo, como SVG (ver más abajo), el apoyo a nivel de objeto eventos de ratón y teclado. Estos acontecimientos hacen que sea fácil de responder cuando una ruta o un polígono se hace clic, se cernía sobre o tocado. El canvas la etiqueta no es compatible a nivel de objeto eventos. Paper.js tiene algunas funciones básicas para la prueba de posicionamiento , pero es de muy bajo nivel. Usted puede escuchar el ratón y el teclado de eventos en todo el lienzo, pero usted necesita para manejar la cartografía aquellos eventos a los controles individuales.

¿Qué pasa con SVG?

El SVG (Scalable Vector Graphics) especificación fue definida hace 10 años, pero llegó a la vanguardia con las bibliotecas de apoyo tales como Raphaël.js , que hacen que sea fácil de generar imágenes SVG con JavaScript. SVG es potente, funciona bien para imágenes más pequeñas, y es compatible con todo el camino de regreso a Internet Explorer 7 con la conversión a VML (Vector Markup Language). SVG es la mejor opción si lo que necesita para soportar los navegadores más antiguos. Los verdaderos problemas son el soporte SVG con la velocidad, el futuro y los dispositivos móviles. Cada fabricante del navegador está trabajando activamente en la fabricación de canvas más rápido. Safari 5 ya ofrece aceleración de hardware con la GPU para la canvas , y el resto están trabajando en ello. SVG también es compatible en los dispositivos Android. Hay una creciente comunidad en torno canvas , la nueva tecnología que los fabricantes se están centrando en. Ellos están añadiendo nuevas características, corrección de bugs y lo que es mejor cada día.

Otras Bibliotecas lienzo de dibujo

Paper.js no es la única opción para canvas . Processing.js , desde el creador de jQuery , los puertos del procesamiento de lenguaje de programación JavaScript. Es compatible con animaciones y tiene muchos ejemplos . El three.js motor es compatible con canvas y el WebGL biblioteca, y se centra más en 3-D los dibujos. Google Dart también apoyará canvas con una función de representar a los objetos. Paper.js es una biblioteca madura, con una comunidad muy positiva en el Grupo Paper.js Google y muchos ejemplos más impresionantes y bien documentado. Echa un vistazo a algunas de las cosas maravillosas que la gente está haciendo con él.

Más ejemplos Paper.js

El diente de león es sólo el comienzo. A continuación se presentan algunas otras animaciones impresionantes escritos en Paper.js.
  • Ejemplos , Paper.js cuenta con una página llena de ejemplos increíbles. Voronoi es uno de los mejores. Asegúrese de presionar la barra espaciadora para ver los caminos. Más ejemplos se encuentran en la carpeta de GitHub .
  • Nardove , medusas, Ricardo Sánchez se escriben con Paper.js y un estanque koi escrito con Processing.js. Espera un minuto, las medusas son tímidos.
  • " Jardín de nodo en Paper.js ", dijo Andrew Berg
  • " El programa de reciclaje de HBO "Una infografía que he creado con Paper.js para mostrar con qué frecuencia distinta serie de HBO utilizar los mismos actores.
  • " 20 gestos Multi-Touch que usted debe aprender hoy ", creado Zack Grossbart el tutorial interactivo con la ayuda de Paper.js.
¿Dónde está tu amazingness Paper.js? (AL)
Tags: HTML HTML5 JavaScript
  • Por Zack Grossbart
  • Our Bestseller: Printed Smashing Book 2
  • 21 de noviembre 2011
  • HTML , HTML5 , JavaScript
  • 53 Comentarios
Anuncio
La Web se está empezando a utilizar la animación también. Durante años, los archivos GIF animados y Flash gobernados. Texto movido y brilló, pero nunca fue perfecta. Animaciones había cajas a su alrededor como los vídeos de YouTube. HTML5 canvas todo cambia sobre la animación web. El canvas elemento hace posible la integración de los dibujos y animaciones con el resto de la página. Lo puedes combinar con el texto y hacer animaciones interactivas. Este mecanismo de dibujo es de gran alcance, pero muy bajo nivel. Animaciones obtener más poder y necesita menos código, cuando se combina el canvas la etiqueta con el más alto nivel, tales como bibliotecas Paper.js . Este artículo introduce HTML5 animación y le guía a través de la creación de una animación de las semillas de diente de león en el viento.
[Editor's note: A must-have for professional Web designers and developers: The Printed Smashing Books Bundleis full of practical insight for your daily work. Get the bundle right away!]

Neat es fácil, pero desordenado es difícil

Computadoras encanta limpio. Ellos hacen las hojas de cálculo y hacer las estadísticas y las curvas de la trama multivariados, siempre dentro de las líneas de color. En el mundo real, las cosas más simples son sucios. Las hojas que caen de los árboles, las salpicaduras de agua - todas las interacciones que nos rodean se sienten poco simple debido a que estamos acostumbrados a ellos, pero pequeñas ráfagas de viento son en realidad desordenada e impredecible. Para este artículo, vamos a animar a las semillas de diente de león que soplan en la brisa. Dientes de león son difíciles porque todos sabemos lo que parecen: les hemos sentido y tocado sus semillas fuera. Objetos comunes producir un reconocimiento instantáneo y los sentimientos. No tengo que decirte lo que son los dientes de león - que acaba de saber. Dientes de león son un caos de semillas apilados uno encima del otro. screenshot (Imagen: Arnoldius ) Nuestra animación de diente de león nunca reproducir la complejidad de lo real, y funcionará mejor si no lo intentamos: que sea demasiado cerca de la real y que se siente raro. En su lugar, vamos a crear un diente de león estilizada que hace que la impresión correcta, sin todos los detalles. screenshot

Paper.js

Dibujo de formas simples con el canvas la etiqueta, sin ningún tipo de bibliotecas especiales de giro, es fácil. Crear un canvas :
1 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><canvas id="canvas" width="300" height="300"></canvas></span> <canvas id="canvas" width="300" height="300"> </ lienzo></span>
A continuación, agregue un poco de JavaScript.
01 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">// Get our canvas</span> / / Obtener nuestro lienzo</span>
02 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var canvas = $('#canvas')[0].getContext("2d");</span> var lienzo = $ ('# lienzo') [0] getContext ("2D").;</span>
03
04 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">// Draw a circle</span> / / Dibujar un círculo</span>
05 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">canvas.beginPath();</span> canvas.beginPath ();</span>
06 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">canvas.arc(100, 100, 15, 0, Math.PI*2, true);</span> canvas.arc (100, 100, 15, 0, Math.PI * 2, true);</span>
07
08 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">// Close the path</span> / / Cerrar el camino</span>
09 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">canvas.closePath();</span> canvas.closePath ();</span>
10
11 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">// Fill it in</span> / / Llena en</span>
12 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">canvas.fill();</span> canvas.fill ();</span>
screenshot Hojas de trucos para el lienzo que muestran los aspectos básicos, pero cuando te metes en más de dibujo serio, usted querrá una biblioteca de más alto nivel, como Paper.js . Paper.js es una biblioteca JavaScript de dibujos y animaciones. Se basa en gran medida de Scriptographer , un lenguaje de scripting de Adobe Illustrator . Puede escribir código JavaScript con Paper.js , pero la mayoría de las veces usted estará trabajando con una variante de JavaScript llamada PaperScript. Paper.js se llama " La navaja suiza de los gráficos vectoriales de secuencias de comandos , "y el" vector "de todo es importante. Hay dos tipos básicos de gráficos, vectorizados y trama . Los gráficos de trama son como las fotografías tomadas con su cámara: rectángulos grandes con mapas que indican el color de cada píxel. Ampliar ellos y obtendrás puntos borrosos. Los gráficos vectoriales son como se conectan los puntos de las fotos: son conjuntos de líneas y formas que dan instrucciones sobre la forma de dibujar la imagen en cualquier tamaño. Uso de gráficos de vectores, se puede hacer una imagen de la letra Z muy grande y todavía se ven más nítidos. Si usted se convirtió en una trama gráfica de tomar una foto de ella y luego sopla para arriba, la carta tendría todo borroso. Librerías gráficas vectoriales son perfectas para la animación ya que hacen el cambio de tamaño, rotar y mover objetos fácil. También son mucho más rápido, porque el programa tiene instrucciones para dibujar cada objeto en lugar de tener que averiguarlo. La página de Paper.js ejemplos muestran algunas de las cosas asombrosas que usted puede hacer con gráficos vectorizados. El diente de león es un ejemplo de funcionamiento completo, y usted puede ver todas las que se ejecuta en la página de ejemplo . También puede cambiar el código haciendo clic en el botón "Editar", ver los cambios vivir, y copie y pegue el código en su propio sitio web. A lo largo del artículo, vamos a explicar cada parte del código a su vez, pero ten en cuenta que para ejecutar el código de usted mismo, usted tendrá que dirigirse a la página de ejemplo y copiar y pegarlo en su propio entorno .

Nuestro dibujo de diente de león

El primer paso consiste en importar nuestro código JavaScript y archivos PaperScript.
1 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><script src="paper.js" type="text/javascript" charset="utf-8"></script></span> <script type="text/javascript" src="paper.js" charset="utf-8"> </ script></span>
2 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><script type="text/paperscript" canvas="canvas" src="dandelion.pjs" id="script"></script></span> type="text/paperscript" <script canvas="canvas" src="dandelion.pjs" id="script"> </ script></span>
El código PaperScript para el funcionamiento de la animación se declara como text/paperscript . Ahora estamos listos para empezar a dibujar. La primera parte de nuestra diente de león es el tallo. El tallo es el arco verde, con un círculo en la parte superior de la bombilla. Vamos a hacer las dos formas con un camino , una lista de formas, puntos y líneas que el navegador se encargó de mostrar. Las rutas son los elementos básicos de la animación. Hacen líneas, curvas y polígonos. También se pueden rellenar para hacer formas complejas. Nuestro camino es el siguiente:
01 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var path = new Path();</span> var path = ruta de nuevo ();</span>
02 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">path.strokeColor = '#567e37';</span> path.strokeColor = '# 567e37';</span>
03 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">path.strokeWidth = 5;</span> path.strokeWidth = 5;</span>
04
05 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var firstPoint = new Point(0, 550);</span> var firstPoint = new Point (0, 550);</span>
06 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">path.add(firstPoint);</span> path.add (firstPoint);</span>
07
08 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var throughPoint = new Point(75, 400);</span> var través de punto = new Point (75, 400);</span>
09 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var toPoint = new Point(100, 250);</span> var toPoint = new Point (100, 250);</span>
10 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">path.arcTo(throughPoint, toPoint);</span> path.arcTo (través de punto, toPoint);</span>
Nuestro camino es un arco, así que necesita tres puntos: el inicio, el final y un punto medio a través del arco. Tres puntos son suficientes para definir cualquier arco que necesitamos. El arcTo función dibuja la línea entre ellos. El elemento de ruta también es compatible con información de estilo, como el color del trazo y el grosor del trazo; #567e37 y 5 hará que nuestra línea de arco verde y frondosa. Paper.js compatible con las definiciones del mismo color como CSS. Podemos añadir algunos elementos más para hacer todo más fácil de ver:
1 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">path.fullySelected = true;</span> path.fullySelected = true;</span>
2
3 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var circle = new Path.Circle(throughPoint, 5);</span> var = new círculo Path.Circle (través de punto, 5);</span>
4 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">circle.fillColor = '#CC0000';</span> circle.fillColor = "# CC0000";</span>
Totalmente seleccionar la ruta de acceso mostrará unas líneas que nos muestre el arco; el círculo rojo nos muestra dónde está el punto a través. screenshot La raíz termina con un círculo para mostrar el bulbo de la flor y nos dan un lugar para colocar todas las semillas. Los círculos son mucho más fáciles de Paper.js que en directo canvas .
1 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var bulb = new Path.Circle(toPoint, 10);</span> var = nuevo foco Path.Circle (toPoint, 10);</span>
2 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">bulb.fillColor = '#567e37';</span> bulb.fillColor = '# 567e37';</span>
Una línea de código dibuja nuestro círculo, uno más hace que sea verde, y ahora estamos listos para agregar nuestras semillas.

Una vez extraídas las semillas

Cada semilla tiene un bulbo, un tallo pequeño y una parte tenue en la parte superior. screenshot (Imagen: Hmbascom ) Nuestra semilla comienza con un pequeño óvalo de la bombilla y un arco para el vástago. El óvalo es un rectángulo con esquinas redondeadas:
1 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var size = new Size(4, 10);</span> var size = new Size (4, 10);</span>
2 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var rectangle = new Rectangle(p, size);</span> var rectángulo = new Rectangle (p, tamaño);</span>
3 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var bottom = new Path.Oval(rectangle);</span> var fondo = new Path.Oval (rectángulo);</span>
4 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">bottom.fillColor = '#d0aa7b';</span> bottom.fillColor = '# d0aa7b';</span>
El tallo de la semilla es otro arco, pero éste es mucho más delgado que el tallo de la flor:
1 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var stem = new Path();</span> var = Ruta del tallo nuevo ();</span>
2 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">stem.strokeColor = '#567e37';</span> stem.strokeColor = '# 567e37';</span>
3 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">stem.strokeWidth = 1;</span> stem.strokeWidth = 1;</span>
4 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">stem.add(new Point(px + 2, py));</span> stem.add (new Point (px + 2, py));</span>
5
6 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var throughPoint = new Point(px + 4, py - height / 2);</span> var través de punto = new Point (px + 4, PY - altura / 2);</span>
7 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var toPoint = new Point(px + 3, py - height);</span> var toPoint = new Point (px + 3, py - altura);</span>
8 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">stem.arcTo(throughPoint, toPoint);</span> stem.arcTo (través de punto, toPoint);</span>
Los mechones son más arcos con un círculo al final de cada línea. Cada semilla tiene un número aleatorio de mechones que comienzan en la parte superior del arco del vástago y la curva hacia fuera en direcciones diferentes. La aleatoriedad hace que se vean un poco desordenado y por lo tanto más natural. Cada semilla tiene un número aleatorio de jirones, entre 4 y 10.
01 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">for (var i = 0; i < random(4, 10); i++) {</span> for (var i = 0; i <random (4, 10); i + +) {</span>
02     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">path = new Path();</span> path = ruta de nuevo ();</span>
03     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">path.strokeColor = '#fff3c9';</span> path.strokeColor = '# fff3c9';</span>
04     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">path.strokeWidth = 1;</span> path.strokeWidth = 1;</span>
05
06     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var p1 = new Point(px, py);</span> var p1 = new Point (px, py);</span>
07     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">path.add(new Point(p1.x + 2, p1.y + 2));</span> path.add (new Point (p1.x + 2, p1.y + 2));</span>
08
09     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">// Each flutter extends a random amount up in the air</span> / / Cada aleteo se extiende una cantidad al azar en el aire</span>
10     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var y = random(1, 5);</span> var y = aleatorio (1, 5);</span>
11
12     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">// We draw every other stem on the right or the left so they're</span> / / Dibujamos cada tallo otro a la derecha oa la izquierda por lo que son</span>
13     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">// spaced out in the seed.</span> / / Espaciados en la semilla.</span>
14     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">if (i % 2 == 0) {</span> if (i% 2 == 0) {</span>
15         <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">throughPoint = new Point(p1.x + random(1, 3), p1.y - y);</span> través de punto = nuevo punto (p1.x + aleatorio (1, 3), p1.y - y);</span>
16         <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">toPoint = new Point(p1.x + random(5, 35), p1.y - 20 - y);</span> toPoint = new Point (p1.x + random (5, 35), p1.y - 20 - y);</span>
17     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">} else {</span> Else {}</span>
18         <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">throughPoint = new Point(p1.x - random(1, 3), p1.y - y);</span> través de punto = new Point (p1.x - random (1, 3), p1.y - y);</span>
19         <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">toPoint = new Point(p1.x - random(5, 35), p1.y - 20 - y);</span> toPoint = new Point (p1.x - random (5, 35), p1.y - 20 - y);</span>
20     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
21
22     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">path.arcTo(throughPoint, toPoint);</span> path.arcTo (través de punto, toPoint);</span>
23
24     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">// Now we put the circle at the tip of the flutter.</span> / / Ahora ponemos el círculo en la punta del aleteo.</span>
25     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">circle = new Path.Circle(toPoint, 2);</span> círculo = new Path.Circle (toPoint, 2);</span>
26     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">circle.fillColor = '#fff3c9';</span> circle.fillColor = '# fff3c9';</span>
27 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
Ahora que hemos llegado a la semilla, tenemos que gestionar, y más tarde, vamos a querer mover y rotar la misma. La semilla se compone de un montón de partes, y no quiero tener que gestionar cada uno por separado. Paper.js tiene un buen grupo de objetos. Grupos de asociar un conjunto de objetos juntos para que podamos manipular a la vez.
1 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var group = new Group();</span> var grupo = new Grupo ();</span>
2 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">group.addChild(bottom);</span> group.addChild (abajo);</span>
3 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">group.addChild(stem);</span> group.addChild (madre);</span>
4
5 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">this.group = group;</span> this.group = grupo;</span>
El último paso es empaquetar nuestra semilla en un objeto reutilizable llamada Seed . Añadimos todo el código que hemos estado escribiendo una nueva función con el nombre de Seed y agregar una función para crear las variables iniciales. En este ejemplo se llama a esa función create , pero puede que sea lo que quieras.
1 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">function Seed() {</span> Semilla function () {</span>
2
3    <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">this.create = function (/*Point*/ p, /*boolean*/ shortStem) {</span> this.create = function (/ * punto * / p, / * boolean * / shortStem) {</span>
4    <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">…</span> ...</span>
El create función dibuja la semilla a la hora especificada punto , y el shortStem booleano nos dice si se trata de un tallo corto. Pronto nos ocuparemos de tallo corto semillas un poco más tarde. Este tipo de funciones no funcionan como constructores en JavaScript, pero son compatibles con PaperScript.
1 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var seed = new Seed()</span> de semillas de semillas de var = nuevo ()</span>
2 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">seed.create(new Point(100, 100), false);</span> seed.create (nuevo punto (100, 100), false);</span>
Nuestras semillas se verá así cuando los dibuja: screenshot La Seed objeto atrae nuestras semillas de diente de león al azar. Ahora podemos añadir a nuestra flor.

Añadir un poco de caos

Las semillas se verá mejor cuando el espacio fuera de todo el círculo de nuestra bombilla de diente de león para sentirse como un halo de semillas. El bulbo es un círculo, y el círculo es un camino, por lo que puede obtener cada punto de la ruta.
01 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var bulb = new Path.Circle(toPoint, 10); bulb.fillColor = '#567e37';</span> var = nuevo foco Path.Circle (toPoint, 10); bulb.fillColor = '# 567e37';</span>
02
03 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var angle = 360 / bulb.length;</span> var = ángulo de 360 ​​/ bulb.length;</span>
04 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var seeds = [];</span> semillas var = [];</span>
05
06 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">for (var i = 0; i < bulb.length; i++) {</span> for (var i = 0; i <bulb.length; i + +) {</span>
07     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var seed = new Seed()</span> de semillas de semillas de var = nuevo ()</span>
08     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">seed.create(bulb.getPointAt(i));</span> seed.create (bulb.getPointAt (i));</span>
09
10     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">// Rotate each seed so that it points out from the bulb</span> / / Rotar cada semilla de manera que apunte hacia fuera de la bombilla</span>
11     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">seed.rotate(i * angle);</span> seed.rotate (i ángulo *);</span>
12     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">seeds.push(seed);</span> seeds.push (semilla);</span>
13 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
Esto hará que un círculo de semillas alrededor de la bombilla, pero dejan un espacio en el centro. Vamos a añadir unas cuantas semillas más para llenar en el centro. Estamos dando a los centros de semillas de corto surge de modo que muestren el blanco de los mechones más que el beige de los tallos.
1 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">for (var i = 0; i < 18; i++) {</span> for (var i = 0; i <18; i + +) {</span>
2     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var seed = new Seed()</span> de semillas de semillas de var = nuevo ()</span>
3     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var point = new Point(toPoint.x + random(-3, 3),</span> var punto = new Point (toPoint.x + aleatoria (-3, 3),</span>
4                           <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">toPoint.y + random(-3, 3));</span> toPoint.y + aleatorio (-3, 3));</span>
5     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">seed.create(new Point(toPoint), true);</span> seed.create (new Point (toPoint), true);</span>
6     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">seed.rotate(random(0, 360));</span> seed.rotate (aleatorio (0, 360));</span>
7     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">seeds.push(seed);</span> seeds.push (semilla);</span>
8 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
Las semillas en el centro será montón al azar, y haremos el diente de león mira muy bien desordenado. Ahora podemos hacer que vuele.

La animación de The Seeds

Viento empuja las semillas en patrones complejos, y dos semillas nunca soplar la misma manera. Queremos que se vean reales, por lo que vamos a necesitar un poco más de aleatoriedad. La reproducción de viento real es demasiado complicado, así que vamos a hacer que las semillas flotando en un patrón aleatorio de aspecto. Cada semilla se le asigna un punto aleatorio en el lado derecho de la pantalla como un destino final:
1 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">this.dest = new Point(1800, random(-300, 1100));</span> this.dest = new Point (1800, al azar (-300, 1100));</span>
El rotateMove función de cada semilla lleva hacia su punto de destino y lo hace girar. Podemos trabajar con nuestro objeto de semillas como un grupo para rotar y mover con una sola función.
01 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">this.rotateMove = function(/*int*/ angle) {</span> this.rotateMove = function (/ * int * / ángulo) {</span>
02     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">if (this.group.position.x < 850 && this.group.position.y < 650) {</span> if (<850 && this.group.position.x this.group.position.y <650) {</span>
03         <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var vector = this.dest - this.group.position;</span> var = vector this.dest - this.group.position;</span>
04         <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">this.group.position += vector / 150;</span> this.group.position + = vector / 150;</span>
05
06         <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">this.angle += angle;</span> this.angle + = ángulo;</span>
07         <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">this.group.rotate(angle);</span> this.group.rotate (ángulo);</span>
08     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">} else {</span> Else {}</span>
09         <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">this.isOffScreen = true</span> this.isOffScreen = true</span>
10     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
11 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
Esta función se moverá la semilla hasta que es fuera de la pantalla. Llamar rotateMove para cada fotograma de la animación hará que el flotador de semillas a través de la pantalla. Paper.js nos da una manera fácil de hacer animaciones con la onFrame la función, cuando ponemos en práctica onFrame , Paper.js lo llamará para cada fotograma de la animación. Con cada marco, repetir cada semilla y se mueven por la pantalla.
1 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">function onFrame(event) {</span> función de onFrame (evento) {</span>
2     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">for (var i = 0; i < seedCount; i++) {</span> for (var i = 0; i <seedCount; i + +) {</span>
3         <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">if (!seeds[i].isOffscreen()) {</span> if (! semillas [i]. IsOffscreen ()) {</span>
4             <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">seeds[i].rotateMove(random(2, 4));</span> semillas [i] rotateMove (random (2, 4)).;</span>
5         <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
6     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
7 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
Las semillas se deslizan y giran un poco más cerca al punto de destino con cada fotograma de la animación. A partir de todas las semillas en el mismo punto y final a la medida, aparte hace muy bien el espacio a medida que se mueven. screenshot No queremos que todas las semillas que caen a la vez, así que vamos a utilizar un temporizador para que se alejen.
1 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">function start() {</span> inicio function () {</span>
2     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">var id = setInterval(function() {</span> var id = setInterval (function () {</span>
3         <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">seedCount++;</span> seedCount + +;</span>
4         <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">if (seedCount === seeds.length) {</span> if (seedCount seeds.length ===) {</span>
5             <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">clearInterval(id);</span> clearInterval (id);</span>
6         <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
7     <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}, 1000);</span> }, 1000);</span>
8 <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
El temporizador de espera durante un segundo antes de liberar la semilla que viene, dando una sensación de diente de león nuestra flotante agradable. Un poco de hierba verde y cielo azul como imagen de fondo para nuestra canvas lo pone todo en su contexto. Ahora tenemos un diente de león con las semillas que flotan en la brisa. screenshot Ver el diente de león corriendo de aquí . Usted puede editar y ejecutar el código fuente como parte de la animación o descargarlo de la página de GitHub de diente de león .

Paper.js en el mundo real

Paper.js tiene algunos ejemplos impresionantes y un buen modelo de codificación, pero usted debe saber algunas trampas antes de usarlo en su sitio web.

No funciona en navegadores antiguos

Todos los dibujos Paper.js utilizar el canvas la etiqueta y requieren HTML5. Esto significa que se requiere Internet Explorer 9 +, Firefox 4 +, Safari o Chrome 5 +. Si su sitio web debe ser compatible con los navegadores más antiguos, entonces usted no será capaz de utilizar canvas . No hay manera de evitar este requisito, si usted necesita los navegadores más antiguos, que está fuera de suerte. A medida que el sitio web de Paper.js dice: " Vamos a seguir adelante! ".

El rendimiento puede ser lento

Paper.js puede hacer que un navegador detendría incluso si el navegador soporta HTML5. Pixar vuelve a Buzz y Woody en enormes granjas de servidores - lo único que consigue es MacBook barata del usuario. No sólo son las computadoras portátiles más lentos que los clústeres de servidores, pero los navegadores empeorar las cosas que hacen que el canvas la etiqueta con la CPU en lugar de la GPU . Juegos como Halo y Rage aprovechar el procesador gráfico en su tarjeta de vídeo para hacer lanzadores de cohetes y mutantes. La CPU es menos eficiente con los gráficos, por lo que el mismo equipo que se encarga de complejos juegos de video sin problemas puede hacer que las semillas de diente de león flotante mira lenta y desigual. Asegúrese de probar todas sus animaciones con hardware más lento, y ver el uso de la CPU. Utilice los grupos para reducir al mínimo los cálculos, y tener mucho cuidado con lo que haces en cada invocación de la onFrame función.

Los dispositivos móviles son más lentas

El rendimiento móvil es aún peor. La mayoría de dispositivos móviles admiten canvas , pero la mayoría son demasiado lentos para hacer que canvas y animaciones. Dispositivos aún más poderosos, como el iPad 2, no puede manejar las semillas de diente de león sin problemas.

No es compatible con eventos de nivel de objeto

Otras bibliotecas de dibujo, como SVG (ver más abajo), el apoyo a nivel de objeto eventos de ratón y teclado. Estos acontecimientos hacen que sea fácil de responder cuando una ruta o un polígono se hace clic, se cernía sobre o tocado. El canvas la etiqueta no es compatible a nivel de objeto eventos. Paper.js tiene algunas funciones básicas para la prueba de posicionamiento , pero es de muy bajo nivel. Usted puede escuchar el ratón y el teclado de eventos en todo el lienzo, pero usted necesita para manejar la cartografía aquellos eventos a los controles individuales.

¿Qué pasa con SVG?

El SVG (Scalable Vector Graphics) especificación fue definida hace 10 años, pero llegó a la vanguardia con las bibliotecas de apoyo tales como Raphaël.js , que hacen que sea fácil de generar imágenes SVG con JavaScript. SVG es potente, funciona bien para imágenes más pequeñas, y es compatible con todo el camino de regreso a Internet Explorer 7 con la conversión a VML (Vector Markup Language). SVG es la mejor opción si lo que necesita para soportar los navegadores más antiguos. Los verdaderos problemas son el soporte SVG con la velocidad, el futuro y los dispositivos móviles. Cada fabricante del navegador está trabajando activamente en la fabricación de canvas más rápido. Safari 5 ya ofrece aceleración de hardware con la GPU para la canvas , y el resto están trabajando en ello. SVG también es compatible en los dispositivos Android. Hay una creciente comunidad en torno canvas , la nueva tecnología que los fabricantes se están centrando en. Ellos están añadiendo nuevas características, corrección de bugs y lo que es mejor cada día.

Otras Bibliotecas lienzo de dibujo

Paper.js no es la única opción para canvas . Processing.js , desde el creador de jQuery , los puertos del procesamiento de lenguaje de programación JavaScript. Es compatible con animaciones y tiene muchos ejemplos . El three.js motor es compatible con canvas y el WebGL biblioteca, y se centra más en 3-D los dibujos. Google Dart también apoyará canvas con una función de representar a los objetos. Paper.js es una biblioteca madura, con una comunidad muy positiva en el Grupo Paper.js Google y muchos ejemplos más impresionantes y bien documentado. Echa un vistazo a algunas de las cosas maravillosas que la gente está haciendo con él.

Más ejemplos Paper.js

El diente de león es sólo el comienzo. A continuación se presentan algunas otras animaciones impresionantes escritos en Paper.js.
  • Ejemplos , Paper.js cuenta con una página llena de ejemplos increíbles. Voronoi es uno de los mejores. Asegúrese de presionar la barra espaciadora para ver los caminos. Más ejemplos se encuentran en la carpeta de GitHub .
  • Nardove , medusas, Ricardo Sánchez se escriben con Paper.js y un estanque koi escrito con Processing.js. Espera un minuto, las medusas son tímidos.
  • " Jardín de nodo en Paper.js ", dijo Andrew Berg
  • " El programa de reciclaje de HBO "Una infografía que he creado con Paper.js para mostrar con qué frecuencia distinta serie de HBO utilizar los mismos actores.
  • " 20 gestos Multi-Touch que usted debe aprender hoy ", creado Zack Grossbart el tutorial interactivo con la ayuda de Paper.js.
¿Dónde está tu amazingness Paper.js?  
0.0/60votes
Voting statistics:
RatePercentageVotes
60%0
50%0
40%0
30%0
20%0
10%0
Click to share thisClick to share this