Improved Alchemy circle animation for Binding ritual.
This commit is contained in:
parent
db5ab41728
commit
9faae07131
|
@ -20,6 +20,9 @@ public class BindingAlchemyCircleRenderer extends AlchemyCircleRenderer {
|
||||||
public final int startTime = 50;
|
public final int startTime = 50;
|
||||||
public final int sweepTime = 40;
|
public final int sweepTime = 40;
|
||||||
|
|
||||||
|
public final float arcLength = (float) Math.sqrt(2*(2*2) - 2*2*2*Math.cos(2*Math.PI*2/5));
|
||||||
|
public final float theta2 = (float) (18f * Math.PI / 180f);
|
||||||
|
|
||||||
public final int endTime = 300;
|
public final int endTime = 300;
|
||||||
|
|
||||||
public BindingAlchemyCircleRenderer() {
|
public BindingAlchemyCircleRenderer() {
|
||||||
|
@ -39,7 +42,7 @@ public class BindingAlchemyCircleRenderer extends AlchemyCircleRenderer {
|
||||||
double sweep = (craftTime - startTime)/sweepTime;
|
double sweep = (craftTime - startTime)/sweepTime;
|
||||||
if(sweep >= 0 && sweep < numberOfSweeps) {
|
if(sweep >= 0 && sweep < numberOfSweeps) {
|
||||||
float offset = ((int)sweep)*sweepTime + startTime;
|
float offset = ((int)sweep)*sweepTime + startTime;
|
||||||
originalAngle += 2*Math.PI*2/5*((craftTime - offset)/sweepTime + (int)sweep);
|
originalAngle += 2*Math.PI*2/5*(int)sweep + getAngle(craftTime - offset, (int)sweep);
|
||||||
}else if(sweep >= numberOfSweeps)
|
}else if(sweep >= numberOfSweeps)
|
||||||
{
|
{
|
||||||
originalAngle += 2*Math.PI*2/5*numberOfSweeps + (craftTime - 5*sweepTime - startTime)*2*Math.PI*2/5/sweepTime;
|
originalAngle += 2*Math.PI*2/5*numberOfSweeps + (craftTime - 5*sweepTime - startTime)*2*Math.PI*2/5/sweepTime;
|
||||||
|
@ -52,22 +55,23 @@ public class BindingAlchemyCircleRenderer extends AlchemyCircleRenderer {
|
||||||
}
|
}
|
||||||
|
|
||||||
public float getAngle(float craftTime, int sweep) {
|
public float getAngle(float craftTime, int sweep) {
|
||||||
return (float) (2*Math.PI*2/5*(craftTime)/sweepTime);
|
float rDP = craftTime/sweepTime*arcLength;
|
||||||
|
float rEnd = (float) Math.sqrt(rDP*rDP + 2*2 - 2*rDP*2*Math.cos(theta2));
|
||||||
|
return (float) (Math.acos((2*2 + rEnd*rEnd - rDP*rDP)/(2*rEnd*2)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the center-to-center distance of this circle.
|
* Returns the center-to-center distance of this circle.
|
||||||
*/
|
*/
|
||||||
public float getDistanceOfCircle(int circle, float craftTime) {
|
public float getDistanceOfCircle(int circle, float craftTime) { //TODO Change this so it doesn't use angle, since it is a constant speed.
|
||||||
double sweep = (craftTime - startTime)/sweepTime;
|
double sweep = (craftTime - startTime)/sweepTime;
|
||||||
if(sweep >= 0 && sweep < numberOfSweeps) {
|
if(sweep >= 0 && sweep < numberOfSweeps) {
|
||||||
float offset = ((int)sweep)*sweepTime + startTime;
|
float offset = ((int)sweep)*sweepTime + startTime;
|
||||||
float angle = getAngle(craftTime - offset, (int) sweep);
|
float angle = getAngle(craftTime - offset, (int) sweep);
|
||||||
float theta2 = (float) (Math.PI - 4*Math.PI/5)/2f;
|
|
||||||
float thetaPrime = (float) (Math.PI - theta2 - angle);
|
float thetaPrime = (float) (Math.PI - theta2 - angle);
|
||||||
if(thetaPrime > 0 && thetaPrime < Math.PI) {
|
// if(thetaPrime > 0 && thetaPrime < Math.PI) {
|
||||||
return (float) (2 * Math.sin(theta2) / Math.sin(thetaPrime));
|
return (float) (2 * Math.sin(theta2) / Math.sin(thetaPrime));
|
||||||
}
|
// }
|
||||||
} else if(sweep >= numberOfSweeps && craftTime < endTime) {
|
} else if(sweep >= numberOfSweeps && craftTime < endTime) {
|
||||||
return 2 - 2 * (craftTime - startTime - numberOfSweeps * sweepTime) / (endTime - startTime - numberOfSweeps * sweepTime);
|
return 2 - 2 * (craftTime - startTime - numberOfSweeps * sweepTime) / (endTime - startTime - numberOfSweeps * sweepTime);
|
||||||
} else if(craftTime >= endTime) {
|
} else if(craftTime >= endTime) {
|
||||||
|
|
Loading…
Reference in a new issue