<?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>Nazarí González &#187; Tutoriales</title>
	<atom:link href="http://www.nazariglez.com/category/tutoriales/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.nazariglez.com</link>
	<description>Un Blog sobre sistemas, redes, programación web, utilidades, tecnología y otras curiosidades.</description>
	<lastBuildDate>Wed, 01 May 2013 08:30:20 +0000</lastBuildDate>
	<language>es-ES</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>[Tutorial PHP] Relación entre clases y restricción de tipos.</title>
		<link>http://www.nazariglez.com/2013/03/13/tutorial-php-relacion-entre-clases-y-restriccion-de-tipos/</link>
		<comments>http://www.nazariglez.com/2013/03/13/tutorial-php-relacion-entre-clases-y-restriccion-de-tipos/#comments</comments>
		<pubDate>Wed, 13 Mar 2013 14:36:34 +0000</pubDate>
		<dc:creator>Nazari</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[poo]]></category>
		<category><![CDATA[programación orientada a objetos]]></category>
		<category><![CDATA[relación de clases]]></category>
		<category><![CDATA[restricción de tipos]]></category>

		<guid isPermaLink="false">http://www.nazariglez.com/?p=1066</guid>
		<description><![CDATA[A lo largo de esta serie de tutoriales hemos visto como crear y trabajar con objetos de diversas formas, pero aun no hemos visto ningún ejemplo en el que una clase interactue con otras mas allá de la herencia. Lo realmente interesante de la programación orientada a objetos es los fácil que resulta que las [...]]]></description>
				<content:encoded><![CDATA[<p>A lo largo de esta serie de tutoriales hemos visto como crear y trabajar con objetos de diversas formas, pero aun no hemos visto ningún ejemplo en el que una clase interactue con otras mas allá de la <a title="[Tutorial PHP] Trabajando con Clases Heredadas" href="http://www.nazariglez.com/2013/02/24/tutorial-php-trabajando-con-clases-heredadas/" target="_blank">herencia</a>.</p>
<p>Lo realmente interesante de la <strong>programación orientada a objetos</strong> es los fácil que resulta que las clases interactuen entre si, sin necesidad de complicarnos la vida. La forma mas sencilla de relacionar dos clases sería instanciando en la clase <em>ClaseUno</em> un objeto de tipo <em>ClaseDos</em>:</p>
<p><em>claseuno.php:</em></p>
<pre class="brush:php">&lt;?php
require_once('clasedos.php');

class ClaseUno
{

    public function miMetodo(){

        $objDos = new ClaseDos();

    }

}

?&gt;</pre>
<p><em>clasedos.php:</em></p>
<pre class="brush:php">&lt;?php

class ClaseDos
{

}

?&gt;</pre>
<p><em>index.php:</em></p>
<pre class="brush:php">&lt;?php
require('claseuno.php');

$obj = new ClaseUno();
$obj-&gt;miMetodo();

?&gt;</pre>
<p>Como vemos solo hemos de requerir el script de <em>ClaseDos</em> en <em>ClaseUno</em> e instanciar el objeto dentro de uno de sus métodos, pero aun podemos complicar algo más la relación. Imagina que tienes una clase para representar un ordenador, el cual se compone a su vez de otros objetos como puede ser la pantalla, tarjeta grafica, ram, etcétera. Ninguno de esos componentes necesita la clase ordenador, pero la clase ordenador requiere de todos ellos para funcionar correctamente, en este caso podemos declarar varios atributos privados para representar todas sus piezas y luego instanciar en el mediante el <a title="[Tutorial PHP] Métodos Mágicos: El constructor y el destructor" href="http://www.nazariglez.com/2013/01/29/tutorial-php-metodos-magicos-el-constructor-y-el-destructor/" target="_blank">método mágico __construct()</a> cada una de ellas:</p>
<p><em>ordenador.php:</em></p>
<pre class="brush:php">&lt;?php
require_once('grafica.php');
require_once('ram.php');
require_once('pantalla.php');
require_once('hdd.php');

class Ordenador
{

    private $_tarjetaGrafica;
    private $_memoriaRam;
    private $_pantalla;
    private $_discoDuro;

    public function __construct(){

        $this-&gt;_pantalla = new Pantalla();
        $this-&gt;_memoriaRam = new Ram();
        $this-&gt;_discoDuro = new DiscoDuro();
        $this-&gt;_tarjetaGrafica = new Grafica();

    }

    public function apagar(){

        $this-&gt;_pantalla-&gt;apagar();
        $this-&gt;_tarjetaGrafica-&gt;ventiladorOff();
        $this-&gt;_discoDuro-&gt;PararDeGirar();
        $this-&gt;_memoriaRam-&gt;limpiar();

    }

}

?&gt;</pre>
<p>De esta forma cada objeto que puede funcionar correctamente por separado son parte esencial de un objeto mucho mas complejo.</p>
<p>Disponemos de otra forma para relacionar nuestras clases, pasando a un método de <em>ClaseUno</em> por parámetro un objeto de <em>ClaseDos</em>, de esta forma el objeto ha sido instanciado fuera de la clase y nosotros nos limitamos simplemente a manipular sus métodos o atributos públicos:</p>
<pre class="brush:php">&lt;?php

class ClaseUno
{

    public function metodoPublico(){
        echo "Hola";
    }

}

class ClaseDos
{

    public function imprimir( $claseUno ){

        $claseUno-&gt;metodoPublico();

    }

}

$obj = new ClaseDos();

$obj-&gt;imprimir( new ClaseUno() ); //Imprime: Hola

?&gt;</pre>
<p>Pero ¿que pasa si le pasamos como parámetros una objeto de clase diferente?, posiblemente nos de un error relacionado con el método que queríamos usar o simplemente la aplicación no funcionará como debería. Para solucionar esto podemos restringir el tipo de objeto que queremos pasar como parámetro añadiendo en el método el nombre de la clase y luego el parámetro:</p>
<pre class="brush:php">public function imprimir(ClaseUno $claseUno){}</pre>
<p>Esto solo nos permitiría que le pasáramos un objeto de <em>ClaseUno</em>, si intentamos pasar un objeto de otra clase nos tiraría un error tipo “<em><strong>Catchable fatal error:</strong> Argument 1 passed to ClaseDos::imprimir() must be an instance of ClaseUno, instance of ClaseTres given &#8230;</em>”. Debemos de tener en cuenta que una clase hija que ha heredado de su clase padre tiene dos tipos, el de la clase propia y el de su clase padre, por lo que si restringimos el tipo a la clase padre, podemos pasarle una instancia de esta y una de la clase hija siendo ambas validas, pero al revés no, si restringimos por clase hija no podremos pasarle un objeto de la clase padre.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nazariglez.com/2013/03/13/tutorial-php-relacion-entre-clases-y-restriccion-de-tipos/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[Tutorial PHP] Usando espacios de nombres (namespaces)</title>
		<link>http://www.nazariglez.com/2013/03/12/tutorial-php-usando-espacios-de-nombres-namespaces/</link>
		<comments>http://www.nazariglez.com/2013/03/12/tutorial-php-usando-espacios-de-nombres-namespaces/#comments</comments>
		<pubDate>Tue, 12 Mar 2013 23:39:04 +0000</pubDate>
		<dc:creator>Nazari</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[espacio de nombres]]></category>
		<category><![CDATA[namespaces]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[poo]]></category>
		<category><![CDATA[programación orientada a objetos]]></category>

		<guid isPermaLink="false">http://www.nazariglez.com/?p=1062</guid>
		<description><![CDATA[Es posible que ya sepas que no se puede tener dos clases o funciones con el mismo nombre porque generan un error tipo “Fatal error: Cannot redeclare …..”, da igual que se encuentren en ficheros diferentes si luego se incluyen en un mismo script, tiene su lógica que PHP genere este error dado que el [...]]]></description>
				<content:encoded><![CDATA[<p>Es posible que ya sepas que no se puede tener dos clases o funciones con el mismo nombre porque generan un error tipo “<em><strong>Fatal error:</strong> Cannot redeclare …..</em>”, da igual que se encuentren en ficheros diferentes si luego se incluyen en un mismo script, tiene su lógica que <strong>PHP</strong> genere este error dado que el no sabe cual de las dos funciones declaradas es la que ha de ejecutar.</p>
<p>Pero en ocasiones por mantener una lógica con los nombres, o porque nuestra aplicación tiene un tamaño considerable podremos necesitar tener dos <a title="[Tutorial PHP] Trabajar con Funciones" href="http://www.nazariglez.com/2012/05/16/tutorial-php-trabajar-con-funciones/" target="_blank">funciones</a>, <a title="[Tutorial PHP] Creando nuestro primer Objeto: ¡Hola Super Mario!" href="http://www.nazariglez.com/2013/01/18/tutorial-php-creando-nuestro-primer-objeto-hola-super-mario/" target="_blank">clases</a>, <a title="[Tutorial PHP] El uso de las constantes en el interior de las clases." href="http://www.nazariglez.com/2013/01/26/tutorial-php-el-uso-de-las-constantes-en-el-interior-de-las-clases/" target="_blank">constantes</a>, etcétera con un mismo nombre, para eso existen los <strong>namespaces</strong>.</p>
<p>Aunque este ejemplo es muy típico he de decir que es realmente sencillo de comprender al verlo, se trata de comparar los namespaces con directorios de archivos, donde en la carpeta <em>A</em> contenemos un fichero llamado <em>miFichero.txt</em>, por lo que no podemos tener otro fichero con el mismo nombre, pero en la carpeta <em>B</em> podemos si podemos tener otro<em> miFichero.txt</em>, y para referirnos a uno u otro usamos el nombre del directorio más el del fichero, <em>A/miFichero.txt</em> y <em>B/miFichero.txt</em>.</p>
<p>Para declarar un espacio de nombre debemos usar la instrucción namespace seguido del nombre que queremos “<em>reservar</em>”, y siempre ha de ser en la linea siguiente al tag de apertura de php:</p>
<p><em>es.php:</em></p>
<pre class="brush:php">&lt;?php

namespace EspacioDeNombreUno;

function prueba(){

    echo "Espacio Uno";

}

?&gt;</pre>
<p>Al hacer esto todas las declaraciones debajo del namespace estarán englobadas por el, y dentro del mismo fichero no hay necesidad de usar ninguna instrucción extra para referirnos a las constantes, funciones o clases declaradas en el.</p>
<p>Creemos otra script que comparta el nombre de nuestra función, por ejemplo:</p>
<p><em>esdos.php:</em></p>
<pre class="brush:php">&lt;?php

namespace EspacioDeNombreDos;

function prueba(){

    echo "Espacio Dos";

}

?&gt;</pre>
<p>Ahora si queremos usar ambas constantes dentro de un mismo script deberemos de indicar mediante la sintaxis “<em>namespace</em>” + “\” + &#8220;<em>nombre del elemento a llamar</em>”:</p>
<pre class="brush:php">&lt;?php

require('es.php');

require('esdos.php');

EspacioDeNombreDos\prueba(); //Imprime: Espacio Dos

EspacioDeNombreUno\prueba(); //Imprime: Espacio Uno

?&gt;</pre>
<p>Como puedes ver hemos llamado a la función <em>prueba</em> indicándole en que namespace estaba la que queríamos reclamar y no ha generado ningún error por repetir el nombre.</p>
<p>Al igual que con un árbol de directorios podemos crear un árbol de namespaces añadiendo la barra invertida y un nombre a la declaración, por ejemplo:</p>
<pre class="brush:php">&lt;?php

namespace EspacioDeNombreUno;

function prueba(){

    echo "Espacio Uno";

}

namespace EspacioDeNombreUno\SubEspacio;

function prueba(){

    echo "Sub Espacio";

}

?&gt;</pre>
<p>Y para llamar a la función se realiza de la forma normal pero añadiendo el subdirectorio:</p>
<pre class="brush:php">&lt;?php

require('es.php');

EspacioDeNombreUno\prueba(); //Imprime: Espacio Uno

EspacioDeNombreUno\SubEspacio\prueba(); //Imprime: Sub Espacio

?&gt;</pre>
<p>Todo esto es muy útil, pero el tener que añadir el nombre de espacio más el sub-espacio cada vez que llamamos a una función o a cualquier otro elemento hace pesado y lento el desarrollo, para solucionar esto podemos <strong>asignarle un alias</strong> para indicarle al motor cual vamos a usar:</p>
<pre class="brush:php">&lt;?php

require('es.php');

use EspacioDeNombreUno\SubEspacio as subEs;

subEs\prueba(); //Imprime: Sub Espacio

?&gt;</pre>
<p>En caso de que no incluyas en la sentencia el “<em>as Alias</em>”, el motor concluirá que el alias es la ultima parte del árbol de namespaces, por lo que use <em>EspacioDeNombreUno\SubEspacio</em> dará como alias <em>SubEspacio</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nazariglez.com/2013/03/12/tutorial-php-usando-espacios-de-nombres-namespaces/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[Tutorial PHP] Extendiendo clases con Traits</title>
		<link>http://www.nazariglez.com/2013/03/09/tutorial-php-extendiendo-clases-con-traits/</link>
		<comments>http://www.nazariglez.com/2013/03/09/tutorial-php-extendiendo-clases-con-traits/#comments</comments>
		<pubDate>Sat, 09 Mar 2013 22:15:43 +0000</pubDate>
		<dc:creator>Nazari</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[herencia]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[poo]]></category>
		<category><![CDATA[programación orientada a objetos]]></category>
		<category><![CDATA[traits]]></category>

		<guid isPermaLink="false">http://www.nazariglez.com/?p=1051</guid>
		<description><![CDATA[Ahora que hemos visto la herencia y las interfaces es el momento de hablar de los Traits. Como ya sabemos podemos extender las funcionalidades de una clase gracias a la herencia, pero PHP es un lenguaje que no permite la herencia de múltiples clases, esto quiere decir que una clase “hija” no puede heredar de [...]]]></description>
				<content:encoded><![CDATA[<p>Ahora que hemos visto <a title="[Tutorial PHP] Trabajando con Clases Heredadas" href="http://www.nazariglez.com/2013/02/24/tutorial-php-trabajando-con-clases-heredadas/" target="_blank">la herencia</a> y las <a title="[Tutorial PHP] Implementar Interfaces" href="http://www.nazariglez.com/2013/03/08/tutorial-php-implementar-interfaces/" target="_blank">interfaces</a> es el momento de hablar de los <em><strong>Traits</strong></em>. Como ya sabemos podemos extender las funcionalidades de una clase gracias a la herencia, pero <em>PHP</em> es un lenguaje que no permite la herencia de múltiples clases, esto quiere decir que una clase “<em>hija</em>” no puede heredar de más de una clase “<em>padre</em>” a la vez.</p>
<p>Para lograr simular algo parecido a la herencia múltiple existen los Traits. La forma de declararlos es similar a como declaramos una clase, salvo porque un Trait no puede ser instanciado, como una interfaz, pero a diferencia de la interfaz sus métodos si contienen cuerpo, veamos un ejemplo:</p>
<pre class="brush:php">trait MiTrait {

    public function metodoUno(){

        echo "Método uno. ";

    }

    public function metodoDos(){

        echo "Método dos. ";

    }

}</pre>
<p>Para usarlos en una clase solo hay que usar la instrucción <em>use</em> después de declarar la clase:</p>
<pre class="brush:php">class MiClase{

    use MiTrait;

    public function __construct(){

        $this-&gt;metodoUno();

    }

}</pre>
<p>Tambien podemos definir métodos abstractos de la misma forma que se definen en una <a title="[Tutorial PHP] Clases abstractas." href="http://www.nazariglez.com/2013/03/02/tutorial-php-clases-abstractas/" target="_blank">clase abstracta</a>, y así obligar a definir ese método en la clase que use el trait:</p>
<pre class="brush:php">class MiClase{

    use MiTrait;

    public function __construct(){

        $this-&gt;metodoUno();

    }

    abstract public metodoAbstracto();

}</pre>
<p>Pero la potencia de los traits va mas allá, ya que php nos permite usar varios dentro de una misma clase separando sus nombres mediante una coma “<em>,</em>”:</p>
<pre class="brush:php">class MiClase{

    use MiTrait , MiTraitDos;

    public function __construct(){

        $this-&gt;metodoUno();

    }

}</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.nazariglez.com/2013/03/09/tutorial-php-extendiendo-clases-con-traits/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[Tutorial PHP] Implementar Interfaces</title>
		<link>http://www.nazariglez.com/2013/03/08/tutorial-php-implementar-interfaces/</link>
		<comments>http://www.nazariglez.com/2013/03/08/tutorial-php-implementar-interfaces/#comments</comments>
		<pubDate>Fri, 08 Mar 2013 23:33:17 +0000</pubDate>
		<dc:creator>Nazari</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[interfaces]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[poo]]></category>
		<category><![CDATA[programación orientada a objetos]]></category>

		<guid isPermaLink="false">http://www.nazariglez.com/?p=1046</guid>
		<description><![CDATA[Las interfaces nos permiten definir que métodos deben de ser declarados en una clase de forma similar a como lo hacíamos con las clases abstractas cuando no le dábamos cuerpo a los métodos. La principal diferencia es que no se hereda de una interfaz, se implementa, por lo que podemos heredar de una clase padre [...]]]></description>
				<content:encoded><![CDATA[<p><strong>Las interfaces</strong> nos permiten definir que métodos deben de ser declarados en una clase de forma similar a como lo hacíamos con las <a title="[Tutorial PHP] Clases abstractas." href="http://www.nazariglez.com/2013/03/02/tutorial-php-clases-abstractas/" target="_blank">clases abstractas</a> cuando no le dábamos cuerpo a los métodos. La principal diferencia es que no se hereda de una interfaz, se implementa, por lo que podemos heredar de una clase padre y a la vez <strong>implementar una interfaz o más</strong>.</p>
<p>La forma de declarar una interfaz es similar a como declaramos una clase, salvo que en vez de <em>class</em> se utiliza la instrucción <em>interface</em> seguido del nombre de esta:</p>
<pre class="brush:php">&lt;?php

interface MiInterface {

    public function metodoUno( $parametro );

    public function metodoDos( $parametro );

}

?&gt;</pre>
<p>Hay que tener en cuenta que una interfaz no permite definir atributos a implementar en las clases, solo métodos, y estos deberán ser públicos siempre. Se podría decir que la razón de existir de una interfaz es mejorar la forma en que interactúan las clases entre si, conociendo que interfaz implementa una clase sabremos los métodos públicos que deberá tener.</p>
<p>Para implementar una interfaz debemos de añadir en la declaración de la clase la instrucción <em>implements</em> seguido del nombre de nuestra interfaz:</p>
<pre class="brush:php">&lt;?php

class MiClase implements MiInterface {

}

?&gt;</pre>
<p>Pero no debemos de olvidar declarar y asignarles un cuerpo a los métodos nombrados en la interfaz o nos devolverá un error tipo “<em><strong>Fatal error:</strong> Class MiClase contains 2 abstract methods and must therefore be declared abstract or implement the remaining methods (MiInterface::metodoUno, MiInterface::metodoDos)</em>”, lo correcto sería:</p>
<pre class="brush:php">class MiClase implements MiInterface {

    public function metodoUno( $parametro ){
        //Cuerpo aquí
    }

    public function metodoDos( $parametro ){
        //Cuerpo aquí
    }

}</pre>
<p>Como ejemplo de uso de las interfaces imaginemos una moto y un balón de fútbol, aparentemente no tienen nada en común por lo que la idea de heredar de una misma clase no tiene demasiado sentido, pero ambos son objetos que en algún momento se romperán, se puede crear una interfaz que declare el método <em>romper()</em> y implementarlo en las clases de ambos objetos, de esta forma nos aseguramos de que los dos aunque hereden de padres diferentes contienen el método <em>romper()</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nazariglez.com/2013/03/08/tutorial-php-implementar-interfaces/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[Tutorial ImpactJS] Estructura básica de las entidades.</title>
		<link>http://www.nazariglez.com/2013/03/05/tutorial-impactjs-estructura-basica-de-las-entidades/</link>
		<comments>http://www.nazariglez.com/2013/03/05/tutorial-impactjs-estructura-basica-de-las-entidades/#comments</comments>
		<pubDate>Tue, 05 Mar 2013 21:34:06 +0000</pubDate>
		<dc:creator>Nazari</dc:creator>
				<category><![CDATA[Canvas]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[canvas]]></category>
		<category><![CDATA[entidades]]></category>
		<category><![CDATA[Entity]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[ImpactJS]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[videojuegos]]></category>

		<guid isPermaLink="false">http://www.nazariglez.com/?p=1029</guid>
		<description><![CDATA[Hoy voy a hablar un poco de las entidades en ImpactJS, que son, como interactuan con el jugador, etcétera. Pero antes, debes ir al repositorio en github para descargarte la carpeta media, donde están todos los sonidos, música y sprites que vamos a usar durante el desarrollo del juego. Las entidades vienen a ser cualquier elemento [...]]]></description>
				<content:encoded><![CDATA[<p>Hoy voy a hablar un poco de las entidades en <strong>ImpactJS</strong>, que son, como interactuan con el jugador, etcétera. Pero antes, debes ir al repositorio en <a href="https://github.com/Nazariglez/spaceinvaders" target="_blank">github</a> para descargarte la carpeta media, donde están todos los sonidos, música y sprites que vamos a usar durante el desarrollo del juego.</p>
<p>Las entidades vienen a ser cualquier elemento del juego capaz de interactuar con el jugador, con otras entidades o con el sistema en si. Por ejemplo un botón de pause sería una entidad, el personaje del jugador sería otra entidad, los enemigos, las balas, obstáculos, en definitiva todo lo que realice alguna acción de forma activa mediante un evento previo, como un click, un choque con otra entidad, un temporizador, etcétera.</p>
<p>Las entidades en ImpactJS son clases extendidas de <em>ig.Entity</em> y siempre se han de guardar en <em>lib/game/entities/</em>, su estructura básica es esta:</p>
<pre class="brush:javascript">ig.module(
    'game.entities.miEntidad'
)
.requires(
    'impact.entity'
)
.defines(function() {

    EntityMiEntidad = ig.Entity.extend({

        //Constructor
        init: function(x, y, settings) {
            this.parent(x, y, settings);
        }

    });

});</pre>
<p>Revisemos por partes el código, primero tenemos la instrucción <em>ig.module</em>:</p>
<pre class="brush:javascript">ig.module(
    'game.entities.miEntidad'
)</pre>
<p>La cual define el directorio y el nombre del script que contiene la entidad, en este caso <em>game/entities/miEntidad.js</em>, la siguiente instrucción incluye las clases necesarias para que funcione nuestra entidad:</p>
<pre class="brush:javascript">.requires(
    'impact.entity'
)</pre>
<p>Su forma de definir el script es idéntica a la anterior, en este caso requiere el script <em>impact/entity.js</em>, como es lógico es necesaria la clase <em>ig.Entity</em> para poder extender de ella. Por ultimo tenemos:</p>
<pre class="brush:javascript">.defines(function() {

    EntityMiEntidad = ig.Entity.extend({

        //Constructor
        init: function(x, y, settings) {
            this.parent(x, y, settings);
        }

    });

});</pre>
<p>Si nos fijamos el nombre de la clase de nuestra entidad es <em>EntityMiEntidad</em>, esto ha de ser siempre así, me refiero a que hay una nomenclatura establecida en el motor, que es “<em>Entity</em>” mas el nombre del script con la primera letra en mayúsculas y sin extensión, si mi script se llama <em>mula.js</em>, el nombre de la entidad debe ser <em>EntityMula</em>, si no lo hacemos así el motor simplemente no funcionará y se quedará en la barra de carga al inicio, dando un error en la consola javascript. Otro dato importante es que las clases se definen en formato <a href="http://es.wikipedia.org/wiki/JSON" target="_blank"><strong>JSON</strong></a>.</p>
<p>Siempre que nuestras clases (<em>en este caso una entidad</em>) herede de otra deberemos añadir <em>this.parent()</em> en los métodos ya declarados en la clase padre para que todos funcione como debe, si lo omitimos, el método no hará las funciones para las que por defecto fue definido.</p>
<p>El método <em>init</em> siempre deberá tener 3 parámetros, la posición de la entidad dada en coordenadas (<em>x,y), </em> y las propiedades del objeto. Aunque de momento no vamos a explicar esto, pero si que vamos a establecer propiedades básicas en nuestra entidad.</p>
<p>A simple vista podemos ver en el juego que hay 4 entidades bien definidas, el jugador, los escudos, los marcianos y el ovni. <strong>Los sprites</strong> tienen un tamaño de <em>50</em>x<em>50</em> cada uno, pero los personajes tienen un tamaño menor, vamos a ver como trabajar con esto. Empecemos con nuestro personaje:</p>
<pre class="brush:javascript">ig.module(
    'game.entities.jugador'
)
.requires(
    'impact.entity'
)
.defines(function() {

    EntityJugador = ig.Entity.extend({

        //Pre-cargamos los sprites
        animSheet: new ig.AnimationSheet( '/space/media/personajes.png',50 , 50 ),

        //Tamaño de la entidad
        size: {x : 40 , y : 26 },

        //Numero de pixeles que eliminamos de los bordes
        offset: {x : 5, y : 12},

        //Constructor
        init: function(x, y, settings) {
            this.parent(x, y, settings);

            //Definimos la animación
            this.addAnim( 'normal' , 9999999 , [6]);

        }

    });

});</pre>
<p>Por un lado tenemos la propiedad <em>animSheet, </em>donde hemos indicado el fichero que contiene los sprites, y el tamaño de cada sprite:</p>
<pre class="brush:javascript">//Pre-cargamos los sprites
animSheet: new ig.AnimationSheet( '/space/media/personajes.png',50 , 50 ),</pre>
<p>Por otro lado le hemos indicado el tamaño de nuestra entidad, que es de 40 de ancho por 26 de alto, pero indicándole mediante la propiedad <em>offset</em> cuando debe de restar a los bordes del sprite. Recuerda que nuestra entidad es más pequeña que el sprite seleccionado, por lo que si no definiéramos el <em>offset</em> el motor mostraría la imagen desde la esquina superior izquierda hasta el numero de pixeles indicados, y por lo tanto nos saldría cortada.</p>
<p style="text-align: center;"><img class="aligncenter  wp-image-1030" alt="Sprite-offset" src="http://www.nazariglez.com/wp-content/uploads/2013/03/jugador.png" width="360" height="360" /></p>
<pre class="brush:javascript">//Tamaño de la entidad
size: {x : 40 , y : 26 },

//Numero de pixeles que eliminamos de los bordes
offset: {x : 5, y : 12},</pre>
<p>Una vez le hemos indicado que fichero contiene los sprites, las dimensiones de cada sprite, y las dimensiones de la entidad en si, nos dirigimos al método <em>init</em> para añadir la animación que tendrá nuestro personaje, aunque en este caso no hay animación propiamente dicha porque consta solo de un sprite:</p>
<pre class="brush:javascript">init: function(x, y, settings) {
    this.parent(x, y, settings);

    //Definimos la animación
    this.addAnim( 'normal' , 9999999 , [6]);

}</pre>
<p>Usamos <em>this.addAnim</em> para indicarle la animación que queremos, pasandole el nombre que le queremos dar (<em>normal</em>), el tiempo para que cambie a la siguiente (<em>como solo es una he puesto un tiempo largo</em>), y los sprites que queremos que cargue en forma de <em>array</em> y en el orden deseado, en el jugador es solo uno, pero su hubieran más se podrian así [0,1,2]. Hay que tener en cuenta que el motor divide el archivo de sprites por las dimensiones que le pasamos, y numera cada sprite empezando en cero.</p>
<p style="text-align: center;"><img class="aligncenter  wp-image-1032" alt="Sprites Numerados" src="http://www.nazariglez.com/wp-content/uploads/2013/03/Captura-de-pantalla-2013-03-05-a-las-19.51.02.png" width="163" height="322" /></p>
<p> Ahora que tenemos nuestra entidad jugador creada vamos a probarla, nos dirigimos a<em> lib/game/main.js</em> y añadimos &#8216;game.entities.jugador&#8217; en la zona de require, para cargar la entidad el iniciar el juego, esta zona se debería de ver así:</p>
<pre class="brush:javascript">ig.module(
    'game.main'
)
.requires(
    'impact.game',
    'impact.font',
    'game.entities.jugador'
)</pre>
<p>Ahora vamos al método <em>init</em> de <em>MyGame</em> para crear nuestra entidad mediante el método <em>ig.game.spawnEntity( NombreClaseEntidad , x , y , propiedades en JSON)</em>:</p>
<pre class="brush:javascript">init: function() {

    //Tecla de disparo
    ig.input.bind( ig.KEY.SPACE , 'fuego' );

    //Teclas de movimiento
    ig.input.bind( ig.KEY.LEFT_ARROW , 'izquierda' );
    ig.input.bind( ig.KEY.RIGHT_ARROW , 'derecha' );

    //Tecla de reinicio
    ig.input.bind( ig.KEY.ENTER , 'reinicio' );

    //Creamos nuestro jugador
    ig.game.spawnEntity( EntityJugador, 300, 300, {});

},</pre>
<p>Una vez hecho al abrir <a href="http://localhost/spaceinvaders">http://localhost/spaceinvaders</a> tendríamos que ver algo similar a esto:</p>
<p style="text-align: center;"><img class="aligncenter  wp-image-1031" alt="ImpactJS más Entidad" src="http://www.nazariglez.com/wp-content/uploads/2013/03/Captura-de-pantalla-2013-03-05-a-las-20.25.12.png" width="552" height="357" /></p>
<p>Ahí tenemos nuestra primera entidad creada, pero aun no hace nada, vamos a dotarle de los movimientos básicos derecha e izquierda. Primero nos dirigimos al método <em>update</em> del <em>main.js</em> para eliminar las pruebas de teclado que habiamos hecho anteriormente, de forma que lo dejemos así:</p>
<pre class="brush:javascript">update: function() {

    // Update all entities and backgroundMaps
    this.parent();

},</pre>
<p>Ahora nos dirigimos a la clase de nuestra entidad jugador <em>lib/game/entities/jugador.js</em>. Para controlar el movimiento del personaje debemos de modificar la propiedad <em>this.vel </em>(<em>velocidad</em>), la cual nos permite indicarle a la entidad hacia donde debe moverse mediante valores en los ejes <em>x</em> o <em>y</em>, de forma que &#8220;x&#8221; en un valor negativo movería la entidad hacia la izquierda y en positivo hacia la derecha, de la misma forma &#8220;y&#8221; en negativo haría subir la entidad y en positivo la haría descender. Vamos a crear nosotros dentro de <em>EntityJugador</em> el método <em>update</em>, y en su interior comprobar que tecla se está pulsando y modificar <em>this.vel.x</em> en consecuencia:</p>
<pre class="brush:javascript">update: function(){
    this.parent();

    //Movemos el personaje
    if(ig.input.state('izquierda')){
        this.vel.x = -100;
    }

    if(ig.input.state('derecha')){
        this.vel.x = 100;
    }

    //Paramos el movimiento al soltar alguna tecla.
    if(ig.input.released('izquierda') || ig.input.released('derecha')){
        this.vel.x = 0;
    }

}</pre>
<p>Nuevamente nos dirigimos a <a href="http://localhost/spaceinvaders">http://localhost/spaceinvaders</a> y comprobamos como ahora al pulsar las flechas izquierda o derecha de nuestro teclado el personaje responde moviéndose hacia donde le indicamos.</p>
<p>En el próximo artículo empezaremos a trabajar con el editor de niveles donde colocaremos las entidades, creamos un fondo para el tapiz, ectétera.</p>
<p><strong>Anterior:</strong> <a title="[Tutorial ImpactJS] Primeros pasos con la librería." href="http://www.nazariglez.com/2013/03/04/tutorial-impactjs-primeros-pasos-con-la-libreria/" target="_blank">Primeros pasos con la librería.</a><br />
<strong>Código:</strong> <a href="https://github.com/Nazariglez/spaceinvaders" target="_blank">https://github.com/Nazariglez/spaceinvaders</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nazariglez.com/2013/03/05/tutorial-impactjs-estructura-basica-de-las-entidades/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>[Tutorial ImpactJS] Primeros pasos con la librería.</title>
		<link>http://www.nazariglez.com/2013/03/04/tutorial-impactjs-primeros-pasos-con-la-libreria/</link>
		<comments>http://www.nazariglez.com/2013/03/04/tutorial-impactjs-primeros-pasos-con-la-libreria/#comments</comments>
		<pubDate>Mon, 04 Mar 2013 08:45:07 +0000</pubDate>
		<dc:creator>Nazari</dc:creator>
				<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[canvas]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[ImpactJS]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[space invaders]]></category>
		<category><![CDATA[videojuegos]]></category>

		<guid isPermaLink="false">http://www.nazariglez.com/?p=1017</guid>
		<description><![CDATA[Ahora que tenemos nuestra motor ImpactJS funcionando sin problemas vamos a empezar a modificar cosas básicas. Antes de nada deberías de familiarizarte con la estructura de directorios del motor. Al entrar en directorio donde lo hemos instalado vemos tres archivos y otros directorios en su interior, voy nombrarlos uno a uno: index.html: Este archivo contiene [...]]]></description>
				<content:encoded><![CDATA[<p>Ahora que tenemos nuestra motor <a title="[Tutorial ImpactJS] Space Invaders: Mecánica, reglas del juego e instalación de la librería" href="http://www.nazariglez.com/2013/02/28/tutorial-impactjs-space-invaders-mecanica-reglas-del-juego-e-instalacion-de-la-libreria/" target="_blank"><strong>ImpactJS</strong> funcionando</a> sin problemas vamos a empezar a modificar cosas básicas.</p>
<p>Antes de nada deberías de familiarizarte con la estructura de directorios del motor. Al entrar en directorio donde lo hemos instalado vemos tres archivos y otros directorios en su interior, voy nombrarlos uno a uno:</p>
<ul>
<li><strong>index.html:</strong> Este archivo contiene el elemento canvas y incluye la librería impact y nuestro juego, es a través del el por donde jugaremos a nuestra obra.</li>
<li><strong>LICENSE.TXT:</strong> No hace explicar, dentro contiene la licencia legal del motor.</li>
<li><strong>weltmeister.html:</strong> Este archivo hace las veces de editor de nivel a través del navegador.</li>
<li><strong>tools/:</strong> Este directorio contiene los scripts necesarios para llevar a cabo la empaquetación del juego antes de ser distribuido.</li>
<li><strong>media/:</strong> En este directorio es donde debemos ubicar todas nuestros sprites, imágenes, música, etcétera. No tiene subdirectorios definidos por lo que nosotros podemos organizar nuestros archivos como queramos.</li>
<li><strong>lib/:</strong> Este directorio contiene a su vez tres subdirectorios, que son:</li>
</ul>
<ol>
<li><strong>weltmeister/:</strong> Contiene todos los archivos necesarios para que el editor de niveles funcione.</li>
<li><strong>impact/:</strong> Es el corazón de la librería, en este directorio se encuentran todos los scripts que conforman el motor. Por lo general no necesitaremos modificar nada en este directorio.</li>
<li><strong>game/:</strong> Es el directorio en el que trabajaremos, contiene el archivo main.js que se podría decir que es el script principal de nuestro juego, y dos directorios más, entities donde almacenamos las entidades que creamos y levels para almacenar los niveles que diseñamos.</li>
</ol>
<p>Una vez entendemos como se distribuye el motor empezamos con nuestro juego, por lo general trabajaremos siempre sobre el directorio<em> game/</em> y los archivos <em>index.html</em> y <em>weltmeister.html</em>.</p>
<p>Lo primero que vamos a hacer es modificar el tamaño de nuestro tapiz, para esto debemos de dirigirnos al archivo <em>lib/game/main.js</em> y buscar al final del mismo la siguiente linea:</p>
<pre class="brush:javascript">// Start the Game with 60fps, a resolution of 320x240, scaled
// up by a factor of 2
ig.main( '#canvas', MyGame, 60, 320, 240, 2 );</pre>
<p>La instrucción <em>ig.main()</em> es la encargada de iniciar el juego, se le pasa la id del elemento canvas (<em>#canvas</em>), la clase principal del juego, en este caso <em>MyGame</em>, el numero de <a href="http://es.wikipedia.org/wiki/Frame" target="_blank">frames por segundo</a> deseados que suele ser 60, aunque las ultimas versiones de Impact usa <a href="https://developer.mozilla.org/es/docs/DOM/window.requestAnimationFrame" target="_blank">requestAnimationFrame</a> por lo que es posible que no tome en cuenta este parámetro, el ancho y el alto del tapiz, y el valor de escalado que es el factor por el que se multiplica el tamaño del tapiz. Nosotros vamos a modificar solamente el ancho, el alto y la escala dejándolo así:</p>
<pre class="brush:javascript">// Ancho: 520, Alto: 600, Escala: 1
ig.main( '#canvas', MyGame, 60, 520, 600, 1 );</pre>
<p>Si nos dirigimos ahora a <a href="http://localhost/spaceinvaders/index.html">http://localhost/spaceinvaders/index.html</a> (<em>recuerda que spaceinvaders es el nombre que yo le di a mi carpeta</em>) veremos que el tapiz ha cambiado de tamaño y que la frase “<em>It Works!</em>” se ve más pequeña, esto es debido a que antes estaba aumentada por dos, y ahora el factor de escalado es 1.</p>
<p>El siguiente paso es definir que teclas vamos a permitir usar para interactuar con nuestro juego, esto lo haremos en el método <em>init</em> de la clase <em>MyGame</em> contenida en <em>lib/game/main.js</em>. El método <em>init</em> hace las veces de constructor de la clase, ejecutándose solamente al inicio de esta.</p>
<p>Para declarar que tecla queremos que se puedan usar utilizaremos la instrucción <em>ig.input.bind( claveDeTecla , &#8216;nombrePersonalizado&#8217;)</em>, en este caso vamos a usar la barra espaciadora para disparar, las flechas izquierda y derecha para mover al personaje, y la tecla enter para reiniciar el juego cuando el personaje muera. El método init quedaría así:</p>
<pre class="brush:javascript">init: function() {

    //Tecla de disparo
    ig.input.bind( ig.KEY.SPACE , 'fuego' );

    //Teclas de movimiento
    ig.input.bind( ig.KEY.LEFT_ARROW , 'izquierda' );
    ig.input.bind( ig.KEY.RIGHT_ARROW , 'derecha' );

    //Tecla de reinicio
    ig.input.bind( ig.KEY.ENTER , 'reinicio' );

},</pre>
<p>Como de momento no tenemos ninguna entidad creada vamos a probar que las teclas funcionan correctamente mediante <a href="https://addons.mozilla.org/es/firefox/addon/firebug/" target="_blank"><strong>firebug</strong></a>, para esto vamos a añadir unas lineas al método <em>update</em> de la clase <em>MyGame</em>. Este método es el encargado de estar actualizando continuamente todo lo que sucede en el juego.</p>
<p>Para controlar el estado de una tecla la clase <em>ig.input</em> provee de tres métodos muy simples:</p>
<ul>
<li><strong>ig.input.pressed:</strong> Se dispara solo en el momento en el que la tecla ha sido pulsada.</li>
<li><strong>ig.input.state:</strong> Devuelve true siempre que la tecla siga pulsada, a diferencia de pressed que solo salta una vez.</li>
<li><strong>ig.input.released:</strong> Se dispara cuando la tecla deja de ser presionada.</li>
</ul>
<p>Para probar nuestras teclas vamos a dejar el método <em>update</em> así:</p>
<pre class="brush:javascript">update: function() {

    // Update all entities and backgroundMaps
    this.parent();

    //Si se pulsan teclas de dirección
    if( ig.input.state( 'izquierda' ) || ig.input.state( 'derecha' ) ){
        console.log('Pulsando teclas de dirección.');
    }

    //Al pulsar la tecla de disparo
    if( ig.input.pressed( 'fuego' ) ){
        console.log('Un Disparo.');
    }

    //Al soltar la tecla de reinicio
    if( ig.input.released( 'reinicio' ) ){
        console.log('Reiniciando.');
    }

},</pre>
<p>Ahora podemos dirigirnos de nuevo a nuestro juego en el navegador y abrir firebug o la consola javascript, al pulsar las teclas de dirección veras como se repite continuamente el mensaje de “<em>Pulsando teclas de dirección</em>”, al presionar la barra espaciadora verás por cada vez que es presionada el mensaje “<em>Un Disparo.</em>” y al presionar y luego soltar la tecla enter verás el mensaje “<em>Reiniciando.</em>”. De esta forma hemos probado que nuestras teclas funcionan correctamente y además hemos aprendido como funcionan los eventos relacionados con estas.</p>
<p>Visto esto hasta aquí empezaremos a crear entidades en el próximo artículo.</p>
<p><strong>Anterior:</strong> <a title="[Tutorial ImpactJS] Space Invaders: Mecánica, reglas del juego e instalación de la librería" href="http://www.nazariglez.com/2013/02/28/tutorial-impactjs-space-invaders-mecanica-reglas-del-juego-e-instalacion-de-la-libreria/" target="_blank">Mecánica, reglas del juego e instalación de la librería.<br />
</a><strong>Siguiente:</strong> <a title="[Tutorial ImpactJS] Estructura básica de las entidades." href="http://www.nazariglez.com/2013/03/05/tutorial-impactjs-estructura-basica-de-las-entidades/" target="_blank">Estructura básica de las entidades.</a><br />
<strong>Código:</strong> <a href="https://github.com/Nazariglez/spaceinvaders" target="_blank">https://github.com/Nazariglez/spaceinvaders</a><em id="__mceDel"> </em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nazariglez.com/2013/03/04/tutorial-impactjs-primeros-pasos-con-la-libreria/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>[Tutorial PHP] Polimorfismo para ser más eficientes.</title>
		<link>http://www.nazariglez.com/2013/03/03/tutorial-php-polimorfismo-para-ser-mas-eficientes/</link>
		<comments>http://www.nazariglez.com/2013/03/03/tutorial-php-polimorfismo-para-ser-mas-eficientes/#comments</comments>
		<pubDate>Sun, 03 Mar 2013 08:45:33 +0000</pubDate>
		<dc:creator>Nazari</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[polimorfismo]]></category>
		<category><![CDATA[polymorph]]></category>
		<category><![CDATA[poo]]></category>
		<category><![CDATA[programación orientada a objetos]]></category>

		<guid isPermaLink="false">http://www.nazariglez.com/?p=1011</guid>
		<description><![CDATA[Una de las posibilidades más útiles que nos ofrece el trabajar con objetos es el polimorfismo. Imagina una clase abstracta que sirve de base a cinco o seis clases &#8220;hijas&#8220;, de esta forma unes toda las funcionalidades que comparten en una misma clase y solo modificas o añades pequeños matices en las hijas. Pongamos un [...]]]></description>
				<content:encoded><![CDATA[<p>Una de las posibilidades más útiles que nos ofrece el trabajar con objetos es el <strong>polimorfismo</strong>. Imagina una <a title="[Tutorial PHP] Clases abstractas." href="http://www.nazariglez.com/2013/03/02/tutorial-php-clases-abstractas/" target="_blank"><strong>clase abstracta</strong></a> que sirve de base a cinco o seis clases &#8220;<em>hijas</em>&#8220;, de esta forma unes toda las funcionalidades que comparten en una misma clase y solo modificas o añades pequeños matices en las hijas. Pongamos un ejemplo, tenemos diferentes tipos de pelotas, de fútbol, baloncesto y tenis. Todas comparten su forma redonda, tu capacidad de rodar y rebotar, pero ninguna es igual a a anterior, tienen un peso diferente, una textura diferente, color, etcétera. No es necesario crear las funcionalidad de rodar y rebotar en cada una de las pelotas, podemos crear una clase padre que tenga esa capacidad y luego solo debemos heredar:</p>
<p><em>PelotaBase.php:</em></p>
<pre class="brush:php">&lt;?php

class PelotaBase
{

    protected $peso = 0;
    protected $textura = 'lisa';
    protected $color = 'ninguno';

    public function rebotar(){

        echo "Estoy rebotando";

    }

    public function rodar(){

        echo "Estoy rodando";

    }

    public function __toString(){

        return "Soy " . get_called_class() . " y peso {$this-&gt;peso}, mi textura es {$this-&gt;textura}, y mi color {$this-&gt;color}";
    }

}

?&gt;</pre>
<p>Nótese que uso <em>get_called_class()</em> en vez de la <a title="[Tutorial PHP] Conociendo las constantes mágicas" href="http://www.nazariglez.com/2013/02/21/tutorial-php-conociendo-las-constantes-magicas/" target="_blank"><strong>constante mágica</strong></a> <em>__CLASS__</em>, esto se debe a que si usáramos la constante el nombre que nos devolvería seria el de la PelotaBase, y yo quiero el nombre de la clase que ejecuta el método, no donde se declaro, por eso usando <em>get_called_class()</em> obtenemos el nombre de la clase hija que lo esta ejecutando.</p>
<p>Veamos ahora las clases “<em>hijas</em>”:</p>
<p><em>PelotaDeTenis.php:</em></p>
<pre class="brush:php">&lt;?php

require_once('PelotaBase.php');

class PelotaDeTenis extends PelotaBase
{

    public $peso = 1;
    public $textura = 'Peluda';
    public $color = 'Verde';

}

?&gt;</pre>
<p><em>PelotaDeFutbol.php:</em></p>
<pre class="brush:php">&lt;?php

require_once('PelotaBase.php');

class PelotaDeFutbol extends PelotaBase
{

    public $peso = 2;
    public $textura = 'Cuero';
    public $color = 'Blanca y Negra';

}

?&gt;</pre>
<p><em>PelotaDeBaloncesto.php:</em></p>
<pre class="brush:php">&lt;?php

require_once('PelotaBase.php');

class PelotaDeBaloncesto extends PelotaBase
{

    public $peso = 3;
    public $textura = 'Rugosa';
    public $color = 'Naranja';

}

?&gt;</pre>
<p>Como ves son idénticas, las tres heredan de <em>PelotaBase</em> y la única diferencia de una a otras son los atributos para adecuarlos a sus propiedades reales, veamos el script:</p>
<p><em>script.php:</em></p>
<pre class="brush:php">&lt;?php

require_once('PelotaBase.php');
require_once('PelotaDeTenis.php');
require_once('PelotaDeFutbol.php');
require_once('PelotaDeBaloncesto.php');

$tenis = new PelotaDeTenis();
echo $tenis; //Imprime: Soy PelotaDeTenis y peso 1, mi textura es Peluda, y mi color Verde

$futbol = new PelotaDeFutbol();
echo $futbol; //Imprime: Soy PelotaDeFutbol y peso 2, mi textura es Cuero, y mi color Blanca y Negra

$baloncesto = new PelotaDeBaloncesto();
echo $baloncesto; //Imprime: Soy PelotaDeBaloncesto y peso 3, mi textura es Rugosa, y mi color Naranja

?&gt;</pre>
<p>De esta forma hemos conseguido que usando la misma clase como base tengamos comportamientos diferentes, los cuales podemos modificar a nuestro antojo, añadirle nuevas funcionalidades o sustituir las ya declaradas por otras más acordes a nuestro objeto.</p>
<p>Quizás no lo veas aun pero el polimorfismo es esencial, imagina una clase “<em>trabajador</em>”, que sirve de base para las clases director, albañil, programador, etcétera, todas comparten una base pero su misión final es muy diferente, esto nos ayuda a programar código mas eficiente, tenemos todo bien localizado y no es necesario modificar un sin numero de clases para realizar cambios simples porque lo haríamos en la clase &#8220;<em>padre</em>&#8220;.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nazariglez.com/2013/03/03/tutorial-php-polimorfismo-para-ser-mas-eficientes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[Tutorial PHP] Clases abstractas.</title>
		<link>http://www.nazariglez.com/2013/03/02/tutorial-php-clases-abstractas/</link>
		<comments>http://www.nazariglez.com/2013/03/02/tutorial-php-clases-abstractas/#comments</comments>
		<pubDate>Sat, 02 Mar 2013 19:43:41 +0000</pubDate>
		<dc:creator>Nazari</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[abstract]]></category>
		<category><![CDATA[clases abstractas]]></category>
		<category><![CDATA[métodos abstractos]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[poo]]></category>
		<category><![CDATA[programación orientada a objetos]]></category>

		<guid isPermaLink="false">http://www.nazariglez.com/?p=1007</guid>
		<description><![CDATA[Hasta el momento hemos visto que para poder usar un objeto primero hemos de instanciar su clase, pero hay una excepción a esta forma de proceder, las clases abstractas. Las clases abstractas se declaran con la instrucción “abstract”, estas no necesitan ser instanciadas, así que podemos acceder a sus métodos de forma similar a la [...]]]></description>
				<content:encoded><![CDATA[<p>Hasta el momento hemos visto que para poder usar un objeto primero hemos de instanciar su clase, pero hay una excepción a esta forma de proceder, las <strong>clases abstractas</strong>.</p>
<p>Las clases abstractas se declaran con la instrucción <strong>“<em>abstract</em>”</strong>, estas no necesitan ser instanciadas, así que podemos acceder a sus métodos de forma similar a la que se accedería a un <a title="[Tutorial PHP] Como usar atributos y métodos estáticos." href="http://www.nazariglez.com/2013/01/27/tutorial-php-como-usar-atributos-y-metodos-estaticos/" target="_blank">método estático</a>. Veamos un ejemplo:</p>
<p><em>ClaseAbstracta.php:</em></p>
<pre class="brush:php">&lt;?php

abstract class ClaseAbstracta
{

    public function miMetodo(){

        echo "Método de una clase abstracta.";

    }

}

?&gt;</pre>
<p><em>script.php:</em></p>
<pre class="brush:php">&lt;?php

require_once('ClaseAbstracta.php');

ClaseAbstracta::miMetodo();

?&gt;</pre>
<p>Por lo general declaramos una clase como abstracta cuando sabemos que no ha de ser instanciada y que su función es servir de clase “<em>padre</em>” a otra clase mediante la herencia, donde la clase “<em>hija</em>” si será instanciada.</p>
<p>Podemos marcamos métodos como abstractos (<em>siempre dentro de una clase abstracta</em>) pero estos no podrán tener cuerpo o dará un error tipo “<em><strong>Fatal error:</strong> Abstract function ClasePadre::miMetodo() cannot contain body</em>”, además al ser heredada, la clase “<em>hija</em>” estará obligada a declarar y asignarle un cuerpo a los métodos que hemos marcamos como abstractos en la clase “<em>padre</em>” o provocaremos un error.</p>
<p><em>ClaseAbstracta.php:</em></p>
<pre class="brush:php">&lt;?php

abstract class ClaseAbstracta
{

    //Declaro el método como abstracto sin cuerpo.
    abstract public function metodoDos();

    public function miMetodo(){

        echo "Método de una clase abstracta.";
    }

}

?&gt;</pre>
<p><em>ClaseHija.php:</em></p>
<pre class="brush:php">&lt;?php

require_once('ClaseAbstracta.php');

class ClaseHija extends ClaseAbstracta
{

    //Método declarado por obligación al heredar de ClaseAbstracta
    public function metodoDos(){
        //Lo que quieras
    }

}

?&gt;</pre>
<p>Ahora simplemente debemos de instanciar <em>ClaseHija</em> y tendremos nuestro objeto extendido de la clase abstracta. Hay que tener en cuenta que no es posible dentro de una clase normal (<em>no abstracta</em>) tener métodos abstractos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nazariglez.com/2013/03/02/tutorial-php-clases-abstractas/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>[Tutorial ImpactJS] Space Invaders: Mecánica, reglas del juego e instalación de la librería</title>
		<link>http://www.nazariglez.com/2013/02/28/tutorial-impactjs-space-invaders-mecanica-reglas-del-juego-e-instalacion-de-la-libreria/</link>
		<comments>http://www.nazariglez.com/2013/02/28/tutorial-impactjs-space-invaders-mecanica-reglas-del-juego-e-instalacion-de-la-libreria/#comments</comments>
		<pubDate>Thu, 28 Feb 2013 08:45:08 +0000</pubDate>
		<dc:creator>Nazari</dc:creator>
				<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Juegos]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[canvas]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[ImpactJS]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[space invaders]]></category>
		<category><![CDATA[videojuegos]]></category>

		<guid isPermaLink="false">http://www.nazariglez.com/?p=983</guid>
		<description><![CDATA[Antes de comenzar con la practica es conveniente saber que es lo que queremos hacer, para eso vamos a destirpar un poco que es lo que ha de hacer el Space Invaders. Todos sabemos en que consiste un Space Invaders, el jugador debe eliminar uno a uno un conjunto de marcianos situados en una posición [...]]]></description>
				<content:encoded><![CDATA[<p>Antes de comenzar con la practica es conveniente saber que es lo que queremos hacer, para eso vamos a destirpar un poco que es lo que ha de hacer el <strong><a title="Desarrollando Space Invaders en HTML5 con ImpactJS" href="http://www.nazariglez.com/2013/02/23/desarrollando-space-invaders-en-html5-con-impactjs/" target="_blank">Space Invaders</a></strong>.</p>
<p>Todos sabemos en que consiste un Space Invaders, el jugador debe eliminar uno a uno un conjunto de marcianos situados en una posición superior, los cuales se mueven como un bloque y disparan contra el jugador. También tenemos unos escudos a modo de protección para el jugador, que van destruyendo a consecuencia de los disparos, y de forma aleatoria aparece un ovni por encima del bloque de marcianos que otorga un bonus de puntuación si logramos alcanzarlo con un disparo.</p>
<p style="text-align: center;"><img class="aligncenter  wp-image-992" alt="Space invaders desarrollado en ImpactJS" src="http://www.nazariglez.com/wp-content/uploads/2013/02/Captura-de-pantalla-2013-02-27-a-las-23.43.43.png" width="382" height="439" /></p>
<p>No parece demasiado complicado, vamos por partes.</p>
<h4>El jugador</h4>
<p>El jugador tendrá los movimientos bastante limitados, las únicas acciones permitidas serán moverse a la derecha e izquierda y disparar un solo laser cada vez, esto es que mientras el laser siga en escena no se permitirá que realice otro disparo.</p>
<h4>Los marcianos</h4>
<p>Hay 3 tipos de marcianos, el pulpo, el cangrejo y la medusa. Todos ellos funcionan de forma similar, lo único que cambia de uno a otro es la probabilidad de realizar un disparo y la puntuación que otorga en caso de ser eliminado. La medusa otorgará 30 puntos, el cangrejo 20 y el pulpo 10. Se moveran como un bloque de forma que cuando uno de ellos “choque” con una de las “paredes” laterales del juego el y todos los demás se moverán en sentido contrario, también por cada “choque” descenderán toscamente un poco en la escena para ir ganando comiendo terreno hacia abajo.</p>
<h4>El ovni</h4>
<p>El ovni entra en escena basándose en un tiempo calculado al azar basándose en un máximo y un mínimo de tiempo posibles. No podrá disparar ni realizar ninguna acción que no sea atravesar la escena de izquierda a derecha. Su puntuación será calculada al azar, y cuando aparece se detiene la música para sonar una melodía diferente hasta que sale de la escena.</p>
<h4>Los escudos</h4>
<p>Los escudos serán pequeñas partículas que se podrán destruir dando igual que el laser provenga de los marcianos o del jugador. También se destruirán si un marciano los toca. En principio habrán cuatro bloques de escudos.</p>
<h4>El laser</h4>
<p>El láser es lo que dispara el jugador y los marcianos, su único cometido es eliminar todo lo que toque dependiendo de quien lo lance, ya sea eliminar los escudos, los marcianos o al jugador. Su movimiento será ascendente cuando el disparo lo produce el jugador o descendente cuando proviene de los marcianos. Si no impacta contra ninguna entidad el láser se eliminara al tocar el limite superior o inferior establecido.</p>
<h4>Aumentando la dificultad</h4>
<p>Cuando el jugador elimina todo un bloque de marcianos se reinicia el nivel aumentando las probabilidades de disparo de los marcianos, haciendo así más difícil el juego cada vez que se termina un nivel.</p>
<h4>Fin del juego</h4>
<p>El juego terminará cuando un laser marciano alcance al jugador, cuando un marciano baje tanto que toque al jugador o simplemente cuando un marciano toque el limite inferior establecido. Cuando pase algo de esto se pausara el juego mostrando un menú con la puntuación obtenida y se activara una tecla para reiniciar el juego.</p>
<h3>Instalación de la librería</h3>
<p>Primero debemos de dirigirnos a <strong><a href="http://impactjs.com/buy-impact" target="_blank">ImpactJS</a> </strong>y comprar una licencia del programa, y empezar a descargar el zip de la librería. Para usar la librería debemos de tener un servidor web instalado, si no tienes ninguna puedes usar <a href="http://www.apachefriends.org/es/xampp.html" target="_blank"><strong>XAMPP</strong></a>.</p>
<p>Una vez descargada la librería en nuestro pc debemos de descomprimirla dentro de una carpeta del servidor, yo he creado una carpeta llamada “<em>spaceinvaders</em>”, ahora nos dirigimos a nuestro navegador web preferido y entramos en <a href="http://localhost/spaceinvaders">http://localhost/spaceinvaders</a> (<em>sustituye spaceinvaders por el nombre de tu carpeta</em>) y deberíamos ver algo así:</p>
<p style="text-align: center;"><img class="aligncenter  wp-image-984" alt="ImpactJS funcionando." src="http://www.nazariglez.com/wp-content/uploads/2013/02/Captura-de-pantalla-2013-02-27-a-las-23.36.29.png" width="582" height="438" /></p>
<p>¡Ya tenemos ImpactJS funcionando!, me gustaría añadir que aunque a diario suelo usar <a href="https://www.google.com/intl/es/chrome/browser/?hl=es" target="_blank">Chrome</a>, prefiero usar para probar y desarrollar cualquier cosa en javascript <a href="http://www.mozilla.org/es-ES/firefox/new/" target="_blank">Firefox</a> + <a href="https://addons.mozilla.org/es/firefox/addon/firebug/" target="_blank">Firebug</a>, pero esto ya es elección de cada uno.</p>
<p>Como ves hasta aquí es bastante sencillo, el proximo articulo será más practico, empezaremos a trastear con la libreria.</p>
<p><strong>Indice:</strong> <a href="http://www.nazariglez.com/2013/02/23/desarrollando-space-invaders-en-html5-con-impactjs/" target="_blank">http://www.nazariglez.com/2013/02/23/desarrollando-space-invaders-en-html5-con-impactjs/<br />
</a><strong>Siguiente: </strong><a title="[Tutorial ImpactJS] Primeros pasos con la librería." href="http://www.nazariglez.com/2013/03/04/tutorial-impactjs-primeros-pasos-con-la-libreria/" target="_blank">Primeros pasos con la librería.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nazariglez.com/2013/02/28/tutorial-impactjs-space-invaders-mecanica-reglas-del-juego-e-instalacion-de-la-libreria/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>[Tutorial PHP] Herencia: Ambito de los métodos, atributos y operador final.</title>
		<link>http://www.nazariglez.com/2013/02/27/tutorial-php-herencia-ambito-de-los-metodos-atributos-y-operador-final/</link>
		<comments>http://www.nazariglez.com/2013/02/27/tutorial-php-herencia-ambito-de-los-metodos-atributos-y-operador-final/#comments</comments>
		<pubDate>Wed, 27 Feb 2013 08:45:59 +0000</pubDate>
		<dc:creator>Nazari</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[herencia]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[operador final]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[poo]]></category>
		<category><![CDATA[programación orientada a objetos]]></category>
		<category><![CDATA[protected]]></category>

		<guid isPermaLink="false">http://www.nazariglez.com/?p=977</guid>
		<description><![CDATA[Siguiendo con el tema de la Herencia voy a hablar un poco de como podemos controlar lo que heredamos, si nos fijamos en los ejemplos anteriores siempre marque los atributos y los métodos como públicos (public), pero esto no tiene porque ser así, si queremos podemos cambiar su grado de visibilidad, hagamos una prueba cambiando [...]]]></description>
				<content:encoded><![CDATA[<p>Siguiendo con el <a title="[Tutorial PHP] Trabajando con Clases Heredadas" href="http://www.nazariglez.com/2013/02/24/tutorial-php-trabajando-con-clases-heredadas/" target="_blank">tema de la Herencia</a> voy a hablar un poco de como podemos controlar lo que heredamos, si nos fijamos en los ejemplos anteriores siempre marque los atributos y los métodos como públicos (<em>public</em>), pero esto no tiene porque ser así, si queremos podemos cambiar su grado de visibilidad, hagamos una prueba cambiando un método a privado:</p>
<p><em>ClasePadre.php:</em></p>
<pre class="brush:php">&lt;?php

class ClasePadre
{

    public $atributo = 'Atributo Padre';

    public function __construct(){

        echo __CLASS__;

    }

    //Método privado
    private function miMetodo(){

        echo "Método Padre";
    }

}

?&gt;</pre>
<p><em>ClaseHija.php:</em></p>
<pre class="brush:php">&lt;?php

require_once('ClasePadre.php');

class ClaseHija extends ClasePadre
{

    //Lamamos de forma interna al método miMetodo como si fuera de esta clase.
    public function llamarMetodo(){

        $this-&gt;miMetodo();
    }

}

?&gt;</pre>
<p><em>script.php:</em></p>
<pre class="brush:php">&lt;?php

require_once('ClaseHija.php');

$obj = new ClaseHija(); //Imprime: Clase Padre

echo $obj-&gt;atributo; //Imprime: Atributo Padre

$obj-&gt;llamarMetodo(); //Imprime error: Fatal error: Call to private method ClasePadre::miMetodo() from context 'ClaseHija'

?&gt;</pre>
<p>He intentado llamar de forma interna al método de la clase “<em>padre</em>” <em>miMetodo()</em> pero este al ser privado nos ha devuelto un error, como te imaginarás al marcar como privado un método o atributo no permite ni tan siquiera ser usado por una clase “<em>hija</em>”. ¿La solución es marcarlos como públicos?, no. Como ya explique en tema de “<a title="[Tutorial PHP] Entendiendo la visibilidad de los atributos y los métodos" href="http://www.nazariglez.com/2013/01/21/tutorial-php-entendiendo-la-visibilidad-de-los-atributos-y-los-metodos/" target="_blank">entendiendo la visibilidad</a>” existe otro nivel de protección llamado <strong>protected</strong>, este nivel se puede decir que es similar a declarar como privado un atributo puesto que bloquea el acceso desde fuera de la clase, pero ahora si que nos permite que las clases “<em>hijas</em>” puedan acceder y manipular el atributo o método en cuestión, hagamos una prueba modificando la clase “<em>padre</em>”:</p>
<p><em>ClasePadre.php:</em></p>
<pre class="brush:php">&lt;?php

class ClasePadre
{

    public $atributo = 'Atributo Padre';

    public function __construct(){

        echo __CLASS__;
    }

    //Método Protegido
    protected function miMetodo(){

        echo "Método Padre";
    }

}

?&gt;</pre>
<p><em>script.php:</em></p>
<pre class="brush:php">&lt;?php

require_once('ClaseHija.php');

$obj = new ClaseHija(); //Imprime: Clase Padre

echo $obj-&gt;atributo; //Imprime: Atributo Padre

$obj-&gt;llamarMetodo(); //Imprime: Método Padre

$obj-&gt;miMetodo(); //Imprime error: Fatal error: Call to protected method ClasePadre::miMetodo() from context ''

?&gt;</pre>
<p>Ahora hemos realizado dos llamadas, una interna a través del método de la clase “<em>hija</em>” <em>llamarMetodo()</em> y una de forma externa. La llamada interna nos ha devuelto el resultado esperado que no es más que la impresión en pantalla de “<em>Método Padre</em>”, pero la llamada externa nos devuelve un error de acceso. Esto quiere decir que el nivel protected nos ha permitido heredar el método para acceder internamente desde la clase “<em>hija</em>” pero no de forma publica.</p>
<p>Hay que tener en cuenta que los niveles nunca pueden ser más restrictivos en la clase “<em>hija</em>” que en la clase “<em>padre</em>”, esto significa que si un método en la clase “<em>padre</em>” es publico en la hija deberá serlo, pero si en la padre es private o protected, en la hija podrá ser publico.</p>
<p>Podría darse el caso de que al diseñar una clase no quisiéramos que se pudiera heredar, para evitar la herencia provocando un error al intentarlo solo tenemos que añadir en la declaración de la clase el operador <em><strong>final</strong></em>:</p>
<p><em>ClasePadre.php:</em></p>
<pre class="brush:php">&lt;?php

final class ClasePadre
{

    public $atributo = 'Atributo Padre';

    public function __construct(){

        echo __CLASS__;
    }

    //Método Protegido
    protected function miMetodo(){
        echo "Método Padre";
    }

}

?&gt;</pre>
<p>Esto genera un error tipo “<em><strong>Fatal error:</strong> Class ClaseHija may not inherit from final class (ClasePadre)</em>” debido a que hemos bloqueado la herencia para <em>ClasePadre</em>. Si lo que queremos es simplemente evitar que se sobrescriba un método, para así asegurarnos de que siempre se ejecutara tal y como se ha definido en la clase “<em>padre</em>” lo que debemos de hacer es añadir el operador final en su declaración:</p>
<p><em>ClasePadre.php:</em></p>
<pre class="brush:php">&lt;?php

class ClasePadre
{

    public $atributo = 'Atributo Padre';

    public function __construct(){

        echo __CLASS__;
    }

    //Método imposible de sobrescribir
    public final function miMetodo(){

        echo "Método Padre";
    }

}

?&gt;</pre>
<p>Por lo general el <strong>operador final</strong> no se suele usar, salvo raras excepciones dado que la potencia de los objetos reside en la posibilidad de heredar y extender las funcionalidades de las clases.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nazariglez.com/2013/02/27/tutorial-php-herencia-ambito-de-los-metodos-atributos-y-operador-final/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
