JavaFX: Создание сетки доски с твистом Перманина - PullRequest
0 голосов
/ 31 августа 2018

Я создаю настольную игру (сначала портированную на JavaFX), в которой игрок должен убить фигуру противника, проходя цикл.

CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=138535, Permanin game board

Выше приведено на странице Википедии для Суракурта (другое название Перманина). Но я смог построить только такую ​​сетку:

JavaFX Permanin app by Silcos (SHUKANT PAL)

Как я могу создать эти перекрестки в углах?

Детали реализации для уже построенной сетки: GridPane заполнен 36 BoardInput extends javafx.scene.control.Button объектами. Эти объекты особенные, потому что они автоматически создают Background с тремя BackgroundFill объектами - горизонтальной линией, вертикальной линией и круглой заливкой галькой.

1 Ответ

0 голосов
/ 31 августа 2018

Используйте Path. ArcTo элементы позволяют создавать круглые детали. HLineTo, VLineTo и ClosePath могут использоваться для прямых участков:

Кроме того, я не рекомендую использовать BackgroundFill с. Я бы предпочел накладывать невидимые кнопки поверх визуальных элементов доски или обрабатывать MouseEvent s для самого GridPane.

Пример

private static ArcTo createArc(double radius, double dx, double dy) {
    ArcTo result = new ArcTo(radius, radius, 0, dx, dy, true, true);
    result.setAbsolute(false);
    return result;
}

private static HLineTo createHLine(double length) {
    HLineTo result = new HLineTo(length);
    result.setAbsolute(false);
    return result;
}

private static VLineTo createVLine(double length) {
    VLineTo result = new VLineTo(length);
    result.setAbsolute(false);
    return result;
}

private static Path createPath(double radius, double midSize, Color storke) {
    final double lineLength = 2 * radius + midSize;

    Path result = new Path(
            new MoveTo(radius, 2 * radius), // start at left end of top horizontal line
            createArc(radius, radius, -radius), // top left loop
            createVLine(lineLength), // down
            createArc(radius, -radius, -radius), // bottom left loop
            createHLine(lineLength), // right
            createArc(radius, -radius, radius), // bottom right loop
            createVLine(-lineLength), // up
            createArc(radius, radius, radius),
            new ClosePath() // left
    );
    result.setStroke(storke);
    result.setStrokeWidth(10);
    return result;
}

@Override
public void start(Stage primaryStage) throws Exception {
    Scene scene = new Scene(new StackPane(
            createPath(100, 50, Color.GREEN),
            createPath(50, 150, Color.AQUA)
    ));
    primaryStage.setScene(scene);
    primaryStage.show();
}

выход

Screenshot of result

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...