hugoruscitti/pilas

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

Summary

Maintainability
Test Coverage
{
    "content": "<h1 id=\"actores-personalizados\">Actores personalizados</h1>\n<p>Cuando tu juego crece, comienza la necesidad de crear\ntus propios actores, darles personalidad y lograr\nfuncionalidad personalizada.</p>\n<p>Esta p\u00e1gina describe como crear tus propios actores\nusando im\u00e1genes y algunos comportamientos propios.</p>\n<h2 id=\"creando-una-clase\">Creando una clase</h2>\n<p>El primer paso para crear un actor personalizado\nes construir una clase para agrupar toda la funcionalidad\nesperada.</p>\n<p>Comencemos con una imagen sencilla para el\nactor, este archivo se llama <code>alien.png</code> y est\u00e1\nen el directorio de nuestro c\u00f3digo:</p>\n<p><img alt=\"imagen alien.png\" src=\"../imagenes/actores_personalizados/alien.png\" /></p>\n<p>Luego, es momento de crear el c\u00f3digo de la clase para\nagrupar todo lo relacionado a este nuevo actor. Por\nejemplo con un c\u00f3digo as\u00ed:</p>\n<pre><code>import pilasengine\n\nclass Alien(pilasengine.actores.Actor):\n\n    def iniciar(self):\n        self.imagen = &quot;alien.png&quot;\n</code></pre>\n\n<h2 id=\"mostrando-el-actor-en-la-pantalla\">Mostrando el actor en la pantalla</h2>\n<p>Meditante la clase solamente hemos creado la \"definici\u00f3n\"\ndel actor, pero no lo hemos incorporado en el juego\na\u00fan.</p>\n<p>El siguiente paso es incorporarlo al juego usando\nla sentencia:</p>\n<pre><code>alien = Alien(pilas)\n</code></pre>\n\n<p>Ahora con el c\u00f3digo completo, tendr\u00edas que ver al personaje\nen el centro de la pantalla:</p>\n<p><img alt=\"imagen alien.png\" src=\"../imagenes/actores_personalizados/completo.png\" /></p>\n<h2 id=\"comportamiento-heredado\">Comportamiento heredado</h2>\n<p>Algo interesante de los nuevos actores es que incorporan\npor herencia lo que saben hacer casi todos los actores\nde <code>pilas</code>, ya que le hemos indicado que heredar\u00e1\nde clase actor con la linea <code>class Alien(pilasengine.actores.Actor):</code>.</p>\n<p>Por ejemplo, podr\u00edas escribir algo como:</p>\n<pre><code>alien.decir(u\"\u00a1oh, no, humanos!\")\n</code></pre>\n<p><img alt=\"\" src=\"../imagenes/actores_personalizados/decir.png\" /></p>\n<h2 id=\"creando-metodos-nuevos\">Creando m\u00e9todos nuevos</h2>\n<p>Ten en cuenta que ahora con nuestra nueva\nclase podemos crear funcionalidad nueva y espec\u00edfica\npara este actor alien.</p>\n<p>Solo tenemos que tener precauci\u00f3n de dirigirnos al\nactor como <code>self</code> dentro de los m\u00e9todos. Por ejemplo,\nsi quiero crear un m\u00e9todo para saludar puedo escribir:</p>\n<pre><code>import pilasengine\n\nclass Alien(pilasengine.actores.Actor):\n\n    def iniciar(self):\n        self.imagen = &quot;alien.png&quot;\n\n    def saludar(self):\n        self.decir(&quot;Hola mundo!!!, soy el nuevo actor alien&quot;)\n\n    def dar_vuelta(self):\n        self.rotacion = [360]\n</code></pre>\n\n<p>Y ahora tenemos dos m\u00e9todos nuevos para invocar:</p>\n<pre><code>alien.saludar()\n</code></pre>\n<p><img alt=\"\" src=\"../imagenes/actores_personalizados/saludar.png\" /></p>\n<p>y otro un poquito mas complejo:</p>\n<pre><code>alien.dar_vuelta()\n</code></pre>\n<p><img alt=\"\" src=\"../imagenes/actores_personalizados/dar_vuelta.gif\" /></p>\n<h2 id=\"el-metodo-especial-actualizar\">El m\u00e9todo especial \"actualizar\"</h2>\n<p>Una de las cosas mas importantes de la clase actor\nes que incorpora un m\u00e9todo especial llamado <code>actualizar</code>. Este m\u00e9todo se llamar\u00e1 autom\u00e1ticamente\n60 veces por segundo.</p>\n<p>Por ejemplo, imagina que buscamos hacer que el\nactor se mueva para los costados usando las flechas\ndel teclado, podemos usar est\u00e9 m\u00e9todo, simplemente\nas\u00ed:</p>\n<pre><code>class Alien(pilasengine.actores.Actor):\n\n    def iniciar(self):\n        self.imagen = &quot;alien.png&quot;\n\n    def saludar(self):\n        self.decir(&quot;Hola mundo!!!, soy el nuevo actor alien&quot;)\n\n    def dar_vuelta(self):\n        self.rotacion = [360]\n\n    def actualizar(self):\n        if pilas.control.izquierda:\n            self.x -= 5\n            self.espejado = True\n        if pilas.control.derecha:\n            self.x += 5\n            self.espejado = False\n</code></pre>\n\n<p>Es decir, como el m\u00e9todo actualizar se llama casi\ntodo el tiempo, podemos usarlo para consultar\nel estado del teclado y hacer algo.</p>\n<p>En este caso, si se pulsa hacia la izquierda movemos\nel actor un poquito a la izquierda (con <code>self.x -= 5</code>)\ny adem\u00e1s invertimos el gr\u00e1fico del actor para que mire a la\nizquierda (con <code>self.espejado = True</code>). Y claro, hacemos lo\nopuesto para el lado\nderecho.</p>\n<p>As\u00ed se ve mientras voy pulsando las teclas <code>izquierda</code>\ny <code>derecha</code>:</p>\n<p><img alt=\"\" src=\"../imagenes/actores_personalizados/caminando.gif\" /></p>\n<h2 id=\"leyendo-el-codigo-de-otros-actores\">Leyendo el c\u00f3digo de otros actores</h2>\n<p>Pilas viene con una funci\u00f3n especial llamada\n<code>pilas.ver</code>, que te permite ver el c\u00f3digo de\ncualquier objeto y conocer su funcionamiento.</p>\n<p>Esta funci\u00f3n es super \u00fatil para conocer el c\u00f3digo\nde otras clases actor, e incluso aprender algunas\nideas interesantes.</p>\n<p>Estos son algunos ejemplos de invocaci\u00f3n, cada\nuna de estas sentencias te mostrar\u00e1 el c\u00f3digo\nde la clase completa:</p>\n<pre><code class=\"python\">pilas.ver(pilasengine.actores.Mono)\npilas.ver(pilasengine.actores.Aceituna)\npilas.ver(pilasengine.actores.Pacman)\npilas.ver(mono)\n</code></pre>\n\n<h2 id=\"parametros-iniciales-para-los-actores\">Parametros iniciales para los actores</h2>\n<p>Existen varios casos en donde queremos crear actores\npero especificando algunos parametros iniciales, como\nla posici\u00f3n, energia o cualquier otro valor\nexterno a la clase.</p>\n<p>Para estos par\u00e1metros podemos crear argumentos personalizados\nen la clase nueva, por ejemplo, si quieres crear al actor\n<code>Alien</code> (que tomamos de ejemplo aqu\u00ed) pero quieres especificarle\nenergia, podr\u00edas escribir:</p>\n<pre><code>alien = Alien(pilas, energia=100, nombre=&quot;pepe alien&quot;, con_sombra=True)\n</code></pre>\n\n<p>Y atender esos argumentos desde el m\u00e9todo iniciar:</p>\n<pre><code class=\"python\">class Alien(pilasengine.actores.Actor):\n\n    def iniciar(self, energia, nombre, con_sombra):\n        self.imagen = &quot;alien.png&quot;\n\n        self.nombre = nombre\n        self.energia = energia\n\n        if con_sombra:\n            self.sombra = pilas.actores.Sombra()\n            self.sombra.escala = 0.6\n            self.sombra.y = -45\n        else:\n            self.sombra = None\n\n        self.decir(&quot;Hola, me llamo &quot; + nombre)\n\n    def actualizar(self):\n        # Si el actor tiene sombra, hacemos que siga al\n        # actor.\n        if self.sombra:\n            self.sombra.x = self.x\n            self.sombra.y = self.y -45\n</code></pre>\n\n<p>Y el resultado deber\u00eda quedarte as\u00ed:</p>\n<p><img alt=\"\" src=\"../imagenes/actores_personalizados/personalizado.png\" /></p>\n<h2 id=\"detectando-errores-y-problemas-al-inicializar\">Detectando errores y problemas al inicializar</h2>\n<p>Es muy importante que al momento de crear actores a partir\nde clases especifiques los argumentos a utilizar. Hemos inclu\u00eddo\nalgo de c\u00f3digo especial en <strong>pilas</strong> para detectar errores comunes, como\nargumentos faltantes o incorrectos.</p>\n<p>Pero a\u00fan as\u00ed, ten en cuenta que todo argumento que le env\u00edes\na un actor al crearlo tiene que estar declarado como argumento\nen el m\u00e9todo <code>iniciar</code>.</p>\n<p>Por ejemplo, un mensaje de error habitual que mostrar\u00e1 pilas si olvidamos\nel nombre de los argumentos podr\u00eda ser:</p>\n<pre><code>\u00d7 TypeError: No se puede llamar al metodo 'iniciar' de la clase 'Alien'.\n\u00d7    Faltan 3 argumentos: energia, nombre, con_sombra.\n\u00d7    El m\u00e9todo 'iniciar' espera estos 3 argumentos: ['energia', 'nombre', 'con_sombra']\n</code></pre>\n\n<p>Esto significa que hemos querido crear un actor a partir de una clase\nque espera 3 argumentos, pero solo hemos llamado incorrectamente.</p>\n<p>Regresando a nuestro ejemplo anterior, esto producir\u00eda un error:</p>\n<pre><code>alien = Alien(pilas)\n</code></pre>\n\n<p>mientras que este otro ejemplo s\u00ed funcionar\u00e1, porque el m\u00e9todo\n<code>iniciar</code> de la clase <code>Alien</code> espera los argumentos <code>energia</code>, <code>nombre</code> y\n<code>con_sombra</code>:</p>\n<pre><code class=\"python\">alien = Alien(pilas, energia=100, nombre=&quot;pepe alien&quot;, con_sombra=True))\n</code></pre>\n\n", 
    "url": "/actores_personalizados/", 
    "language": "en", 
    "title": "Actores personalizados"
}