2015-01-27 2 views
0

updateMasterGrid() 메서드에서 첫 번째로 c.getBall에서 값을 표시하고 있습니다. 소스배열 목록 값이 변경되지 않아도 변경됩니다.

2 내가 mastergrid하는 quadCellGrid의 값을 할당 한 후

나는 c.getBall.Source를 표시하고 위를 quadCellGrid ArrayList를

을 mastergrid하는 quadCellGrid의 값을 할당하고 quadCellGrid의 ArrayList에게 있습니다. quadCellGrid에서 값의 변화를 볼 수 있습니다. logcat 출력을 확인하십시오.

해결 방법을 알려주십시오.

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 [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

리스트는 참조의 목록입니다. 한 목록에서 참조를 가져 와서 다른 목록에 추가하면 두 목록 모두 동일한 개체에 대한 참조를 갖습니다.

이러한 개체에 대한 참조를 가져 와서 변경 (필드 설정)하면 변경 사항은 의 관련 요소에 모두 목록에 반영됩니다.

0

난 당신이 mastergrid 및 quadcellgrid을 채운 잘 모릅니다 만,이 줄은 나에게 범인을 보인다. 먼저 인쇄 할 때, 당신이 할 수 있도록

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

당신은 MastCellGrid 및 Quadcellgrid 모두에 저장 같은 Cellgrid 개체 인스턴스를 낳게 될 수도 그것은 널 (null)는 null로 인쇄되는 다시 인쇄.

당신에게 검댕 논리를 확인하거나 게시하십시오.

관련 문제