-
Notifications
You must be signed in to change notification settings - Fork 29
Modelo de Comportamientos
Pilas Bloques construye todas las acciones que puede hacer cada autómata a partir de la idea de Comportamiento existente en Pilas Web. Ésta es una idea muy poderosa, ya que permite tratar a las acciones como objetos, y gracias a esto se logran dos características importantes:
- Primero, los comportamientos son independientes de los actores, por lo que son -casi- completamente intercambiables con actores diferentes.
- Segundo, al ser objetos, se pueden modelar abstracciones y maximizar la reutilización de lógica, implementando, por ejemplo, una jerarquía de comportamientos.
El presente documento describe la jerarquía de comportamientos existente en Pilas Bloques, y justifica un poco cada decisión tomada.
En Pilas Web, Si se tiene a un actor "Mono" y se desea que el mono salte, se debe hacer:
var mono = pilas.actores.Mono(0,0);
mono.hacer_luego(pilas.comportamientos.Saltar, {velocidad_inicial:50})
En otras palabras, los actores entienden el mensaje "hacer_luego", que recibe una subclase de Comportamiento (sin instanciar), y un objeto con las configuraciones que el comportamiento necesita (en Pilas Engine estas configuraciones se denominan argumentos).
Para funcionar, el comportamiento debe implementar dos métodos muy importantes: el método iniciar()
y el método actualizar()
.
El método iniciar(receptor)
debe, además de guardar el receptor del comportamiento (que es el actor que estará haciendo la acción), realizar todas las configuraciones iniciales. Se ejecuta apenas se llama el método actor.hacer_luego.
Ejemplo rudimentario:
class Saltar extends Comportamiento {
iniciar(receptor) {
super.iniciar(receptor);
this.velocidad = this.argumentos.velocidad_inicial
}
}
El método actualizar()
es el que realiza la modificación al actor. Debe pensarse como un método que "loopea", es decir, Se ejecuta en cada ciclo de la escena. Y se sigue ejecutando hasta retornar true. Entonces, en todo método actualizar()
siempre habrá un momento en el que el método retorne true para avisar que el comportamiento ha finalizado.
Ejemplo rudimentario:
class Saltar extends Comportamiento {
actualizar() {
this.receptor.y += this.velocidad;
this.velocidad -= 0.3;
if (this.receptor.y <= 0) return true;
}
}
Sin embargo, si bien es necesario entender este modelo, en Pilas Bloques es muy raro que se implemente de esta manera, porque hay una clase ComportamientoAnimado
que resuelve algunos problemas comunes a todos los comportamientos en Pilas Bloques.
Como en Pilas Bloques hay varios comportamientos que realizan acciones sólo al final ó al principio, y además casi todas las acciones tienen algún tipo de animación, se creó la clase ComportamientoAnimado
, de la que heredan casi todos los comportamientos de Pilas Bloques.