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场比赛的一部分。gameView
是ArrayList
,用于存储要从窗格中删除的精灵,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
循环。但是为什么循环会无限循环?
很抱歉没有正确而清楚地解释这个问题。