当前位置: 首页 > 知识库问答 >
问题:

Javafx如何通过tilePane移动对象

萧远
2023-03-14

我有一个瓷砖面板的网格,其中对象(动物)随机放置在其上,作为图像。在它们实际移动之前,我需要找到一种方法来检查该特定单元旁边的四个插槽/单元(北、南、东、西),看看其中是否有食物来源,如果是,请移动到该单元。如果为false,请尝试下一个方向,如果全部为false,请随机移动。

目前,它们只是随意移动,如果幸运的是细胞上有食物来源,它们就会吃东西。这是我目前拥有的,确实有效

private void makeAnimalsMove() {
    Random random = new Random();

    // Mark all animals that they haven't moved yet
    for (Slot[] row : slots) {
        for (Slot slot : row) { 
            for (Animal animal : slot.getAnimals()) { 
                animal.setMoved(false); 
            }
        }
    }

    // Now we move only those who needs to be moved
    for (int row = 0; row < slots.length; row++) {
        for (int column = 0; column < slots[row].length; column++) {
            final Slot slot = slots[row][column];

            for (final Animal animal : slot.getAnimals()) {
                if (animal.hasMoved()) {
                    continue;
                }

                int[][] directions = {
                    {row - 1, column}, // north
                    {row, column + 1}, // east
                    {row + 1, column}, // south
                    {row, column - 1}, // west
                };

                int[] selectedDirection = directions[random.nextInt(directions.length)];

                // Move the animal to the chosen direction if possible
                final int rowDirection = selectedDirection[0];
                final int columnDirection = selectedDirection[1];

                if (rowDirection >= 0 && rowDirection < slots.length && columnDirection >= 0 && columnDirection < slots[rowDirection].length) {
                    Platform.runLater(new Runnable() { 
                    @Override
                    public void run() { 
                        slot.removeObject(animal);
                        slots[rowDirection][columnDirection].addObject(animal);
                        }
                    });
                }

                // Decrease the animal's life
                animal.setMoved(true);
                animal.setLifeSpan(animal.getLifeSpan() - 1);
            }
        }
    }
}

对于“吃”部分,有一个单独的方法,如果细胞中含有食物来源,则会调用该方法。我只是不知道如何才能让它在移动之前检查四个单元格?

共有1个答案

邹海荣
2023-03-14

为了使我的解决方案正常工作,我建议您从TilePane切换到GridPane

您可以轻松绘制元素网格:

GridPane grid = new GridPane();
grid.add(child, columnIndex, rowIndex);

然后再检测特定单元格中是否有内容,例如使用此帮助器:

private static boolean isCellOccupied(GridPane gridPane, int column, int row)
{
    return gridPane
            .getChildren()
            .stream()
            .filter(Node::isManaged)
            .anyMatch(
                    n -> Objects.equals(GridPane.getRowIndex(n), row)
                            && Objects.equals(GridPane.getColumnIndex(n),
                                    column));
}
 类似资料:
  • 我正在将一个包含大量自定义绘制的Swing/Graphics2D应用程序转换为JavaFX2应用程序。虽然我非常喜欢这个新的API,但当我在鼠标光标下方绘制椭圆时,无论鼠标移动到哪里,我似乎都会遇到性能问题。当我以稳定的方式移动鼠标时,我注意到椭圆总是在鼠标轨迹的后面几厘米处绘制,只有当我停止移动光标时,椭圆才会出现。这是一个只有少数节点的场景图。在我的Swing应用程序中,我没有这个问题。 我想

  • 问题内容: 我正在尝试使某些节点的动作自动化。我想将一个节点移到另一个节点的顶​​部,但是我无法使用通用方法来实现它。 IE浏览器我写了这样的事情: 我究竟做错了什么?我想我没有考虑重要的事情,但我不知道。我希望有人能以正确的方式向我解释…预先感谢。 问题答案: 根据此处看到的第一个示例,下面的示例使用aTimeline来动画化b1着色AQUA,朝向b2,朝着色的运动CORAL。

  • 如果我们在应用程序中使用此窗格,则添加到其中的所有节点将以统一大小的切片的形式排列。 包javafx.scene.layout名为tilePane的类表示TilePane。 这个类提供了11个属性,它们是 - alignment - 此属性表示窗格的对齐方式,您可以使用setAlignment()方法设置此属性的值。 hgap - 此属性的类型为double,它表示行中每个tile之间的水平间距。

  • 问题内容: 我正在将具有大量自定义绘画的Swing / Graphics2D应用程序转换为JavaFX2应用程序。尽管我绝对喜欢新的API,但是在绘制椭圆时我似乎遇到了性能问题,无论鼠标移动到哪里,我都想在鼠标光标下方绘制椭圆。当我稳定地移动鼠标而不是快得不可思议时,我注意到椭圆总是在鼠标轨迹后方几厘米处画出,并且只有在我停止移动光标时才会赶上椭圆。这在只有几个节点的场景图中。在我的Swing应用

  • 所以我手头有一个非常奇怪的问题,数小时的搜索没有提供任何信息。 我有一个包含uitextfield的uiview。现在,该视图最初位于可见屏幕之外,坐标为x=-500,y=-500。 然而,在响应按钮按下此视图动画和移动到屏幕的中心。 现在,每当我点击作为此视图子视图的uitextfield时。此视图会在屏幕外移动回其原始坐标。 我已经疯狂地检查了我的代码,一旦它进入,就没有任何东西会再次将视图移

  • 我不能用REmover类直接擦除代码对象...它给了我一个错误...但是当我第一次用我的代码删除连接的注释时,然后删除已经完成的代码...是否有其他方法可以自动删除代码和代码对象的注释?关于... 警告:SQL错误:0,SQLSTATE:23503 2013年6月24日2:25:51 PM org.hibernate.engine.jdbc.spi.sqlExceptionHelper logEx