即使未更改,数组列表值也会更改



在方法 updateMasterGrid(),首先,我正在显示来自c.getBall的值。Source is quadCellGrid arraylist

第二,我将值从四单元网格分配给主网格

3rd 我正在显示 c.getBall.Source is quadCellGrid arraylist

将值从 quadCellGrid 分配给主网格后。我可以看到quadCellGrid中值的变化。请检查日志输出。

你能告诉我如何解决这个问题吗?

public class BurstBalls { 
private boolean Q1Match,Q2Match,Q3Match,Q4Match;
private Texture RED_BALL;
private Texture BURST_STAR; 
private List<CellGrid> masterGrid;
private List<CellGrid> quadCellGrid  = new ArrayList<CellGrid>();  
private List<CellGrid> burstCellGrid = new ArrayList<CellGrid>();  
private SpriteBatch batch; 
private float scaleXY = 0.1f;
private int Q1Moves[][] = { { 0, 0 },{ -1, 0 }, { 0, 1 }, { -1, 1 } }; 
private int Q2Moves[][] = { { 0, 0 },{  1, 0 }, { 0, 1 }, {  1, 1 } }; 
private int Q3Moves[][] = { { 0, 0 },{  1, 0 }, { 0,-1 }, {  1,-1 } }; 
private int Q4Moves[][] = { { 0, 0 },{ -1, 0 }, { 0,-1 }, { -1,-1 } };  
public BurstBalls( ) {  
    setGameTextures();
}

public void draw(SpriteBatch sb){    
    batch=sb;  
    if(!burstCellGrid.isEmpty()){ 
        showImageZoom1(BURST_STAR, burstCellGrid.get(0).getColCoordinate()/2, burstCellGrid.get(0).getRowCoordinate()/2); 
    }
}
private void showImageZoom1(Texture t, int x, int y) {
    scaleXY = scaleXY + 0.05f;
    if (scaleXY >= 1.0){
        //burstCellGrid.clear();
        scaleXY = 1.0f;
    }
    Sprite s = new Sprite(t);
    s.setPosition(x, y);
    s.setScale(scaleXY);
    s.draw(batch);
}
public List<CellGrid> getMatchBallCells(int row, int col, Ball b, List<CellGrid> mGrid){  
    this.masterGrid=mGrid;
    Q1Match=false;
    Q2Match=false;
    Q3Match=false;
    Q4Match=false;
    quadCellGrid.clear();
    burstCellGrid.clear();
    if(row<(MainGame.ROW-1) && col >0){
        Q1Match = checkCells(b, row,col, Q1Moves);  
        System.out.println("Q1Match : " + Q1Match);
    }
    if(row<(MainGame.ROW-1) && col < (MainGame.COL-1)){ 
        Q2Match = checkCells(b,row,col, Q2Moves);   
        System.out.println("Q2Match : " + Q2Match);
    }
    if(row>0 && col< (MainGame.COL-1)){ 
        Q3Match = checkCells(b, row,col, Q3Moves);  
        System.out.println("Q3Match : " + Q3Match);
    }
    if(row>0 && col > 0){ 
        Q4Match = checkCells(b, row,col, Q4Moves);  
        System.out.println("Q4Match : " + Q4Match);
    }   
    if(Q1Match || Q2Match || Q3Match || Q4Match){ 
        updateMasterGrid();
    } 
    for (CellGrid c : burstCellGrid) {
        if(c.getBall()!=null){
            System.out.println("!Burst Cells - (c.getRow(),c.getCol) - " + "(" + c.getRow() +","+c.getCol() +")"); 
        }
    } 
    return masterGrid; 
}
private void updateMasterGrid() {
    for(CellGrid c: quadCellGrid){   
        System.out.println(" Before quadCellGrid.ball " +  c.getBall());   
        masterGrid.get(masterGrid.indexOf(c)).setBall(null); 
        System.out.println(" After  quadCellGrid.ball " +  c.getBall());   
    }  
}  
private boolean checkCells(Ball actionBall,int row,int col,int moves[][]) {  
    boolean firstCell = false,secondCell = false,thirdCell = false,fourthCell = false;
    CellGrid cellGrid=checkIfBallThere(row+moves[0][1],col+moves[0][0]);
    firstCell = checkBall(cellGrid,actionBall); 
    cellGrid=checkIfBallThere(row+moves[1][1],col+moves[1][0]);
    secondCell = checkBall(cellGrid,actionBall); 
    cellGrid=checkIfBallThere(row+moves[2][1],col+moves[2][0]);
    thirdCell = checkBall(cellGrid,actionBall); 
    cellGrid=checkIfBallThere(row+moves[3][1],col+moves[3][0]);
    fourthCell = checkBall(cellGrid,actionBall); 
    if(firstCell && secondCell && thirdCell && fourthCell){  
        return true;  
    } 
    return false;  
}
private boolean checkBall(CellGrid c, Ball actionBall) { 
    if(c!=null && c.getBall().getTexture().equals(actionBall.getTexture())){ 
        if (!quadCellGrid.contains(c)){ 
            quadCellGrid.add(c); 
        }
        return true;
    } 
    return false;
}  
public CellGrid checkIfBallThere(int cellRow, int cellCol ) {
    for (CellGrid c : masterGrid) {
        if (c.getRow() == cellRow && c.getCol() == cellCol
                && c.getBall() != null) {  
            return c;
        }
    }
    return null;
} 
private void setGameTextures() {
    RED_BALL = Texturemanager.RED_BALL;
    RED_BALL.setFilter(TextureFilter.Linear, TextureFilter.Linear);
    BURST_STAR = Texturemanager.BURST_STAR; 
    BURST_STAR.setFilter(TextureFilter.Linear, TextureFilter.Linear); 
}

}

日志猫

Before quadCellGrid.ball com.puzzle.game.ballpool.Ball@41414ed8
After  quadCellGrid.ball null
Before quadCellGrid.ball com.puzzle.game.ballpool.Ball@41415670
After  quadCellGrid.ball null
Before quadCellGrid.ball com.puzzle.game.ballpool.Ball@414155e0
After  quadCellGrid.ball null
Before quadCellGrid.ball com.puzzle.game.ballpool.Ball@41415628
After  quadCellGrid.ball null

列表是引用的列表。如果从一个列表获取引用并将其添加到另一个列表,则两个列表都具有对同一对象的引用。

如果您获得对此类对象的引用并对其进行更改(设置字段),则更改将反映在两个列表的相关元素中。

我不知道你是如何填充主网格和四单元格网格的,但这行对我来说似乎是罪魁祸首。

masterGrid.get(masterGrid.indexOf(c)).setBall(null); 

您可能在 MastCellGrid 和 Quadcellgrid 中存储了相同的 Cellgrid 对象实例,因此在先打印它时,您将其设为 null,然后再次打印它,打印为 null。

检查或发布你的人口逻辑。

相关内容

  • 没有找到相关文章