2015-01-27 2 views
0

В методе updateMasterGrid(), 1st Я показываю значение c.getBall. Источник является quadCellGrid Список_массивовИзменение значения массива, даже если оно не изменено.

второй я задаю значение из quadCellGrid в mastergrid

третий я отображая c.getBall.Source является quadCellGrid Список_массивов

После присвоения значения от quadCellGrid до mastergrid. Я мог видеть изменение значения в 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); 
} 

}

Logcat

Before quadCellGrid.ball [email protected] 
After quadCellGrid.ball null 
Before quadCellGrid.ball [email protected] 
After quadCellGrid.ball null 
Before quadCellGrid.ball [email protected] 
After quadCellGrid.ball null 
Before quadCellGrid.ball [email protected] 
After quadCellGrid.ball null 
+0

Пожалуйста, отредактируйте свой код до минимума, необходимого для демонстрации проблемы - здесь явно много нерелевантного кода, что делает вопрос не полезным для других пользователей. См. [SSCCE] (http://sscce.org) – Bohemian

+0

Возможно, потому, что вы помещаете те же ячейки в оба списка. – immibis

ответ

0

A Список представляет собой список ссылок. Если вы получите ссылку из одного списка и добавите ее в другой список, в обоих списках есть ссылки на тот же объект.

Если вы получаете ссылку на такой объект и мутируете его (задаете поле), изменение будет отражено в соответствующем элементе как.

0

Я не знаю, как вы заселена mastergrid и quadcellgrid, но эта линия кажется мне виновника.

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

Вы можете быть с такой же экземпляр Cellgrid объекта, хранящегося в обоих MastCellGrid и Quadcellgrid, поэтому при печати его первый, вы делаете его недействительным напечатать его снова, которое печатается как нуль.

Проверьте или опубликуйте логику популяции.