JavaFX转换动画无法将gridpane的子项放置在正确的位置

JavaFX转换动画无法将gridpane的子项放置在正确的位置,java,animation,javafx,transition,gridpane,Java,Animation,Javafx,Transition,Gridpane,我正在编写一个类似于Bejeweld的游戏,在运行应用程序一段时间后,这些块在视觉上无法精确地位于正确的位置,但逻辑上它们位于正确的位置。情况如下图所示 我不知道这个错误的原因 以下是擦除和下降方法的代码。从逻辑上讲,这些方法做得很好 public void erase() { for(int i=0;i { blockGridPan.getChildren().remove(块); 下降(); BlockManager.resetArrays(); }); transition.play()

我正在编写一个类似于Bejeweld的游戏,在运行应用程序一段时间后,这些块在视觉上无法精确地位于正确的位置,但逻辑上它们位于正确的位置。情况如下图所示

我不知道这个错误的原因

以下是擦除和下降方法的代码。从逻辑上讲,这些方法做得很好

public void erase()
{
for(int i=0;i
{
blockGridPan.getChildren().remove(块);
下降();
BlockManager.resetArrays();
});
transition.play();
}
}
int[][]下降=新int[高度*宽度][2];
整数长度=0;
公众假期
{
int[]columnX=新int[10];
int[]上一个=新的int[10];
数组。填充(上一个,10);
数组。填充(第x列,0);
对于(int j=0;j=0;j--)
{
if(BlockManager.blocks[i][j]==null)
继续;
int-dY=0;
对于(int k=j+1;k=0;j--)
{
int deltYJ=j*60;
createOneBlock(i,j);
BlockManager.setblockcolorwithout检查(BlockManager.blocks[i][j]);
blockGridPane.add(BlockManager.blocks[i][j],i,0);
System.out.println(“show it”);
BlockManager.blocks[i][j].setdowned(true);
转换=新的转换(持续时间.秒(1),BlockManager.blocks[i][j]);
过渡期:setByY(deltYJ);
transition.play();
}
}
if(转换!=null)
转换.setOnFinished(e->
{
BlockManager.resetArrays();
if(BlockManager.check())
擦除();
});
}

}

您没有为布局粘贴代码,所以我要猜一猜

当您进行
翻译时,可能会出现一个潜在的问题,您的布局取决于。这是JavaDoc的摘要:

此节点的矩形边界,包括其变换。 boundsInParent通过采用局部边界(由定义)来计算 boundsInLocal)并应用通过设置 下列附加变量

  • 转换观察者
  • 斯卡莱克斯,斯卡利
  • 轮换
  • layoutX,layoutY
  • translateX,translateY

  • TranslateTransition
    设置动画时,它将更改块的
    translateY
    值,如果此时调用布局,该平移值将影响块的定位方式。如果您的布局由某种布局管理器(即窗格)管理,则需要检查它们如何定位其子项。

    我使用gridpane定位块,最初有10行和10列,gridpane会在块下降后自动添加一行,(因为块没有精确地转换到它应该的位置,我仍然不知道它的原因)。我更改html文档以避免列的增长。它是有效的。

    我想我理解你的意思,但我想知道如何使gridpane在转换后不更改其子级布局?谢谢!@AndyLee如果你能回答自己的问题并与其他人分享具体的解决方法,那就太好了。好的我所做的只是给你一个方向,你可以缩小和探索
    public void erase()
    {
        for (int i = 0; i < BlockManager.length; i++)
        {
            Block block = BlockManager.blocks[BlockManager.erased[i][0]][BlockManager.erased[i][1]];
            BlockManager.blocks[BlockManager.erased[i][0]][BlockManager.erased[i][1]] = null;
    
            FadeTransition transition = new FadeTransition(Duration.seconds(1), block);
            transition.setFromValue(1);
            transition.setToValue(0);
    
            transition.setOnFinished(e ->
            {
    
                blockGridPan.getChildren().remove(block);
    
                descend();
    
                BlockManager.resetArrays();
    
            });
    
            transition.play();
    
        }
    
    }
    
    int[][] descend = new int[HEIGHT * WIDE][2];
    int descendLength = 0;
    
    
    public void descend()
    {
        int[] columnX = new int[10];
        int[] theUpperOne = new int[10];
    
        Arrays.fill(theUpperOne, 10);
        Arrays.fill(columnX, 0);
    
        for (int j = 0; j < BlockManager.length; j++)
        {
            columnX[BlockManager.erased[j][0]]++;
            if (BlockManager.erased[j][1] < theUpperOne[BlockManager.erased[j][0]])
            {
                theUpperOne[BlockManager.erased[j][0]] = BlockManager.erased[j][1];
            }
        }
    
        TranslateTransition transition = null;
    
        for (int i = 0; i < 10; i++)
        { 
            if (columnX[i] == 0)
                continue;
    
            for (int j = WIDE - 1; j >= 0; j--)
            {
                if (BlockManager.blocks[i][j] == null)
                    continue;
                int dY = 0;
                for (int k = j + 1; k < WIDE; k++)
                {
                    if (BlockManager.blocks[i][k] == null)
                        dY++;
                }
                if (dY != 0)
                {
                    int deltaY = dY * 60;
    
                    transition = new TranslateTransition(Duration.seconds(1), BlockManager.blocks[i][j]);
                    transition.setByY(deltaY);
    
                    BlockManager.blocks[i][j + dY] = BlockManager.blocks[i][j];
                    BlockManager.blocks[i][j + dY].setPosition(i, j + dY);
                    BlockManager.blocks[i][j] = null;
    
                    BlockManager.blocks[i][j + dY].setDescended(true);
                    transition.play();
                }
            }
    
    
            for (int j = columnX[i] - 1; j >= 0; j--)
            {
    
                int deltYJ = j * 60;
                createOneBlock(i, j);
                BlockManager.setBlockColorWithoutCheck(BlockManager.blocks[i][j]);
                blockGridPane.add(BlockManager.blocks[i][j], i, 0);
                System.out.println("show it");
    
                BlockManager.blocks[i][j].setDescended(true);
    
                transition = new TranslateTransition(Duration.seconds(1), BlockManager.blocks[i][j]);
                transition.setByY(deltYJ);
                transition.play();
    
            }
    
        }
    
        if (transition != null)
            transition.setOnFinished(e ->
            {
    
                BlockManager.resetArrays();
                if (BlockManager.check())
                    erase();
    
            });
    
    }