我正在为学校编写一个程序,并且是fx的新手。当用户以特定方向射击时,该程序应该是一个看起来很逼真的球。然后用户可以添加其他球。有一个球它很棒。但是当我尝试添加其他球时,他们会采取第一球的速度。不知何故,我的数组deltaX中的值没有传递给最后一个EventHandler。任何帮助将不胜感激:)
import java.util.ArrayList;
import java.util.List;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Bounds;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
import javafx.util.Duration;
public class Test extends Application {
public static Pane canvas;
int counter = 0;
int nr = 0;
double x;
double y;
double x2;
double y2;
ArrayList<Circle> circles = new ArrayList<Circle>();
public static List<Double> deltaX = new ArrayList<Double>();
public List<Double> deltaY = new ArrayList<Double>();
@Override
public void start(final Stage primaryStage) {
canvas = new Pane();
final Scene scene = new Scene(canvas, 800, 600);
primaryStage.setTitle("Spring Ball");
primaryStage.setScene(scene);
primaryStage.show();
canvas.addEventHandler(MouseEvent.MOUSE_PRESSED, ev -> {
x = ev.getX();
y = ev.getY();
});
canvas.addEventHandler(MouseEvent.MOUSE_RELEASED, ev -> {
x2 = ev.getX();
y2 = ev.getY();
circles.add(new Circle(15, Color.RED));
deltaX.add(counter, x2 - x); //
deltaY.add(counter, y2 - y); //
circles.get(counter).relocate(x-15, y-15);
canvas.getChildren().add(circles.get(counter));
counter++;
});
EventHandler<ActionEvent> draw = e -> { // Here the values of delta X are no longer the right ones. But the speed of the first ball
for (nr = 0; nr < counter; nr++) {
deltaX.add(nr, 0.99 * deltaX.get(nr));// air friction
deltaY.add(nr, 0.99 * deltaY.get(nr));
circles.get(nr).setLayoutX(circles.get(nr).getLayoutX() + deltaX.get(nr));
circles.get(nr).setLayoutY(circles.get(nr).getLayoutY() + deltaY.get(nr));
final Bounds bounds = canvas.getBoundsInLocal();
final boolean atRightBorder = circles.get(nr).getLayoutX() >= (bounds.getMaxX() - circles.get(nr).getRadius() - deltaX.get(nr));
final boolean atLeftBorder = circles.get(nr).getLayoutX() <= (bounds.getMinX() + circles.get(nr).getRadius() - deltaX.get(nr));
final boolean atBottomBorder = circles.get(nr).getLayoutY() >= (bounds.getMaxY() - circles.get(nr).getRadius() - deltaY.get(nr));
final boolean atTopBorder = circles.get(nr).getLayoutY() <= (bounds.getMinY() + circles.get(nr).getRadius() - deltaY.get(nr));
if (atRightBorder && deltaX.get(nr) > 0 || atLeftBorder && deltaX.get(nr) < 0) {
deltaX.add(nr, -0.9 * deltaX.get(nr));
}
if (atBottomBorder && deltaY.get(nr) >= 0 || atTopBorder && deltaY.get(nr) < 0) {
deltaY.add(nr, -0.9 * deltaY.get(nr));
if (Math.abs(deltaY.get(nr)) < 0.6) {
deltaY.add(nr, 0.0);
}
} else {
deltaY.add(nr, deltaY.get(nr) + 1);
}
}
};
KeyFrame drawframe = new KeyFrame(Duration.seconds(0.01), draw);
Timeline loop = new Timeline();
loop.getKeyFrames().addAll(drawframe);
loop.setCycleCount(Timeline.INDEFINITE);
loop.play();
}
public static void main(final String[] args) {
launch(args);
}
}