JavaFX:使用Permanin扭曲创建板网格

时间:2018-08-31 10:45:47

标签: java javafx

我正在创建一个棋盘游戏(首先移植到JavaFX),在其中玩家必须通过循环杀死对手的棋子。

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

以上内容在Wikipedia页面上提供了Surakurta(Permanin的另一个名称)。但是,我只能构建这种网格:

JavaFX Permanin app by Silcos (SHUKANT PAL)

如何在拐角处创建这些环形交叉路口?

已构建的网格的实现细节:GridPane充满了36个BoardInput extends javafx.scene.control.Button对象。这些对象是特殊的,因为它们会自动使用三个Background对象(水平线,垂直线和卵石圆形填充)创建一个BackgroundFill

1 个答案:

答案 0 :(得分:1)

使用PathArcTo元素使您可以创建圆形零件。 HLineToVLineToClosePath可以用于直线部分:

此外,我不建议使用BackgroundFill。我更愿意在面板视觉效果上方覆盖不可见的按钮,或者为MouseEvent本身处理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