<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Roll dock &#187; jQuery</title>
	<atom:link href="http://blog.rollstudio.it/it/category/jquery-it/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.rollstudio.it/it/</link>
	<description>Multimedia Design</description>
	<lastBuildDate>Fri, 26 Feb 2010 11:55:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Particelle e canvas</title>
		<link>http://blog.rollstudio.it/it/2009/12/particelle-e-canvas/</link>
		<comments>http://blog.rollstudio.it/it/2009/12/particelle-e-canvas/#comments</comments>
		<pubDate>Thu, 03 Dec 2009 17:26:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[jQuery @it]]></category>
		<category><![CDATA[Lab @it]]></category>
		<category><![CDATA[jquery canvas particle]]></category>

		<guid isPermaLink="false">http://blog.rollstudio.it/?p=236</guid>
		<description><![CDATA[Introduzione In attesa di creare il sito per un nostro cliente, abbiamo pensato di pubblicare una pagina coming soon insolita, interattiva, divertente. Abbiamo deciso di utilizzare il tag &#60;canvas&#62;, definito nelle nuove specifiche HTML 5, per creare delle particelle che potessero interagire con il mouse. Il tag &#60;canvas&#62; &#8220;Canvas&#8221; significa letteralmente tela, ed in effetti [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Introduzione</strong></p>
<p>In attesa di creare il sito per un nostro cliente, abbiamo pensato di pubblicare una pagina coming soon insolita, interattiva, divertente. Abbiamo deciso di utilizzare il tag &lt;canvas&gt;, definito nelle nuove specifiche <a href="http://www.w3.org/html/wg/html5/">HTML 5</a>, per creare delle particelle che potessero interagire con il mouse.</p>
<p><strong>Il tag &lt;canvas&gt;</strong></p>
<p>&#8220;Canvas&#8221; significa letteralmente tela<strong>, </strong>ed in effetti<strong> </strong>questo tag<strong> </strong>rappresenta una vera e propria tela su cui disegnare via javascript. Purtroppo tutte le versioni di Internet Explorer non supportano il tag &lt;canvas&gt;, IE 8 incluso, ma&#8230;.google ci viene in aiuto con il progetto, che definirei perfino salvavita, exCanvas, ovvero una libreria javascript in grado di emulare un tag canvas sfruttando la capacità di Internet Explorer di visualizzare codice <a href="http://www.w3.org/TR/NOTE-VML">VML</a>.</p>
<p><strong>Il codice</strong></p>
<p>Per iniziare inseriamo il tag &lt;canvas&gt; nel codice HTML, insieme alle librerie jQuery ed exCanvas, per abilitare l&#8217;effetto in IE. Andremo a scrivere il codice di gestione della canvas nel file effect.js</p>
<p><code><br />
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"<br />
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;<br />
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;XL visual&lt;/title&gt;<br />
&lt;link href="css/xlvisual.css" rel="stylesheet" type="text/css" /&gt;<br />
&lt;script type="text/javascript" src="js/jquery-1.3.2.min.js"&gt;&lt;/script&gt;<br />
&lt;!--[if IE]&gt;<br />
&lt;script type="text/javascript" src="js/excanvas_r71.js"&gt;&lt;/script&gt;<br />
&lt;![endif]--&gt;<br />
&lt;script type="text/javascript" src="js/effect.js"&gt;&lt;/script&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;canvas id="canvas" width="800" height="600"&gt;&lt;/canvas&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</code></p>
<p>Per prima cosa otteniamo il contesto del canvas, ovvero l&#8217;interfaccia che ci consentirà di disegnare su di essa, e scriviamo il codice per far andare la canvas a tutto schermo. Abbiamo utilizzato <a href="http://www.jquery.com">jQuery</a> per le interazioni con gli elementi HTML. Se non conoscete questa libreria, forse è il caso che andiate a dare uno sguardo, è fantastica!!</p>
<p><code><br />
var hc,wc;<br />
var resize = function() {<br />
hc = $(window).height()-5;<br />
wc = Math.max($(window).width(),800)-5;<br />
$("#canvas").attr("width",wc).attr("height",hc);<br />
}<br />
$(window).resize(resize);<br />
resize();<br />
var c = $("#canvas")[0].getContext("2d");</code></p>
<p>Creiamo ora un oggetto Particella, che gestirà la posizione, lo spostamento ed il disegno della stessa sul canvas</p>
<p><code><br />
var Particella = function(x, y, radius, col) {<br />
this.dx = 0;<br />
this.dy = 0;<br />
this.dradius = 0;<br />
this.rifx = 0;<br />
this.rify = 0;<br />
this.vel = 30;<br />
this.vibracounter = 0;<br />
this.x = x;<br />
this.y = y;<br />
this.radius = radius;<br />
this.radius2 = radius*2;<br />
this.col = col;<br />
this.state = 0;<br />
};<br />
</code><br />
<code><br />
Particella.prototype = {<br />
setRif: function(x, y) {<br />
this.rifx = x;<br />
this.rify = y;<br />
},<br />
draw: function() {<br />
c.fillStyle = this.col;<br />
c.beginPath();<br />
c.arc(this.x,this.y,this.radius,0,2*Math.PI,true);<br />
c.fill();<br />
},<br />
update: function() {<br />
if(Math.abs(mouseX-this.x)&lt;20 &amp;&amp; Math.abs(mouseY-this.y)&lt;20) {<br />
if(this.state==0) {<br />
this.state = 1;<br />
this.dx = this.rifx+Math.random()*200-100;<br />
this.dy = Math.random()*hc;<br />
this.vel = 30;<br />
} else if(this.state==1) {<br />
this.vibracounter = Math.round(Math.random()*20+10);<br />
}<br />
}<br />
switch(this.state) {<br />
case 0:<br />
this.vibraLinea();<br />
break;<br />
case 1:<br />
this.vibraTutto();<br />
break;<br />
}<br />
this.x += (this.dx-this.x)/this.vel;<br />
this.y += (this.dy-this.y)/this.vel;<br />
},<br />
vibraLinea: function() {<br />
if(this.vibracounter==0) {<br />
this.vel = 20;<br />
this.dx = this.rifx+Math.random()*20-10;<br />
this.dy = this.rify+Math.random()*20-10;<br />
this.vibracounter = Math.round(Math.random()*5+5);<br />
}<br />
this.vibracounter--;<br />
},<br />
vibraTutto: function() {<br />
if(Math.abs(this.dx-this.x)&lt;5 &amp;&amp; Math.abs(this.dy-this.y)&lt;5){<br />
this.state = 0;<br />
return;<br />
}<br />
}<br />
};</code></p>
<p>La funzione <em>draw </em>è responsabile del disegno di una particella, è piuttosto semplice, imposta il colore di riempimento di una pallina, disegna un arco di 360° e ne chiede il riempimento.</p>
<p>La funzione <em>update </em>è responsabile del calcolo della posizione di una pallina per ogni frame. Abbiamo previsto 2 possibili stati di moto, uno casuale intorno ad un punto (gestito dalla funzione <em>vibraLinea</em>), ed un altro che si innesca quando si passa con il mouse vicino ad una particella (gestito dalla funzione <em>vibraTutto</em>). Queste 2 funzioni impostano la posizione verso la quale si desidera far muovere la pallina. Ad ogni frame, la funzione update fa avvicinare la pallina dalla sua posizione attuale a quella di arrivo precedentemente impostata dalle funzioni <em>vibraLinea </em>o <em>vibraTutto</em>.</p>
<p>Procediamo al setup del canvas, alla creazione delle Particelle e ad impostare il loop che andrà ad animare il tutto</p>
<p><code><br />
var numParticelle = 100;<br />
var colori = ["#00FFFF","#FFFF00","#FF00FF"];<br />
var numColori = colori.length;<br />
var part = new Array(numParticelle);<br />
</code></p>
<p>Abbiamo dichiarato il numero delle particelle, i 3 possibili colori ed una matrice che conterrà tutti gli oggetti particella che andremo a creare.</p>
<p><code><br />
var creaParticelle = function() {<br />
var x,y = hc/2;<br />
for(var i=0;i&lt;numParticelle;i++) {<br />
x = Math.random()*wc;<br />
part[i] = new Particella(x,y, Math.random()*5.5+0.5, colori[Math.round(Math.random()*(numColori-1))]);<br />
part[i].setRif(x,y);<br />
}<br />
}<br />
</code><br />
<code><br />
var setup = function() {<br />
creaParticelle();<br />
c.clearRect(0, 0, wc, hc);<br />
c.fillStyle = "#1B2209"<br />
c.fillRect(0, 0, wc, hc);<br />
}<br />
</code></p>
<p>Abbiamo scritto la funzione di setup, che crea 100 particelle con colore e posizione casuali e procede a disegnare uno sfondo verde.</p>
<p><code><br />
var draw = function() {<br />
c.clearRect(0, 0, wc, hc);<br />
c.fillStyle = "#1B2209"<br />
c.fillRect(0, 0, wc, hc);<br />
for(var i=0;i&lt;numParticelle;i++) {<br />
part[i].update();<br />
part[i].draw();<br />
}<br />
window.setTimeout(draw,0);<br />
}<br />
</code></p>
<p>Abbiamo dichiarato la funzione principale del loop di disegno, che ripulisce lo sfondo del canvas e, per ogni particella, richiama i metodi <em>update</em>, per aggiornarne la posizione e <em>draw</em>per disegnarla. Infine la funzione draw imposta un timer da eseguire appena possibile (il ritardo 0 serve a questo) che richiamerà nuovamente il loop principale.</p>
<p><code><br />
setup();<br />
window.setTimeout(draw,0);<br />
</code></p>
<p>Abbiamo finito. basterà ora richiamare il <em>setup</em>, e far partire il loop principale con <em>window.setTimeout</em><br />
L&#8217;effetto in questione è visibile su <a href="http://www.xlvisual.it">http://www.xlvisual.it</a></p>
<p>Nella versione online, lo script è leggermente più complesso, per gestire meglio l&#8217;emulazione per IE con exCanvas. Infatti, la tecnologia VML adotta un approccio completamente diverso per il disegno degli elementi grafici, i quali non vengono disegnati su una tela, una bitmap, come nel caso del canvas, ma sono dei veri e propri elementi vettoriali descritti mediante dei tag. Per questo motivo, risulta molto più veloce spostare questi elementi vettoriali, piuttosto che ridisegnarli ogni volta. Non è il caso di addentrarci in ulteriori dettagli. Chi fosse interessato potrà leggere il codice in produzione all&#8217;indirizzo <a href="http://www.xlvisual.it">http://www.xlvisual.it</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rollstudio.it/it/2009/12/particelle-e-canvas/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

