Как реализовать изображение, похожее на кий, который вращается вокруг точки при перетаскивании мыши с помощью JavaFX - PullRequest
0 голосов
/ 29 октября 2018

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

В настоящее время я настроил его, чтобы вы могли щелкнуть и перетащить биток, чтобы нарисовать линию.

private void startDrag(CueBall node, Pane root) {

    currentLine = new Line();
    currentLine.setUserData(node);
    currentLine.setStartX(node.getxPosition());
    currentLine.setStartY(node.getyPosition());
    currentLine.endXProperty().bind(mouseX);
    currentLine.endYProperty().bind(mouseY);

    /**
     * colors in a cue stick
     */

    currentLine.setStrokeWidth(10);
    String path = "cuestick.png";
    Image img = new Image(path);
    currentLine.setStroke(new ImagePattern(img));
    currentLine.setStrokeLineCap(StrokeLineCap.ROUND);

    root.getChildren().add(currentLine);
}

Но это не заставляет изображение вращаться с помощью мыши.

1 Ответ

0 голосов
/ 29 октября 2018

Вот пример. Использование Math.atan2. Здесь используется Line вместо ImageView, но идея та же. Этот подход немного отличается от дубликата. Он использует Math.atan2, чтобы найти угол между центром и точкой на сцене.

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Line;
import javafx.scene.transform.Rotate;
import javafx.stage.Stage;

/**
 *
 * @author blj0011
 */
public class QueAndStick extends Application
{
    @Override
    public void start(Stage primaryStage)
    {

        Circle cue = new Circle(300 / 2.0, 250 / 2.0, 5);
        cue.setFill(Color.WHITE);
        cue.setStroke(Color.BLACK);

        Line stick = new Line(cue.getCenterX() + (cue.getRadius() + 5), cue.getCenterY(), cue.getCenterX() + (cue.getRadius() + 5 + 75), cue.getCenterY());
        stick.setStrokeWidth(3);
        stick.setFill(Color.BROWN);
        Rotate rotate = new Rotate(45);
        rotate.pivotXProperty().bind(cue.centerXProperty());
        rotate.pivotYProperty().bind(cue.centerYProperty());
        stick.getTransforms().add(rotate);

        Pane root = new Pane(cue, stick);
        root.setStyle("-fx-background-color: green");

        Scene scene = new Scene(root, 300, 250);
        scene.setOnMouseMoved((event) -> {
            double newX = event.getSceneX();
            double newY = event.getSceneY();

            System.out.println(Math.toDegrees(Math.atan2(newY - cue.getCenterY(), newX - cue.getCenterX())));
            rotate.setAngle(Math.toDegrees(Math.atan2(newY - cue.getCenterY(), newX - cue.getCenterX())));
        });
        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        launch(args);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...