Listo, ahora si quedó bien:
He usado el módulo a modo de diferencia sobre el calculo real basado en condicionales, de esa manera puedo invertir el valor de la rotación sin tener el problema del desface ni desbordamiendo numérico![:D :D](https://forum.elhacker.net/Smileys/navidad/cheesy.gif)
Acá va el código completo de la función de rotación:
Código (java) [Seleccionar]
// CW o CCW
if(clock_wise) {
this.angle += (diff_millisecond / 10);
if(this.angle >= 360)
this.angle = 0.0F + (this.angle % 360);
}else{
this.angle -= (diff_millisecond / 10);
if(this.angle <= 0)
this.angle = 360.0F + (this.angle % 360);
}
He usado el módulo a modo de diferencia sobre el calculo real basado en condicionales, de esa manera puedo invertir el valor de la rotación sin tener el problema del desface ni desbordamiendo numérico
![:D :D](https://forum.elhacker.net/Smileys/navidad/cheesy.gif)
Acá va el código completo de la función de rotación:
Código (java) [Seleccionar]
/**
* Actualiza la posición de los objetos
*/
@Override
public synchronized void update() {
super.update();
/**
* Control de frames.
* Controla los frames dependiendo del tiempo transcurrido,
* esto prefieve en desface por lagg.
*/
if (last_millisecond == null) {
this.last_millisecond = Calendar.getInstance().getTimeInMillis();
}
Long current_millisecond = Calendar.getInstance().getTimeInMillis();
Long diff_millisecond = current_millisecond - this.last_millisecond;
this.last_millisecond = current_millisecond;
/**
* Contexto.
* Calcula el grado de inclinación de los objetos y todo aquello
* que sea necesario para calcular distancias y posicionamiento.
*/
if(!this.launched) {
// CW o CCW
if(clock_wise) {
this.angle += (diff_millisecond / 10);
// Previene el desbordamiento (solo de 0 a 360)
if(this.angle >= 360)
this.angle = 0.0F + (this.angle % 360);
}else{
this.angle -= (diff_millisecond / 10);
// Previene el desbordamiento (solo de 360 a 0)
if(this.angle <= 0)
this.angle = 360.0F + (this.angle % 360);
}
// El valor modular es el mismo en ambos sentidos asi que deja de funcionar
// el sentido de rotación dinámico
// this.angle = (this.angle % 360);
}else{
this.diameter_rotation_ship = this.diameter_rotation_ship + (diff_millisecond / 12);
}
/**
* Controlador.
* Controla el posicionamiento de los objetos para ser dibujado.
*/
// Cambia el tamaño
this.matrix.setScale(1, 1);
// Rota la imagen a partir de su centro y base inferior vertical
this.matrix.postRotate(this.angle, this.image.getWidth() / 2, this.image.getHeight());
// % del angulo de 0 a 360
Float angle_percent = ((this.angle * 100.0F) / 360);
// -3.1415 a 3.1415 (-pi a pi)
// PI es la posición de grado 0 de inclinación y -PI es 360 grados, por lo cual 0 es 180 grados
// comenzando desde el punto superior vertical y centro horizontal.
// Calcula el porcentaje entre -pi y pi, en ves de esto se usa pi*2 y luego se resta pi.
Float alpha = -(((( ((Double)Math.PI).floatValue() * 2.0F) * angle_percent) / 100.0F) - ((Double)Math.PI).floatValue());
// Añadidura de espacio en dirección hacia el grado de rotación del circulo principal
Float horizontal_padding = ((Double)Math.sin(alpha)).floatValue();
Float vertical_padding = ((Double)Math.cos(alpha)).floatValue();
// Cantidad de espacio añadido (desde el centro hacia el borde del circulo principal,
// es la mitad del diametro o su radio)
horizontal_padding *= (this.start_circle.getWidth() / 2);
vertical_padding *= (this.start_circle.getHeight() / 2);
// Posiciona el objeto al centro del circulo
this.matrix.postTranslate(
this.start_circle.getLeft() + (this.start_circle.getWidth() / 2) - (this.image.getWidth() / 2) + horizontal_padding,
this.start_circle.getTop() + (this.start_circle.getHeight() / 2) - this.image.getHeight() + vertical_padding
);
}