Обнаружение столкновения.Я не могу заставить это работать - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь создать программу, которая порождает количество набранных вами шариков.

Половина шаров появляется на левой стороне (синяя команда), а другая половина на правой стороне (командаоранжевый).Каждый шар должен достигать противоположной стороны, не сталкиваясь ни с одним из шаров.Чтобы сделать это, я сначала должен быть в состоянии сообщить коду, когда / если он столкнется с другим шаром.

В моем классе Ball я включаю обнаружение столкновений, но яне знаю, как решить проблему.Я не пытался вызвать его из класса GUI, но я не знаю, как бы я это сделал.

Я искал эту ссылку для получения справки: Проверка столкновения фигур сJavaFX

Но это не помогло.Пожалуйста, предложите.

Ball.java

package fx;

import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Shape;
import javafx.util.Duration;
import javafx.scene.shape.*;


public class Ball {

    public static int id;
    public Circle circle;
    public int team;

    public Ball(int x, int y, int _id, int _team) {

        id = _id;

        Circle ball = new Circle(10, Color.BLACK);
        ball.relocate(x, y);
        circle = ball;

        team = _team;
    }


    public void moveBall() {
        System.out.println(this.team);

        //team blue
        if (this.team == 0) {
            Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(3),
                      new KeyValue(this.circle.layoutXProperty(), 
                              980-((Circle)this.circle).getRadius())));

            timeline.setAutoReverse(true);
            timeline.setCycleCount(Timeline.INDEFINITE);
            timeline.play();

        }//team orange
        else if (this.team == 1) {
            //System.out.println(this.circle.layoutXProperty());

            Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(3),
                      new KeyValue(this.circle.layoutXProperty(), 
                              35-((Circle)this.circle).getRadius())));
            timeline.setAutoReverse(true);
            timeline.setCycleCount(Timeline.INDEFINITE);
            timeline.play();
        }
    }

    public Circle getCircle() {
        return this.circle;
    }




    //collision detection

    public void collisionDetection(Shape balls) {
        boolean collisionDetected = false;
        for(Shape static_bloc : circle) {
            if(static_bloc != balls) {

                Shape intersect = Shape.intersect(balls,  static_bloc);
                if (intersect.getBoundsInLocal().getWidth() != -1){
                    collisionDetected = true;
                }
            }
        }

        if(collisionDetected) {



        }else {



        }
    }

}

GUI.java

package fx;

import javafx.animation.KeyFrame;
import javafx.scene.control.TextField;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.geometry.Bounds;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Slider;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
import javafx.util.Duration;
import java.util.Random;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


public  class GUI extends Application {

    public static void main (String[] args) {
        Application.launch(args);
    }


    @Override
    public void start(Stage primaryStage) throws Exception {

        Pane canvas = new Pane();

        Scene scene = new Scene(canvas,1000, 500);

        Bounds bounds = canvas.getBoundsInLocal();

        HBox hbox = new HBox();
        hbox.setStyle("-fx-background-color: grey");
        hbox.setPrefSize(1000, 40);
        hbox.setLayoutX(0);
        hbox.setLayoutY(460);

        TextField NrInput = new TextField("");
        NrInput.setPromptText("Total amount of balls:");
        NrInput.setPrefHeight(40);


        Button startBtn = new Button("Start");
        startBtn.setPrefWidth(70);
        startBtn.setPrefHeight(40);
        startBtn.setOnAction(e ->{
            startBtn.setDisable(true);

            //list with balls. lista med bollar
            ArrayList<Ball> balls = new ArrayList<>();

            // Get text
            // Do a check. Gör typkontroll
            int ballCount = Integer.parseInt(NrInput.getText());


            Random r = new Random();
            int Low = 20;
            int High = 420;
            int id = 0;
            //System.out.println(bounds.getMaxX());

            for (int i = 0; i < ballCount; i++) {
                Ball ball;

                // Randomize Y
                int y = r.nextInt(High-Low) + Low;

                //every other ball gets in different teams
                if (i % 2 == 0) {
                    ball = new Ball(25, y, id, 0);

                } else {
                    ball = new Ball(955, y, id, 1);

                }
                balls.add(ball);
                canvas.getChildren().add(ball.getCircle());

                id = id + 1;

            }

            for (Ball b : balls) {
                b.moveBall();
            }


            startBtn.setDisable(false);
        });


        Button restartBtn = new Button("Restart");
        restartBtn.setPrefWidth(70);
        restartBtn.setPrefHeight(40);
        restartBtn.setOnAction(e -> {

        });

        Button exitBtn  = new Button("Exit");
        exitBtn.setPrefWidth(70);
        exitBtn.setPrefHeight(40);
        exitBtn.setOnAction(e -> primaryStage.close());

        HBox spawnBlue = new HBox();
        spawnBlue.setPrefHeight(420);
        spawnBlue.setPrefWidth(30);
        spawnBlue.setLayoutX(20);
        spawnBlue.setLayoutY(20);
        spawnBlue.setStyle("-fx-background-color: blue");

        HBox spawnOrange = new HBox();
        spawnOrange.setPrefHeight(420);
        spawnOrange.setPrefWidth(30);
        spawnOrange.setLayoutX(950);
        spawnOrange.setLayoutY(20);
        spawnOrange.setStyle("-fx-background-color: orange");

        canvas.getChildren().add(hbox);
        canvas.getChildren().add(spawnOrange);
        canvas.getChildren().add(spawnBlue);

        hbox.getChildren().add(startBtn);
        hbox.getChildren().add(NrInput);
        hbox.getChildren().add(restartBtn);
        hbox.getChildren().add(exitBtn);


        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public void runTask() {

    }

}`
...