我正在使用 GridPane 在 JavaFX 中创建棋盘游戏。
有 7 种不同的动画可以放置在网格的每个网格(单元格)中。
最初网格看起来像这样
在编写动画插入程序之前,我测试了向其中添加一个简单的圆圈。它看起来像这样
添加的节点是包含 TimeLine 动画的 SubScenes。每个单元格大小为 40x40,SubScene 大小也是 40x40。
添加后的子场景位于网格窗格边框线的顶部,看起来不太好。
我该怎么做才能将节点添加到网格线下方?即网格线位于节点之上。
如果 GridPane 不可能,还有什么我可以使用的吗?
我为游戏执行的课程
class Game {
static GridPane grid;
public void start(final Stage stage) throws Exception {
int rows = 5;
int columns = 5;
stage.setTitle("Enjoy your game");
grid = new GridPane();
for(int i = 0; i < columns; i++) {
ColumnConstraints column = new ColumnConstraints(40);
grid.getColumnConstraints().add(column);
}
for(int i = 0; i < rows; i++) {
RowConstraints row = new RowConstraints(40);
grid.getRowConstraints().add(row);
}
grid.setOnMouseReleased(new EventHandler<MouseEvent> () {
public void handle(MouseEvent me) {
grid.add(Anims.getAnim(1), (int)((me.getSceneX() - (me.getSceneX() % 40)) / 40), (int)((me.getSceneY() - (me.getSceneY() % 40)) / 40)); //here the getAnim argument could be between 1-7
}
});
grid.setStyle("-fx-background-color: white; -fx-grid-lines-visible: true");
Scene scene = new Scene(grid, (columns * 40) + 100, (rows * 40) + 100, Color.WHITE);
stage.setScene(scene);
stage.show();
}
public static void main(final String[] arguments) {
Application.launch(arguments);
}
}
包含动画的类,这里我只是创建一个圆圈
public class Anims {
public static SubScene getAnim(final int number) throws Exception {
Circle circle = new Circle(20, 20f, 7);
circle.setFill(Color.RED);
Group group = new Group();
group.getChildren().add(circle);
SubScene scene = new SubScene(group, 40, 40);
scene.setFill(Color.WHITE);
return scene;
}
}
原文由 Jeet Parekh 发布,翻译遵循 CC BY-SA 4.0 许可协议
不要使用
setGridLinesVisible(true)
: 文档 明确指出这仅用于调试。相反,在所有网格单元格(甚至是空单元格)中放置一个窗格,并设置窗格样式以便您看到边框。 (这让您有机会非常仔细地控制边框,这样您就可以避免出现双边框等情况。)然后将内容添加到每个窗格中。您还可以向窗格注册鼠标侦听器,这意味着您不必进行难看的数学运算来确定单击了哪个单元格。
将边框应用于任何区域的推荐方法是使用 CSS 和“嵌套背景”方法。在这种方法中,您在区域上绘制两个(或更多)背景填充,具有不同的插图,呈现出边框的外观。例如:
将首先绘制一个没有插图的黑色背景,然后在其上方绘制一个白色背景,在所有边上都有 1 个像素的插图,给出一个宽度为 1 像素的黑色边框的外观。虽然这似乎违反直觉,但它的性能(据称)比直接指定边界要好。您还可以为 每个 填充的插图指定一个包含四个值的序列,这些值分别被解释为顶部、右侧、底部和左侧的插图。所以
在右侧和底部等处具有黑色边框的效果。
我也不确定
SubScene
是你真正想要的,除非你打算在每个单元上安装不同的相机。如果你真的需要一个子场景,让填充透明以避免绘制在单元格的边缘。您可以将Group
直接添加到每个单元格(您可能只添加圆圈,具体取决于您的需要…)。就像是:
和CSS: