Habilidades

Pilas permite añadir funcionalidad a tus objetos de manera sencilla, dado que usamos el concepto de habilidades, un enfoque similar a la programación orientada a componentes y mixins.

Un ejemplo

Una habilidad es una funcionalidad que está implementada en alguna clase, y que si quieres la puedes vincular a un actor cualquiera.

Veamos un ejemplo, imagina que tienes un actor en tu escena y quieres que la rueda del mouse te permita cambiarle el tamaño.

Puedes usar la habilidad AumentarConRueda y vincularla al actor fácilmente.

El siguiente código hace eso:

import pilasengine

pilas = pilasengine.iniciar()

mono = pilas.actores.Mono()
mono.aprender(pilas.habilidades.AumentarConRueda)

o bien:

mono.aprender('AumentarConRueda')

así, cuando uses la rueda del mouse el tamaño del personaje aumentará o disminuirá.

Nota que aquí usamos la metáfora de "aprender habilidades", porque las habilidades son algo que duran para toda la vida del actor.

Un ejemplo mas: hacer que un actor se pueda mover con el mouse

Algo muy común en los juegos es que puedas tomar piezas con el mouse y moverlas por la pantalla.

Esta habilidad llamada Arrastrable representa eso, puedes vincularlo a cualquier actor y simplemente funciona:

import pilas

mono = pilas.actores.Mono()
mono.aprender(pilas.habilidades.Arrastrable)

Otro ejemplo: un actor que cambia de posición

Veamos otro ejemplo sencillo, si queremos que un actor se coloque en la posición del mouse cada vez que hacemos click, podemos usar la habilidad: SeguirClicks.

import pilas

mono = pilas.actores.Mono()
mono.aprender(pilas.habilidades.SeguirClicks)

Mezclar habilidades

En pilas se ha intentado hacer que las habilidades sean lo mas independientes posibles, porque claramente lo mas divertido de este enfoque es poder combinar distintas habilidades para lograr comportamientos complejos.

Así que te invitamos a experimentar y explorar la mezcla de habilidades.

Otras habilidades para utilizar

Pilas viene con varias habilidades incluidas, pero lamentablemente este manual no las menciona a todas. Así que te recomendamos abrir un intérprete de python y consultarle directamente a él que habilidades tienes disponibles en tu versión de pilas.

Para esto, abrí el intérprete de pilas y escribí lo siguiente:

dir(pilas.habilidades)

esto imprimirá en pantalla todas las habilidades como una lista de cadenas.

Crear habilidades personalizadas

Para crear una habilidad nueva, tienes que crear una clase y vincularla al módulo de habilidades.

La clase tiene que heredar de pilasengine.habilidades.Habilidad y puede tener un método actualizar, en donde generalmente se coloca la acción a realizar:

class GirarPorSiempre(pilasengine.habilidades.Habilidad):

    def actualizar(self):
        self.receptor.rotacion += 1

pilas.habilidades.vincular(GirarPorSiempre)

actor = pilas.actores.Actor()
actor.aprender('GirarPorSiempre')

El método actualizar de la habilidad se ejecutará 60 veces por segundo, y en este caso harán que cualquier actor que aprenda la habilidad GirarPorSiempre de vueltas constantemente.

Notá que dentro de los métodos de la habilidad, la variable self.receptor apunta al actor que conoce a esa habilidad.

Por último, en este ejemplo, vinculamos la nueva habilidad al módulo de habilidades usando el método pilas.habilidades.vincular.

Argumentos iniciales para las habilidades

Hay casos en donde queremos que las habilidades pueda recibir argumentos iniciales, para esos casos necesitamos crear el método iniciar y configurarlo correctamente.

Siguiendo con nuestro ejemplo, imaginá que ahora queremos que esta habilidad nos permita hacer girar a los actores pero a diferentes velocidades: en algunos casos queremos enseñar a una actor a girar rápido y a otro mas lento. ¿Cómo sería en pilas?.

Lo primero es crear la clase, muy parecida a la anterior, solamente que ahora creamos el método iniciar con dos argumentos, el primer es receptor, que es obligatorio y el segundo es nuestro argumento de velocidad:

class GirarPorSiemprePersonalizado(pilasengine.habilidades.Habilidad):

    def iniciar(self, receptor, velocidad):
        self.receptor = receptor
        self.velocidad = velocidad

    def actualizar(self):
        self.receptor.rotacion += self.velocidad

pilas.habilidades.vincular(GirarPorSiemprePersonalizado)

Ahora, la nueva habilidad necesita que le especifiquemos la velocidad al iniciar, así que tenemos que usar algo así:

actor_lento = pilas.actores.Actor()
actor_lento.aprender('GirarPorSiemprePersonalizado', 1)

actor_rapido = pilas.actores.Actor(y=100)
actor_rapido.aprender('GirarPorSiemprePersonalizado', 5)