setOnFinished()无限循环?

时间:2017-05-18 13:24:37

标签: java javafx-2

else {
    ScaleTransition st = new ScaleTransition(Duration.millis(1000), gameView[ex.row][ex.col]);
    st.setByX(-1f);
    st.setByY(-1f);
    System.out.println("Loop"); //loop signal
    st.play();

    st.setOnFinished(e-> {
        pane.getChildren().remove(gameView[ex.row][ex.col]);
        gameView[ex.row][ex.col]=null;
        scores.addAndGet(1);
    });
}

上面的代码片段是我的第3场比赛的一部分。gameViewArrayList,用于存储要从窗格中删除的精灵,if-else以外的精灵是foreach循环。我想在删除精灵之前制作缩放动画,但它总是会遇到无限循环。为什么?

编辑:在添加动画之前,我的游戏可以顺利运行。如果我不打电话setOnFinished(),我的游戏仍能顺利运行,但没有动画。

public static void remove(Buttonp[][] gameView,ArrayList<matrixLocator> removableButtonGroup,Pane pane,AtomicInteger scores){
    for(matrixLocator ex:removableButtonGroup){
        if(gameView[ex.row][ex.col]!=null){
            if(gameView[ex.row][ex.col].verticalExplosion==true){
                pane.getChildren().remove(gameView[ex.row][ex.col]);
                gameView[ex.row][ex.col]=null;
                scores.addAndGet(1);
                ArrayList<matrixLocator> al1=new ArrayList<matrixLocator>();
                for(int m=0;m<8;m++){
                    if((gameView[m][ex.col]!=null)&&(m!=ex.row)){
                        al1.add(new matrixLocator(m,ex.col));
                    }
                    else;
                }
                remove(gameView,al1,pane,scores);
            }
        //verticalExplosion
            else if(gameView[ex.row][ex.col].horizontalExplosion==true){
                pane.getChildren().remove(gameView[ex.row][ex.col]);
                gameView[ex.row][ex.col]=null;
                scores.addAndGet(1);
                ArrayList<matrixLocator> al2=new ArrayList<matrixLocator>();
                for(int m=0;m<10;m++){
                    if((gameView[ex.row][m]!=null)&&(m!=ex.col)){
                        al2.add(new matrixLocator(ex.row,m));
                    }
                    else;
                }
                remove(gameView,al2,pane,scores);
            }
        //horizontalExplosion
            else if(gameView[ex.row][ex.col].aroundExplosion==true){
                pane.getChildren().remove(gameView[ex.row][ex.col]);
                gameView[ex.row][ex.col]=null;
                scores.addAndGet(1);
                ArrayList<matrixLocator> al3=new ArrayList<matrixLocator>();
                for(int m=0;m<8;m++){
                    for(int n=0;n<10;n++){
                        if((Math.abs(m-ex.row)<=1)&&(Math.abs(n-ex.col)<=1)){
                            if((gameView[m][n]!=null)&&((m!=ex.row)||(n!=ex.col))){
                                al3.add(new matrixLocator(m,n));
                                }
                            else;
                        }
                        else;
                    }
                }
                remove(gameView,al3,pane,scores);
            }
        //aroundExplosion           
            else{
                ScaleTransition st=new ScaleTransition(Duration.millis(2000),gameView[ex.row][ex.col]);
                st.setByX(-1f);
                st.setByY(-1f);
                System.out.println("LOOP");
                st.play();

                st.setOnFinished(e->{
                pane.getChildren().remove(gameView[ex.row][ex.col]);
                gameView[ex.row ][ex.col]=null;
                scores.addAndGet(1);});
               }    
            }
        else;
    }
}

这是整体。 Buttonp是按钮的子类,并给出了一些属性。所以它是我的游戏的按钮(我称之为精灵)二维数组。 matrixLocator是另一个只包含两个整数(行和列)的类,用于定位要删除的按钮。 Pane是我的游戏窗格。

编辑:我刚刚运行了一个演示,我发现问题不应该是setOnFinished(),而应该是foreach循环。但是为什么循环会无限循环? 很抱歉没有正确而清楚地解释这个问题。

0 个答案:

没有答案