Стрельба снарядами JAVAFX - PullRequest
0 голосов
/ 01 мая 2020

Я хочу стрелять из снаряда, используя 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());
            }

        });
    }
...