Я хочу стрелять из снаряда, используя javafx QuadCurveTo, но почему-то не правильно, что я пытаюсь стрелять из снаряда под углом, близким к 90 градусам, поэтому я использовал несколько исчислений, чтобы получить контрольную точку для Квадратичная кривая c, независимо от высоты контрольных точек, кажется, не работает соответственно, я надеюсь, что мой вопрос ясен, так как я впервые задаю вопрос на форуме, заранее спасибо.
вот мой код:
package game.entities;
import java.util.Random;
import javafx.scene.shape.QuadCurveTo;
public class Projectile {
private double controlX;
private double controlY;
private double xInitial;
private double yInitial;
private double xFinal;
private double yFinal;
private double maxHeight;
private double thetaInitial;
private double velocityInitial;
private double time;
private double deltaX;
//Constructing projectile using projectile dynamics laws
public Projectile() {
Random rnd = new Random();
thetaInitial = Math.toRadians(getRandomWithExclusion( rnd, 70, 80, 89,90,91)); //theta randomly generated
maxHeight = (Math.random() * 100) + 2200; // randomly generated
xInitial = (Math.random() * (1070)); // randomly generated
yInitial = 600; //constant
yFinal = yInitial;
}
public double getXInitial() {
return xInitial;
}
public double getYInitial() {
return yInitial;
}
public double getTime() {
return time;
}
public QuadCurveTo constructPath() {
doMaths();
System.out.printf("MAX H : %.2f\tCTRLY %.2f\tTHETA:%.2f\n",maxHeight,controlY,Math.toDegrees(thetaInitial));
return new QuadCurveTo(controlX, controlY, xFinal, yFinal);
}
public double getDeltaX() {
return deltaX;
}
public void setDeltaX(double deltaX) {
this.deltaX = deltaX;
}
public int getRandomWithExclusion(Random rnd, int start, int end, int... exclude) {
int random = start + rnd.nextInt(end - start + 1 - exclude.length);
for (int ex : exclude) {
if (random < ex) {
break;
}
random++;
}
return random;
}
public void doMaths() {
velocityInitial = Math.sqrt(maxHeight * 2 * 9.81 / Math.pow(Math.sin(thetaInitial), 2)); //Velocity Initial
xFinal = xInitial + Math.pow(velocityInitial, 2) * Math.sin(2 * thetaInitial) / 9.81; // FINAL X
time = 0.25*2 * velocityInitial * Math.sin(thetaInitial) / 9.81; //TIME OF FLIGHT
controlX = (xFinal + xInitial) / 2; //CONTROL X OF BEZIER CURVE
controlY = (Math.tan(thetaInitial)-((9.81*controlX)/(Math.pow(Math.cos(thetaInitial),2)*Math.pow(velocityInitial, 2))));
}
}
и вот функция перемещения:
@Override
public void move() {
Path path = new Path();
path.getElements().add(new MoveTo(projectile.getXInitial(), projectile.getYInitial()));
path.getElements().add(projectile.constructPath());
PathTransition pathTransition = new PathTransition(Duration.seconds(projectile.getTime()), path, this.getNode());
pathTransition.play();
pathTransition.setOnFinished(e -> {
if(((AnchorPane) this.getNode().getParent())!=null && ((AnchorPane) this.getNode().getParent()).getChildren()!=null)
{
((AnchorPane) this.getNode().getParent()).getChildren().remove(this.getNode());
}
});
}