gpt4 book ai didi

java - 如何通过更改标题(即旋转对象)来避免与边框或彼此碰撞

转载 作者:行者123 更新时间:2023-12-04 10:16:14 25 4
gpt4 key购买 nike

  • 任务实际上是,两辆车在移动,这辆车必须能够避开
    通过改变标题与边界或彼此碰撞
    例如:旋转对象。 **

    I got an error for this getRadius()


    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    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.image.Image;
    import javafx.scene.image.ImageView;
    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 Car extends Application {

    //public static Image car;
    public static Pane canvas;

    @Override
    public void start(final Stage primaryStage) throws FileNotFoundException {

    canvas = new Pane();
    final Scene scene = new Scene(canvas, 800, 600);
    scene.setFill(Color.LIGHTGREEN);

    primaryStage.setTitle("Car");
    primaryStage.setScene(scene);

    primaryStage.show();

    //export image
    Image car1 = new Image(new FileInputStream("src/car2.png"));
    Image car2 = new Image(new FileInputStream("src/car1.png"));

    ImageView c1 = new ImageView(car1);
    ImageView c2 = new ImageView(car2);

    c1.setFitHeight(100);//Resize image
    c1.setFitWidth(100);
    c1.relocate(100,100);

    c2.setFitHeight(100);//Resize image
    c2.setFitWidth(100);
    c2.relocate(600,100);

    c2.setImage(car2);
    c2.setVisible(true);

    //add to stage
    canvas.getChildren().add(c1);
    canvas.getChildren().add(c2);

    final Timeline loop = new Timeline(new KeyFrame(Duration.millis(10), new EventHandler<ActionEvent>() {

    double deltaX = 3;
    double deltaY = 3;

    @Override
    public void handle(final ActionEvent t) {
    c1.setLayoutX(c1.getLayoutX() + deltaX);
    c1.setLayoutY(c1.getLayoutY() + deltaY);

    c2.setLayoutX(c2.getLayoutX() + deltaX);
    c2.setLayoutY(c2.getLayoutY() + deltaY);


    final Bounds bounds = canvas.getBoundsInLocal();
    final boolean atRightBorder = c1.getLayoutX() >= (bounds.getMaxX() - c1.getRadius());
    final boolean atLeftBorder = c1.getLayoutX() <= (bounds.getMinX() + c1.getRadius());
    final boolean atBottomBorder = c1.getLayoutY() >= (bounds.getMaxY() - c1.getRadius());
    final boolean atTopBorder = c1.getLayoutY() <= (bounds.getMinY() + c1.getRadius());



    if (atRightBorder || atLeftBorder) {
    deltaX *= -1;
    }
    if (atBottomBorder || atTopBorder) {
    deltaY *= -1;
    }
    }
    }));

    loop.setCycleCount(Timeline.INDEFINITE);
    loop.play();


    }

    /**
    * @param args the command line arguments
    */
    public static void main(String[] args) {
    launch(args);
    }

    }
  • 最佳答案

    首先,固定两辆车的运动,使它们保持在 Canvas 范围内。

    import java.io.FileNotFoundException;
    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.image.Image;
    import javafx.scene.image.ImageView;
    import javafx.scene.layout.Pane;
    import javafx.scene.paint.Color;
    import javafx.stage.Stage;
    import javafx.util.Duration;

    public class Car extends Application {

    private Pane canvas;
    private static final String[] CIRCLES_128 = {
    "https://cdn3.iconfinder.com/data/icons/softwaredemo/PNG/128x128/Circle_Green.png",
    "https://cdn3.iconfinder.com/data/icons/softwaredemo/PNG/128x128/Circle_Red.png",
    };

    @Override
    public void start(final Stage primaryStage) throws FileNotFoundException {

    canvas = new Pane();
    final Scene scene = new Scene(canvas, 800, 600);
    scene.setFill(Color.LIGHTGREEN);

    primaryStage.setTitle("Car");
    primaryStage.setScene(scene);

    Image car1Image = new Image(CIRCLES_128[0]);
    Image car2Image = new Image(CIRCLES_128[1]);

    ImageView car1 = new ImageView(car1Image);
    ImageView car2 = new ImageView(car2Image);

    car1.setFitHeight(100);//Resize image
    car1.setFitWidth(100);
    car1.relocate(100,100);

    car2.setFitHeight(100);//Resize image
    car2.setFitWidth(100);
    car2.relocate(600,100);

    //add to stage
    canvas.getChildren().addAll(car1, car2);

    final Timeline loop = new Timeline(new KeyFrame(Duration.millis(10), new EventHandler<ActionEvent>() {

    double car1DeltaX = 3, car2DeltaX = 3; //each car must have its own deltaX and Y because
    double car1DeltaY = 3, car2DeltaY = 3; //only one car has to change direction when hitting the edge

    @Override
    public void handle(final ActionEvent t) {
    car1.setLayoutX(car1.getLayoutX() + car1DeltaX);
    car1.setLayoutY(car1.getLayoutY() + car1DeltaY);

    car2.setLayoutX(car2.getLayoutX() + car2DeltaX);
    car2.setLayoutY(car2.getLayoutY() + car2DeltaY);

    final Bounds bounds = canvas.getBoundsInLocal();
    final Bounds car1Bounds = car1.getBoundsInParent();
    final Bounds car2Bounds = car2.getBoundsInParent();

    //check car1
    final boolean car1AtRightBorder = car1Bounds.getMaxX() >= bounds.getMaxX() ;//- bounds.getRadius();
    final boolean car1AtLeftBorder = car1Bounds.getMinX()<= bounds.getMinX() ;//+ car1.getRadius();
    final boolean car1AtBottomBorder = car1Bounds.getMaxY() >= bounds.getMaxY() ;//- car1.getRadius();
    final boolean car1AtTopBorder = car1Bounds.getMinY() <= bounds.getMinY() ;//+ car1.getRadius();

    if (car1AtRightBorder || car1AtLeftBorder) {
    car1DeltaX *= -1;
    }
    if (car1AtBottomBorder || car1AtTopBorder) {
    car1DeltaY *= -1;
    }

    //check car2
    final boolean car2AtRightBorder = car2Bounds.getMaxX() >= bounds.getMaxX() ;
    final boolean car2AtLeftBorder = car2Bounds.getMinX()<= bounds.getMinX() ;
    final boolean car2AtBottomBorder = car2Bounds.getMaxY() >= bounds.getMaxY() ;
    final boolean car2AtTopBorder = car2Bounds.getMinY() <= bounds.getMinY() ;

    if (car2AtRightBorder || car2AtLeftBorder) {
    car2DeltaX *= -1;
    }
    if (car2AtBottomBorder || car2AtTopBorder) {
    car2DeltaY *= -1;
    }
    }
    }));

    primaryStage.show();
    loop.setCycleCount(Timeline.INDEFINITE);
    loop.play();
    }

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

    然后你可以添加一个简单的方法来确定两个边界是否相交:
    private boolean collisionDetected(Bounds b1, Bounds b2) {
    return b1.intersects(b2);
    }

    并在循环中使用它:
       public void handle(final ActionEvent t) {
    car1.setLayoutX(car1.getLayoutX() + car1DeltaX);
    car1.setLayoutY(car1.getLayoutY() + car1DeltaY);

    car2.setLayoutX(car2.getLayoutX() + car2DeltaX);
    car2.setLayoutY(car2.getLayoutY() + car2DeltaY);

    final Bounds bounds = canvas.getBoundsInLocal();
    final Bounds car1Bounds = car1.getBoundsInParent();
    final Bounds car2Bounds = car2.getBoundsInParent();

    if(collisionDetected(car1Bounds, car2Bounds)){
    car1DeltaX *= -1; car1DeltaY *= -1;
    car2DeltaX *= -1; car2DeltaY *= -1;
    }

    //check car1
    final boolean car1AtRightBorder = car1Bounds.getMaxX() >= bounds.getMaxX() ;
    final boolean car1AtLeftBorder = car1Bounds.getMinX()<= bounds.getMinX() ;
    final boolean car1AtBottomBorder = car1Bounds.getMaxY() >= bounds.getMaxY() ;
    final boolean car1AtTopBorder = car1Bounds.getMinY() <= bounds.getMinY() ;

    if (car1AtRightBorder || car1AtLeftBorder) {
    car1DeltaX *= -1;
    }
    if (car1AtBottomBorder || car1AtTopBorder) {
    car1DeltaY *= -1;
    }

    //check car2
    final boolean car2AtRightBorder = car2Bounds.getMaxX() >= bounds.getMaxX() ;
    final boolean car2AtLeftBorder = car2Bounds.getMinX()<= bounds.getMinX() ;
    final boolean car2AtBottomBorder = car2Bounds.getMaxY() >= bounds.getMaxY() ;
    final boolean car2AtTopBorder = car2Bounds.getMinY() <= bounds.getMinY() ;

    if (car2AtRightBorder || car2AtLeftBorder) {
    car2DeltaX *= -1;
    }
    if (car2AtBottomBorder || car2AtTopBorder) {
    car2DeltaY *= -1;
    }
    }

    }));

    enter image description here

    以下是重构后的清洁版本:
    public class Car extends Application {

    private Pane canvas;
    private static final String[] CIRCLES_128 = {
    "https://cdn3.iconfinder.com/data/icons/softwaredemo/PNG/128x128/Circle_Green.png",
    "https://cdn3.iconfinder.com/data/icons/softwaredemo/PNG/128x128/Circle_Red.png",
    };

    private double car1DeltaX = 3, car2DeltaX = 3; //each car must have its own deltaX and Y because
    private double car1DeltaY = 3, car2DeltaY = 3; //only one car has to change direction when hitting the edge

    @Override
    public void start(final Stage primaryStage) throws FileNotFoundException {

    canvas = new Pane();
    final Scene scene = new Scene(canvas, 800, 600);
    scene.setFill(Color.LIGHTGREEN);

    primaryStage.setTitle("Car");
    primaryStage.setScene(scene);

    Image car1Image = new Image(CIRCLES_128[0]);
    Image car2Image = new Image(CIRCLES_128[1]);

    ImageView car1 = new ImageView(car1Image);
    ImageView car2 = new ImageView(car2Image);

    car1.setFitHeight(100);//Resize image
    car1.setFitWidth(100);
    car1.relocate(100,100);

    car2.setFitHeight(100);//Resize image
    car2.setFitWidth(100);
    car2.relocate(600,100);

    //add to stage
    canvas.getChildren().addAll(car1, car2);

    final Timeline loop = new Timeline(new KeyFrame(Duration.millis(10), t -> {

    //move 2 cars to new position
    positionNode(car1, car1DeltaX, car1DeltaY);
    positionNode(car2, car2DeltaX, car2DeltaY);

    final Bounds canvasBounds = canvas.getBoundsInLocal();
    final Bounds car1Bounds = car1.getBoundsInParent();
    final Bounds car2Bounds = car2.getBoundsInParent();

    if(collisionDetected(car1Bounds, car2Bounds)){
    handleCollision();
    }

    //check car1 within canvas bounds
    if(atHorizontalEdge(canvasBounds,car1Bounds)){
    car1DeltaX *= -1;
    }

    if(atVerticalEdge(canvasBounds,car1Bounds)){
    car1DeltaY *= -1;
    }

    //check car2 within canvas bounds
    if(atHorizontalEdge(canvasBounds,car2Bounds)){
    car2DeltaX *= -1;
    }

    if(atVerticalEdge(canvasBounds,car2Bounds)){
    car2DeltaY *= -1;
    }

    }));

    primaryStage.show();
    loop.setCycleCount(Timeline.INDEFINITE);
    loop.play();
    }

    private void positionNode(Node node, double deltaX, double deltaY) {
    node.setLayoutX(node.getLayoutX() + deltaX);
    node.setLayoutY(node.getLayoutY() + deltaY);
    }

    private boolean collisionDetected(Bounds b1, Bounds b2) {
    return b1.intersects(b2);
    }

    private boolean atHorizontalEdge(Bounds enclosing, Bounds enclosed) {
    return enclosed.getMaxX() >= enclosing.getMaxX() || enclosed.getMinX()<= enclosing.getMinX() ;
    }

    private boolean atVerticalEdge(Bounds enclosing, Bounds enclosed) {
    return enclosed.getMaxY() >= enclosing.getMaxY() || enclosed.getMinY()<= enclosing.getMinY() ;
    }

    private void handleCollision() {
    //change cars directions
    car1DeltaX *= -1; car1DeltaY *= -1;
    car2DeltaX *= -1; car2DeltaY *= -1;
    }

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

    关于java - 如何通过更改标题(即旋转对象)来避免与边框或彼此碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61040160/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com