访问Arraylist中的值时,EventHandler会出现问题

时间:2016-11-14 19:45:18

标签: java arraylist javafx

我正在为学校编写一个程序,并且是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);
    }

}

0 个答案:

没有答案