hugoruscitti/pilas

View on GitHub
data/manual/habilidades/index.json

Summary

Maintainability
Test Coverage
{
    "content": "<h1 id=\"habilidades\">Habilidades</h1>\n<p>Pilas permite a\u00f1adir funcionalidad a tus objetos\nde manera sencilla, dado que usamos el concepto\nde habilidades, un enfoque similar a la\nprogramaci\u00f3n orientada a <a href=\"http://es.wikipedia.org/wiki/Programaci\u00f3n_orientada_a_componentes\">componentes</a>\ny <a href=\"http://es.wikipedia.org/wiki/Mixin\">mixins</a>.</p>\n<h2 id=\"un-ejemplo\">Un ejemplo</h2>\n<p>Una habilidad es una funcionalidad que est\u00e1 implementada\nen alguna clase, y que si quieres la puedes vincular\na un actor cualquiera.</p>\n<p>Veamos un ejemplo, imagina que tienes un actor en\ntu escena y quieres que la rueda del mouse te permita\ncambiarle el tama\u00f1o.</p>\n<p>Puedes usar la habilidad <code>AumentarConRueda</code> y vincularla\nal actor f\u00e1cilmente.</p>\n<p>El siguiente c\u00f3digo hace eso:</p>\n<pre><code class=\"python\">import pilasengine\n\npilas = pilasengine.iniciar()\n\nmono = pilas.actores.Mono()\nmono.aprender(pilas.habilidades.AumentarConRueda)\n</code></pre>\n\n<p>o bien:</p>\n<pre><code>mono.aprender('AumentarConRueda')\n</code></pre>\n<p>as\u00ed, cuando uses la rueda del mouse el tama\u00f1o del personaje aumentar\u00e1\no disminuir\u00e1.</p>\n<p>Nota que aqu\u00ed usamos la met\u00e1fora de \"aprender habilidades\", porque\nlas habilidades son algo que duran para toda la vida\ndel actor.</p>\n<h2 id=\"un-ejemplo-mas-hacer-que-un-actor-se-pueda-mover-con-el-mouse\">Un ejemplo mas: hacer que un actor se pueda mover con el mouse</h2>\n<p>Algo muy com\u00fan en los juegos es que puedas\ntomar piezas con el mouse y moverlas por la pantalla.</p>\n<p>Esta habilidad llamada <code>Arrastrable</code> representa eso, puedes vincularlo\na cualquier actor y simplemente funciona:</p>\n<pre><code class=\"python\">import pilasengine\n\npilas = pilasengine.iniciar()\n\nmono = pilas.actores.Mono()\nmono.aprender(pilas.habilidades.Arrastrable)\n</code></pre>\n\n<h2 id=\"otro-ejemplo-un-actor-que-cambia-de-posicion\">Otro ejemplo: un actor que cambia de posici\u00f3n</h2>\n<p>Veamos otro ejemplo sencillo, si queremos que un actor\nse coloque en la posici\u00f3n del mouse cada vez que hacemos\nclick, podemos usar la habilidad: <code>SeguirClicks</code>.</p>\n<pre><code class=\"python\">import pilasengine\n\npilas = pilasengine.iniciar()\nmono = pilas.actores.Mono()\nmono.aprender(pilas.habilidades.SeguirClicks)\n</code></pre>\n\n<h2 id=\"mezclar-habilidades\">Mezclar habilidades</h2>\n<p>En pilas se ha intentado hacer que las habilidades sean\nlo mas independientes posibles, porque claramente lo mas\ndivertido de este enfoque es poder combinar distintas\nhabilidades para lograr comportamientos complejos.</p>\n<p>As\u00ed que te invitamos a experimentar y explorar la mezcla\nde habilidades.</p>\n<h2 id=\"otras-habilidades-para-utilizar\">Otras habilidades para utilizar</h2>\n<p>Pilas viene con varias habilidades incluidas, pero\nlamentablemente este manual no las menciona a todas. As\u00ed\nque te recomendamos abrir un int\u00e9rprete de python\ny consultarle directamente a \u00e9l que habilidades tienes\ndisponibles en tu versi\u00f3n de pilas.</p>\n<p>Para esto, abr\u00ed el int\u00e9rprete de pilas y escrib\u00ed lo siguiente:</p>\n<pre><code class=\"python\">dir(pilas.habilidades)\n</code></pre>\n\n<p>esto imprimir\u00e1 en pantalla todas las habilidades como una\nlista de cadenas.</p>\n<h2 id=\"crear-habilidades-personalizadas\">Crear habilidades personalizadas</h2>\n<p>Para crear una habilidad nueva, tienes que crear una clase\ny vincularla al m\u00f3dulo de habilidades.</p>\n<p>La clase tiene que heredar de <code>pilasengine.habilidades.Habilidad</code> y\npuede tener un m\u00e9todo <code>actualizar</code>, en donde generalmente se\ncoloca la acci\u00f3n a realizar:</p>\n<pre><code class=\"python\">class GirarPorSiempre(pilasengine.habilidades.Habilidad):\n\n    def actualizar(self):\n        self.receptor.rotacion += 1\n\npilas.habilidades.vincular(GirarPorSiempre)\n\nactor = pilas.actores.Actor()\nactor.aprender('GirarPorSiempre')\n</code></pre>\n\n<p>El m\u00e9todo <code>actualizar</code> de la habilidad se ejecutar\u00e1 60 veces por segundo, y\nen este caso har\u00e1n que cualquier actor que aprenda la habilidad <code>GirarPorSiempre</code>\nde vueltas constantemente.</p>\n<p>Not\u00e1 que dentro de los m\u00e9todos de la habilidad, la variable <code>self.receptor</code> apunta\nal actor que conoce a esa habilidad.</p>\n<p>Por \u00faltimo, en este ejemplo, vinculamos la nueva habilidad al m\u00f3dulo de\nhabilidades usando el m\u00e9todo <code>pilas.habilidades.vincular</code>.</p>\n<h3 id=\"argumentos-iniciales-para-las-habilidades\">Argumentos iniciales para las habilidades</h3>\n<p>Hay casos en donde queremos que las habilidades pueda recibir argumentos\niniciales, para esos casos necesitamos crear el m\u00e9todo <code>iniciar</code> y configurarlo\ncorrectamente.</p>\n<p>Siguiendo con nuestro ejemplo, imagin\u00e1 que ahora queremos que esta habilidad\nnos permita hacer girar a los actores pero a diferentes velocidades: en algunos\ncasos queremos ense\u00f1ar a una actor a girar r\u00e1pido y a otro mas lento. \u00bfC\u00f3mo\nser\u00eda en pilas?.</p>\n<p>Lo primero es crear la clase, muy parecida a la anterior, solamente que\nahora creamos el m\u00e9todo iniciar con dos argumentos, el primer es <code>receptor</code>, que\nes obligatorio y el segundo es nuestro argumento de velocidad:</p>\n<pre><code class=\"python\">class GirarPorSiemprePersonalizado(pilasengine.habilidades.Habilidad):\n\n    def iniciar(self, receptor, velocidad):\n        self.receptor = receptor\n        self.velocidad = velocidad\n\n    def actualizar(self):\n        self.receptor.rotacion += self.velocidad\n\npilas.habilidades.vincular(GirarPorSiemprePersonalizado)\n</code></pre>\n\n<p>Ahora, la nueva habilidad necesita que le especifiquemos la velocidad\nal iniciar, as\u00ed que tenemos que usar algo as\u00ed:</p>\n<pre><code class=\"python\">actor_lento = pilas.actores.Actor()\nactor_lento.aprender('GirarPorSiemprePersonalizado', 1)\n\nactor_rapido = pilas.actores.Actor(y=100)\nactor_rapido.aprender('GirarPorSiemprePersonalizado', 5)\n</code></pre>\n\n", 
    "url": "/habilidades/", 
    "language": "en", 
    "title": "Habilidades"
}