Java FX отскакивает мяч из коробки - PullRequest
0 голосов
/ 04 декабря 2018

Я новичок в JavaFX, и у меня есть (надеюсь) простой вопрос, с которым, возможно, кто-то может помочь мне.Я пытался искать ответы в Интернете, и, кажется, ничто не вписывается в то, что у меня есть.

Итак, в основном я пытаюсь сделать так, чтобы мяч (в моем случае это лицо) отскакивал от изменяющегося направления панели.всякий раз, когда он падает на стену - достаточно просто.Я не могу понять, почему стены вызывают только левую и верхнюю часть лица.(Другими словами, левая и верхняя стенки корректно вызывают отскок, но нижняя и правая стенки позволяют панели проходить через них, заставляя объект отскакивать, когда: 1. левая сторона лица касается правой стены или 2. верхняя стороналица касается нижней стены. Само лицо отскакивает в BorderPane, если это что-то меняет. Возможно, это логика моего кода, который я на самом деле получил из учебника.

Вот соответствующий код для этого вопроса:

public class BoxPane extends Pane {
    private double radius;
    private double x, y;
    private double dx = 1;
    private double dy = 1;
    private Pane thisPane;
    private Timeline animation;

    public BoxPane(Pane pane)
    {
        getChildren().add(pane);
        thisPane = pane;
        radius = thisPane.getWidth()/2;
        x = radius;
        y = radius;
        animation = new Timeline(new KeyFrame(Duration.millis(50), e -> moveBall()));
        animation.setCycleCount(Timeline.INDEFINITE);
        animation.play();
    }

    public void increaseSpeed()
    {
        animation.setRate(animation.getRate() + 0.1);
    }
    public void decreaseSpeed()
    {
        animation.setRate(animation.getRate()>0?animation.getRate() - 0.1 :     0);
    }

    protected void moveBall()
    {        
        if((x < radius || x > getWidth() - radius))
        {
            dx *= -1;
        }
        if(y < radius || y > getHeight() - radius) {
            dy *= -1;
        }

        x += dx;
        y += dy;
        thisPane.setTranslateX(x);
        thisPane.setTranslateY(y);
    }  
}

Я могу попытаться объяснить, если что-то не ясно в моем коде. Но в основном я взял радиус объекта, который я передаю, исоздать анимацию с этим. У меня есть методы для увеличения и уменьшения скорости при нажатии клавиши (вызовы функций из другого файла Java), и, похоже, моя проблема в MoveBall (). Любая помощь очень ценится, спасибо!Прошу прощения, если это репост чего-то, на что уже был дан ответ, я не смог найти ничего, что помогло бы мнев моем конкретном случае.При необходимости я также могу предоставить скриншоты того, как на самом деле выглядит программа и где шар поворачивается.Спасибо!

1 Ответ

0 голосов
/ 04 декабря 2018

Если вы попытаетесь напечатать значение radius в методе moveBall (), вы заметите, что его значение всегда равно 0. Поскольку вы берете ширину панели до ее визуализации в графе сцены.Чтобы исправить это, вы можете изменить радиус на DoubleProperty и привязать его значение к свойству ширины панели.

Также в вашей логике moveBall () требуется небольшая коррекция.Пожалуйста, проверьте следующие исправления.

private DoubleProperty radius = new SimpleDoubleProperty();

public BoxPane(Pane pane) {
    getChildren().add(pane);
    thisPane = pane;
    radius.bind(thisPane.widthProperty().divide(2));
    x = radius.get();
    y = radius.get();
    animation = new Timeline(new KeyFrame(Duration.millis(5), e -> moveBall()));
    animation.setCycleCount(Timeline.INDEFINITE);
    animation.play();
}

protected void moveBall() {
    double faceWidth = radius.get() * 2;
    if ((x < 0 || x > getWidth() - faceWidth)) {
        dx *= -1;
        if (x < 0) {
            x = 0;
        } else if (x > getWidth() - faceWidth) {
            x = getWidth() - faceWidth;
        }
    }
    if (y < 0 || y > getHeight() - faceWidth) {
        dy *= -1;
        if (y < 0) {
            y = 0;
        } else if (y > getHeight() - faceWidth) {
            y = getHeight() - faceWidth;
        }
    }
    x += dx;
    y += dy;
    thisPane.setTranslateX(x);
    thisPane.setTranslateY(y);
}
...