גראַפיקאַל פּראָגראַממינג: מאָטאָר אַנאַמיישאַן [דזשאַוואַ]

motor_animaciónDespués de definir un primer צובינד para dibujar los objetos gráficos אין דזשאַוואַ, vamos a implementar un motor gráfico de animación que nos permita gestionar la dinámica de la aplicación y, שפּעטער, לייגן באַניצער ינטעראַקשאַן.

El motor se encargará de llamar a las funciones que animan a cada uno de los objetos gráficos de la base de datos.

א motor de videojuego es un término que hace referencia a una serie de rutinas de programación que permiten el diseño, la creación y la representación de un videojuego.

Del mismo modo existen motores de juegos que operan tanto en consolas de videojuegos y sistemas operativos. La funcionalidad básica de un motor es proveer al videojuego de un motor de renderizado para los gráficos 2D y, motor físico o detector de colisiones, sonidos, scripting, אַנאַמיישאַן, inteligencia artificial, redes, streaming, administración de memoria y un escenario gráfico.(די).

Nuestra primera implementación del motor se apoyará en la funcionalidad que ya tenemos en la clase responsable del almacenamiento y representación: “Blackboard“. Definiremos un nuevo interface para añadir una nueva funcionalidad, la posibilidad de animar un objeto.

Interface Animable

El nuevo “צובינד” declarará un único método que deberán incorporar las clases que lo implementen.

package graph;

עפנטלעך צובינד Animable {
	עפנטלעך פּאָסל anima();
}

לעמאָשל, podemos modificar una de nuestras clases gráficas para que se anime, o crear una nueva que extienda la funcionalidad de otra, como es el caso de la nueva clase Point2DAnimable אַז extiende la clase Point2D para almacenar coordenadas, און implementa el interface Animable con la función anima que simplemente modifica aleatoriamente las coordenadas almacenadas.

package graph;

public class Point2DAnimable יקסטענדז Point2D implements Animable{
	עפנטלעך Point2DAnimable(ינט X, ינט און){
		super(X,און);
	}
	ציבור פּאָסל anima() {
		x+=(ינט)(Math.random()*5);
		x-=(ינט)(Math.random()*5);
		y+=(ינט)(Math.random()*5);
		y-=(ינט)(Math.random()*5);
	}
}

Añadiremos los nuevos objetos al sistema de almacenamiento de la clase Blackboard desde el applett principal

	private void iniciarElementos() {
		pizarra.addElement(new Point2DAnimable(50,50));
		pizarra.addElement(new Point2D(70,50));
		pizarra.addElement(new Point2D(50,70));
	}

Para animar los objetos de la base de datos, implementaremos un nuevo método en la clase Blackboard que se encargará de analizar si son animables, en cuyo caso llamará a la función anima propia de cada objeto

	public void anima(){
		Enumeration enum=bd.elements();
		Object ob;
		while(enum.hasMoreElements()){
			ob=enum.nextElement();
			צי(ob instanceof Animable){
				((Animable) ob).anima();
			}
		}

	}

Motor de animación

El proceso que gestiona la actualización de la animación es el que denominamos motor de animación (construido como un hilo oThread“). Su responsabilidad se limita a llamar al procedimiento de animación que hemos implementado en la clase Blackboard.

אין sistemas operativos, un hilo de ejecución, hebra o subproceso es la unidad de procesamiento más pequeña que puede ser planificada por un sistema operativo.

Un hilo (Thread) es una característica que permite a una aplicación realizar varias tareas a la vez (concurrentemente). Los distintos hilos de ejecución comparten una serie de recursos tales como el espacio de memoria, los archivos abiertos, situación de autenticación, אאז"ו ו. Esta técnica permite simplificar el diseño de una aplicación que debe llevar a cabo distintas funciones simultáneamente.

Un hilo es básicamente una tarea que puede ser ejecutada en paralelo con otra tarea.(די)

Nuestro motor de animación implementará la claseRunnablepara disponer de métodos de inicio y parada.

package graph;

public class MotorGrafico implements Runnable {
long interval = 100;

Dispondremos de una serie de variables de control de tipo booleano para poder pausar la animación.

boolean parar = false;
public void parar() { parar = true; }

boolean pausado = false;
void pausar() { pausado = !pausado; }

El constructor de la clase recibirá un objetoBlackboardcomo parámetro. Servirá para saber qué elemento tiene la función de animación principal. Este objeto lo almacenaremos en una variable para referenciarlo posteriormente.

private Blackboard graf;
עפנטלעך MotorGrafico(Blackboard graf) {
	this.graf=graf;
}

Antes de arrancar el hilo de ejecución deberemos asegurarnos de que no está activo, en cuyo caso deberemos destruirlo para no ejecutar nada más que un proceso a la vez.

private volatile Thread blinker;
ציבור פּאָסל start() {
	צי(blinker!=null){
		blinker=null;
	}
	blinker = new Thread(this);
	blinker.start();
}

Para parar el motor de animación destruiremos el hilo de ejecución, simplemente asignándole un valor nulo a la variable que controla elThread”.

עפנטלעך פּאָסל stop() {
	blinker = null;
}

El proceso principal se realiza en la funciónrun()”.

Primero comprobaremos que no deseamos parar la ejecución del programa, y verificaremos que el hilo de ejecución es el adecuado. Si esto es así, suspenderemos la ejecución del programa unos milisegundos con la llamada asleep” און, al reanudarla, llamaremos al método de animación. Una vez animados los elementos gráficos volveremos a dibujarlos (repaint)

ציבור פּאָסל run() {
	Thread thisThread = Thread.currentThread();

	while (!parar && blinker == thisThread) {
		try {
			thisThread.sleep(interval);
		}  catch (InterruptedException e) {}

		צי (graf != null && !pausado) {
			animate();
			graf.repaint();
		}
	}
}

La funciónanimatellamará a la funciónanima()” de la claseBlackboard”, responsable de almacenar la base de datos gráfica.

	פּריוואַט פּאָסל animate() {
		graf.anima();
	}
}

Ejecución del programa

La clase de ejemplo deberá incluir la declaración de un objetoMotorGraficoal que le pasaremos el correspondiente parámetro para localizar la pantalla gráfica oBlackboard”.

public class Example1 יקסטענדז אַפּלאַט {
	Blackboard pizarra=new Blackboard();
	MotorGrafico motor =new MotorGrafico(pizarra);

אויך, deberemos arrancar el motor de animación mediante la llamada a su métodostart()”

	עפנטלעך Example1() throws HeadlessException {
		this.setLayout(new GridLayout());
		this.add(pizarra);
		iniciarElementos();
		motor.start();
	}

Sólo nos queda añadir algunos elementos animables a la base de datos gráficos para completar el ejercicio. Veremos que unos puntos no se mueven, mientras que los que implementan el interfaceAnimablesi lo hacen de forma aleatoria.

	private פּאָסל iniciarElementos() {
		pizarra.addElement(new Point2DAnimable(50,50));
		pizarra.addElement(new Point2DAnimable(60,50));
		pizarra.addElement(new Point2DAnimable(50,80));
		pizarra.addElement(new Point2DAnimable(50,70));
		pizarra.addElement(new Point2D(70,50));
		pizarra.addElement(new Point2D(50,70));
	}
JAVA

לויף דזשאַוואַ