我正在创建一个棋盘游戏(首先移植到JavaFX),在其中玩家必须通过循环杀死对手的棋子。
以上内容在Wikipedia页面上提供了Surakurta(Permanin的另一个名称)。但是,我只能构建这种网格:
如何在拐角处创建这些环形交叉路口?
已构建的网格的实现细节:GridPane充满了36个BoardInput extends javafx.scene.control.Button
对象。这些对象是特殊的,因为它们会自动使用三个Background
对象(水平线,垂直线和卵石圆形填充)创建一个BackgroundFill
。
答案 0 :(得分:1)
使用Path
。 ArcTo
元素使您可以创建圆形零件。 HLineTo
,VLineTo
和ClosePath
可以用于直线部分:
此外,我不建议使用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();
}
输出