Hola gente!!
Estoy desarrollando el juego del air-hockey en Java3D. Ya tengo implementados los métodos más importantes para poder probar la aplicación completa.
Tengo las siguientes clases: una clase Mazo, una llamada Disco, otra Mesa y otra en la que junto todos los objetos y dibujo la escena (clase principal).
Cuando muevo el mazo hacia el disco y este detecta una cierta distancia límite, significa que hay colisión y, por tanto, que el mazo al golpear el disco este se ha de mover en función del ángulo y velocidad que el mazo le imprima.
Esto funciona correctamente, el disco se mueve a su posición destino; sin embargo, me gustaría que en lugar de que el disco se cambie de posición directamente de un punto a otro, se deslizara para crear la apariencia real de este juego. Es decir, añadir una animación al movimiento.
Dando un vistazo a mi manual de Java 3D he visto que hay clases que extienden de: Interpolator. Viendo un ejemplo de una concreta: PositionPathInterpolator, me pareció la más idónea para mi juego.
Así que la adapte y añadí un método que se encargará de la animación y es el siguiente:
public PositionPathInterpolator animacionDisco() {
Alpha rotAlpha = new Alpha();
rotAlpha.setMode(Alpha.INCREASING_ENABLE);
rotAlpha.setLoopCount(1);
rotAlpha.setIncreasingAlphaDuration(500);
Point3f[] pos = new Point3f[2];
pos[0] = UtilidadesGeometria.Vector3f2Point3f(objeto.getDisco().getPosicion());
pos[1] = UtilidadesGeometria.Vector3f2Point3f(objeto.getDisco().getPosicionDestino());
//pos[2] = UtilidadesGeometria.Vector3f2Point3f(objeto.getDisco().getPosicionDestino());
PositionPathInterpolator rotPosInterpolation = new
PositionPathInterpolator(rotAlpha, modificarTG, translation, knots, pos);
rotPosInterpolation.setSchedulingBounds(bounds);
rotPosInterpolation.setEnable(true);
rotPosInterpolation.setKnot(0,knots[0]);
rotPosInterpolation.setKnot(1,knots[1]);
//rotPosInterpolation.setKnot(2,knots[2]);
return rotPosInterpolation;
}
Donde modificarTG es de tipo TransformGroup, atributo de la clase que apunta al TransformGroup del propio disco; y translation es de tipo Transform3D, atributo de la clase y que se inicializa por medio de su constructor por defecto.
Este método está dentro de la clase que controla el comportamiento del Disco cuando se mueve.
La llamada al método anterior se hace de la siguiente forma:
BranchGroup nuevoBG = new BranchGroup();
nuevoBG.addChild(animacionDisco());
nuevoBG.compile();
locale.addBranchGraph(nuevoBG);
Creo una nueva rama BranchGroup a la que añado la animación y posteriormente se la añado al locale general de la escena que se le pasa por parámetros a esta clase.
La cuestión es que tal y como está ahora mismo, los movimientos son estáticos, es decir, desaparece de un punto y aparece en otro pero el movimiento no es por animación, sin embargo, si comento la llamada al método como es lógico el disco no se mueve. Lo que significa que entra en el método animación pero no lo llega a hacer.
¿Podéis indicarme por dónde puede ir el fallo o posibles soluciones?
Muchas gracias!!