<?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>isantander.com</title>
				<atom:link href="http://www.isantander.com/feed/" rel="self" type="application/rss+xml"/>
				<link>http://www.isantander.com</link>
				<description>javascript, html5, canvas, Android y demÃ¡s cosas divertidas...</description>
				<lastBuildDate>2012-02-22</lastBuildDate>
				<generator>isantander.com feeder proyect</generator>
				<language>en</language>
				<sy:updatePeriod>hourly</sy:updatePeriod>
				<sy:updateFrequency>1</sy:updateFrequency><item><title>Trayectoria circular con Canvas</title><link>http://www.isantander.com/articulo/trayectoria_circular_con_canvas</link><comments>http://www.isantander.com/articulo/trayectoria_circular_con_canvas#comments</comments><pubDate>2011-07-31</pubDate><dc:creator>Israel Santander</dc:creator><category><![CDATA[Canvas,html5]]></category><guid isPermaLink='true'>http://www.isantander.com/articulo/trayectoria_circular_con_canvas</guid><description>Canvas permite animar objetos siguiendo todo tipo de trayectorias. En este tutorial, vamos a ver como mover un objeto a través de una trayectoria c...</description><content:encoded><![CDATA[<p>Canvas permite animar objetos siguiendo todo tipo de trayectorias. En este tutorial, vamos a ver como mover un objeto a través de una trayectoria circular. Por suerte, no es necesario escribir mucho código ni tampoco tener muchos conocimientos de trigonometría.</p>
<p>El concepto es simple. Solamente necesitamos conocer el círculo sobre el que queremos mover el objeto, e ir variando el ángulo en casa paso de la animación.</p>

<h3>Pasos a seguir:</h3>
<p>
<ul>
	<li>Esqueleto del documento HTML5</li>
	<li>Crear el bucle de la animación</li>
	<li>Dibujar el círculo que usaremos como trayectoria</li>
	<li>Dibujar y animar un objeto siguiendo la trayectoria circular</li>
</ul>	
</p>

<h3>Esqueleto del documento HTML5:</h3>
<pre class='brush: xml;'>

&lt;!DOCTYPE HTML&gt;
&lt;html&gt;
	&lt;head&gt;
		&lt;title&gt;Animación con trayectoria circular&lt;/title&gt;
		&lt;script type='text/javascript&gt;

		&lt;script&gt;
	&lt;/head&gt;
	&lt;body&gt;
		&lt;canvas id ="canvas" width="400" height="400" &gt;&lt;/canvas&gt;
	&lt;/body&gt;
&lt;/html&gt;

</pre>

<p>Hasta ahora sólo hemos creado un esqueleto de un documento HTML5 al que se le ha añadido una etiqueta <i>canvas</i> de 400x400 a  la que se le ha puesto en el documento css un borde y un color de fondo.</p>

<h3>Crear el bucle de la animación:</h3>
<p>Vamos a añadir un botón para iniciar y parar la animación, para ello, añadimos el siguiente código debajo de la etiqueta canvas:</p>

<pre class='brush: xml;'>

&lt;div id='controles'&gt;
	&lt;input type="button" value="Iniciar/Parar" id="iniciar" onclick="init()"&gt;
&lt;/div&gt;

</pre>

<p>Ahora, dentro de la sección javascript, añadimos lo siguiente:</p>

<pre class='brush: js'>

//Declaración de variables globales
var ctx = null;
var t = null;

function init()
{
	//Obtener el contexto 2d
	if(ctx == null)
		ctx = document.getElementById('canvas').getContext('2d');
		
	//Iniciar la animación si t es null, o pararla si no lo es
	if(t == null)
		t = setInterval("anima()",30);
	else
	{
		clearInterval(t);
		t = null;
	}
}
function anima()
{
	ctx.clearRect(0,0,400,400);
}

</pre>

<p>Al pulsar el botón, se iniciará la animación, llamando a la función <i>anima()</i> 30 veces por segundo, pero como la única instrucción que tiene es <i>ctx.clearRect(0,0,400,400);</i> solamente se limpiará el lienzo constantemente, por lo que todavía no apreciaremos nada visualmente.</p>

<h3>Dibujar el círculo que usaremos como trayectoria: </h3>

<p>Vamos a dibujar un círculo con un radio de 150 píxeles desde el centro de la etiqueta canvas, en nuestro caso, como mide 400x400 el centro es el punto x=200, y=200;</p>

<p> Declaramos la variable global radio, con un valor de 150, así como las variables <i>x</i> e <i>y</i> que marcarán el centro de la circunferencia:</p>

<pre class='brush: js'>
	var ctx = null;
	var t = null;
	var radio = 150;
	var x = 200;
	var y = 200;
</pre>

<p> Y en la función <i>anima()</i>, dibujamos la circunferencia:</p>
<pre class='brush: js'>
function anima()
{
	ctx.clearRect(0,0,400,400);
	ctx.arc(x,y,radio,0,Math.PI*2,true);
	ctx.closePath();
	ctx.stroke();
}
</pre>

<p> Si todo ha ido bien, al pulsar el botón deberíamos  ver algo como esto:</p>
<img src='/app/data/img/trayectoria_circular/trayectoria_circular1.jpg' alt='trayectoria_circular1' />

<h3>Dibujar y animar un objeto siguiendo la trayectoria circular:</h3>

<p>Por fin llegamos al punto en donde animaremos el objeto siguiendo la trayectoria circular, como expliqué antes, solamente tenemos que calcular las posiciones <i>x</i> e <i>y</i> de la circunferencia mientras se va aumentando el ángulo en cada intervalo de la animación, luego dibujamos el objeto que queramos en esas posiciones. Vamos a ver el código, es más simple de lo que parece. </p>

<p>Añadimos unas variables que nos harán falta, <i>tmpx</i> y <i>tmpy</i> serán las posiciones x e y del objeto en movimiento y la variable <i>angulo</i>:</p>

<pre class='brush: js'>
var tmpx = 0;
var tmpy = 0;
var angulo = 0;

</pre>

<p> Y en la función <i>anima()</i> añadimos lo siguiente: </p>

<pre class='brush: js'>

tmpx = x + ( radio*Math.cos(angulo*(Math.PI*2)));
tmpy = y + ( radio*Math.sin(angulo*(Math.PI*2)));
					
angulo += 0.01;
			
ctx.beginPath();
ctx.fillRect(tmpx-10,tmpy-10,20,20);
ctx.fillStyle = 'red';
ctx.fill();
ctx.closePath();

</pre>

<p>Usamos las funciones trigonométricas para calcular las posiciones <i>tmpx</i> y <i>tmpy</i> en función del <i>angulo</i>, luego aumenta el valor del ángulo y dibujamos el objeto animado, en nuestro caso, un cuadrado de color rojo de ancho = 20 y alto = 20. A la hora de dibujarlo: <i>ctx.fillRect(tmpx-10,tmpy-10,20,20);</i>, se corrigen los valores de <i>tmpx</i> y <i>tmpy</i> restándole 10 a cada uno ( la mitad del ancho y alto del cuadrado) para que quede centrado en la trayectoria. El resultado es el siguiente: </p>

<div class='center_iframe'><iframe src='/app/data/iframes/trayectoria_circular/trayectoria_circular1.html'  width='500' height='500'  frameborder="0" scrolling="no" style='margin-left:auto;margin-right:auto;text-align:center;'></iframe></div>
]]></content:encoded><slash:comments>0</slash:comments></item><item><title>Clases con javascript: la propiedad prototype</title><link>http://www.isantander.com/articulo/clases_con_javascript_propiedad_prototype</link><comments>http://www.isantander.com/articulo/clases_con_javascript_propiedad_prototype#comments</comments><pubDate>2011-06-27</pubDate><dc:creator>Israel Santander</dc:creator><category><![CDATA[Javascript]]></category><guid isPermaLink='true'>http://www.isantander.com/articulo/clases_con_javascript_propiedad_prototype</guid><description>
Dentro de las múltiples posibilidades que nos ofrece Javascript, se encuentra la de crear objetos y clases al estilo tradicional. Aunque no es un...</description><content:encoded><![CDATA[<p>
Dentro de las múltiples posibilidades que nos ofrece Javascript, se encuentra la de crear objetos y clases al estilo tradicional. Aunque no es una de las características más conocidas ni utilizadas de este lenguaje, cuyas funciones más habituales son la manipulación del DOM, validaciones y  peticiones AJAX,  la posibilidad de  programar utilizado el paradigma POO se vuelve cada vez más útil y necesario, sobre todo desde la llegada del estándar HTML5, que abre un nuevo abanico de posibilidades al mundo Javascript. 
</p>
<p>
A pesar de que todo lo que se puede hacer con clases y objetos en Javascript,  se puede hacer sin ellas, no cabe duda que la programación orientada a objetos nos ofrece una serie de ventajas y "comodidades" que cuanto menos, son dignas de mencionarse.
</p>
<h3>Comenzamos:</h3>
<p>
Javascript es un lenguaje orientado a prototipos,  por lo tanto, la sintaxis que se utiliza para la creación de clases es ligeramente diferente a lo que estamos acostumbrados en otros lenguajes más tradicionales.
</p>
<p>
<i>Nota:  Existen multitud de formas de crear objetos y clases en Javascript, pero en este tutorial solamente se va a explicar una de ellas.</i>
</p>
<h3>Constructor: </h3>
 <pre class='brush: js;'>
	function Persona()
	{
	}
	var juan = new Persona();
	var pepe = new Persona();
</pre>
<p>Y así de fácil hemos creado una clase en Javascript. Esto es así porque como hemos dicho anteriormente, estamos tratando con un lenguaje basado en prototipos, y cada función sirve como constructor de un objeto. </p>
<h3>Propiedades o atributos:</h3>
<p>
Las propiedades o variables de clase, son los atributos que definen cada objeto instanciado. Una clase puede tener o no atributos, y en Javascript, como  en muchos otros lenguajes se referencian utilizando la palabra reservada <i>this</i> seguido de un punto y el nombre de la propiedad.
</p>
<pre class='brush: js;'>
function Persona(nombre)
{
	this.nombre = nombre;
	alert('Me llamo '+this.nombre);
}
var juan = new Persona('Juan');
var pepe = new Persona('Pepe');
</pre>
<p>En el ejemplo anterior,  hemos creado la clase Persona, a la que le hemos de pasar el atributo nombre para almacenarlo como propiedad del objeto.
<p>Podemos acceder o modificar los valores de los atributos muy fácilmente , ya que tan solo tenemos que seguir la sintaxis: <i>nombre_del_objeto.atributo</i>, lo vemos mejor en el siguiente ejemplo:</p>
<pre class='brush: js;'>
function Persona(nombre)
{
	this.nombre = nombre;
}
var juan = new Persona('Juan');
alert('me llamo '+juan.nombre);
juan.nombre = 'Juan Perez';
alert('ahora me llamo '+juan.nombre);
</pre>
<h3>Métodos</h3>
<p>
Los métodos son las acciones que puede realizar el objeto y con ellos puede interactuar con sus atributos o variables externas.
</p>
<p>
Llegados a este punto, es hora de conocer la propiedad <i>prototype</i>, que nos permite agregar atributos o métodos a un objeto o clase. También veremos la posibilidad que nos ofrece Javascript para igualar variables a funciones,  que dota de una increíble flexibilidad a este lenguaje. Quién haya programado en algún lenguaje orientado a objetos como Java o C++ ,verá aquí las principales diferencias de sintaxis que se han mencionado anteriormente.
</p>
<pre class='brush: js;'>
function Persona(nombre)
{
	this.nombre = nombre;
}
//Aquí creamos el método de la clase:
Persona.prototype.decirNombre =  function()
{	
	alert(this.nombre);
};
var juan = new Persona('Juan');
juan.decirNombre();
</pre>
<p>
Como vemos, la forma para crear métodos de clase dista bastante de otros lenguajes, pero por suerte siempre se sigue el mismo patrón:
<i>Nombre_de_la_clase.prototype.nombre_del_metodo = function(parametros){ ...código del método...}</i>
</p>
<p>Vamos a ver ahora un ejemplo un poco más completo con un método con parámetros:</p>
<pre class='brush: js;'>
function Persona(nombre)
{
	this.nombre = nombre;
}
//Método con parámetros:
Persona.prototype.addDatosPersona = function(apellidos,edad)
{
	this.apellidos = apellidos;
	this.edad = edad;
}
Persona.prototype.decirDatos=  function()
{	
	alert('Nombre completo: '+this.nombre+' '\
	+this.apellidos+', edad: '+this.edad);
};
var juan = new Persona('Juan');
juan.addDatosPersona('Perez Martín', 34);
juan.decirDatos();
</pre>
<p> Hemos añadido el método addDatosPersona, que requiere los parámetros <i>apellidos</i> y <i>edad</i>. Para llamarlo <i> juan.addDatosPersona('Perez Martín', 34);</i>.
<h3>Herencia:</h3>
La herencia consiste en crear una clase <i>hija </i> a partir de otra clase base o padre, normalmente añadiendo características propias como atributos o métodos a los ya existentes en la clase <i>padre</i>. Esto puede resultar muy útil cuando tratamos con aspectos que tienen elementos en común, pero otros que se diferencian entre sí. Javascript solamente permite la herencia de clases individuales.
Veamos un ejemplo, una clase genérica o padre <i>Vehículo</i>, que contiene los elementos comunes a los distintos vehículos que trate el programa. Y además una subclase o clase hijas<i>coche</i>, que añade características propias de un coche:
<pre class='brush: js;'>
//Clase padre
function Vehiculo(marca,color,velocidad)
{
	this.marca = marca;
	this.color = color;
	this.velocidad = velocidad;
}
Vehiculo.prototype.decirVelocidad = function()
{
	alert('El vehículo tiene una velocidad de  '+this.velocidad+' km/h');
}
Vehiculo.prototype.caracteristicas = function{};
</pre>
<p>
Ya tenemos nuestra clase base, que consta de los parámetros <i>marca, color </i> y <i>velocidad</i>, además de los métodos <i>avanzar()</i> y <i>caracteristicas()</i>.
El método avanzar nos dirá la velocidad del vehículo, mientras que el método características está vacío, para poder ver la capacidad de las clases hijas de sobreescribir   los métodos de la clase padre.
</p>
<pre class='brush: js;'>
//Clase hija coche
function Coche(marca,color,velocidad ,puertas)
{
	//Llamamos al constructor  de la clase padre y le pasamos
// los parámetros correspondientes
	Vehiculo.call(this, marca,color,velocidad);
	this.puertas = puertas;
}
//Aquí hacemos que la clase coche herede de la clase <i>Vehiculo</i>:
Coche.prototype = new Vehiculo();
//sobreescribir el método <i>caracteristicas()</i>
Coche.prototype.caracteristicas = function()
{
	alert('Marca:'+this.marca+',color:'+this.color+',velocidad:'\
+this.velocidad+'Puertas:'this.puertas);
};
Coche.prototype = new Coche();
var citroen = new Coche('Citroen','Rojo',100,5);
citroen.decirVelocidad();
citroen.caracteristicas();
</pre>
<p>
Del último ejemplo cabe descatar la sentencia : <i> Vehiculo.call(this, marca,color,velocidad);
</i>, que llama al constructor de la clase padre. También hay que destacar la sentencia:<i> Coche.prototype = new Vehiculo();</i>, que se encarga de hacer que los objetos de la clase coche sean instancias de la clase Vehiculo. Además, el método <i>decirVelocidad()</i> de la clase coche sobreescribe al método de la clase padre.
</p>
]]></content:encoded><slash:comments>1</slash:comments></item></channel></rss>
