2013-02-06 53 views
0

我有兩個2D詮釋數組對象,名爲: originalMap和rendedMap,它們包含與謎題遊戲地圖對應的數字。 從線程類我從類調用Puzzle.java獲取地圖數組並修改一個。線程遊戲循環中的圖形渲染。更改數組上的數據

int [][] rendedMap = Puzzle.getRendedMap().getMap(); 
    int [][] originalMap = Puzzle.getMapObj().getMap(); 

這是我的線程循環:

drawPuzzle(帆布,地圖);需要畫布和陣列並繪製地圖。

while(running){ 
      if(!holder.getSurface().isValid()) 
       continue; 

        canvas = holder.lockCanvas(); 

        if(runSolution && movements.size()>0){      
         executeSolution(); 
         drawPuzzle(canvas, rendedMap); 
         if(finished){//checks if the execution finished 
          runSolution=false; 
         } 
        if(message.equals("No more actions") || 
            message.equals("Out of bounds, try again!")){ 
          System.out.println(message); 
          drawPuzzle(canvas, originalMap); 
        } 
        }else{ 
         drawPuzzle(canvas, originalMap); 
        } 

        drawMovements(canvas); 
        holder.unlockCanvasAndPost(canvas); 
    } 
} 

這是我修改數組的方法:

public void executeSolution(){ 

    numOfPlanets = 2; 

    for(int x=0;x<rendedMap.length-1; x++){ 
     for(int y=0;y<rendedMap[x].length-1; y++){ 
      //Checks where the robot is and saves its initial position 
      if(rendedMap[x][y]>=7 && rendedMap[x][y]<=9){ 
       initX=x; initY=y; initial=true; 
       System.out.println("Initial X: "+initX +" Y: "+initY); 
       direction = rendedMap[x][rendedMap[x].length-1]; 
       System.out.println("Direction: "+direction); 
      } 
     }//end inner for 
    }//end for 

    if(movements.size()>0){ 
     for(int i=0; i<movements.size();i++){ 

      if(movements.get(i).getColour().equals("none")){ 
       if(movements.get(i).getMotion().equals("straight")){ 
        if(direction==RIGHT){ 
         if(rendedMap[initX][initY+1]==0){ 
          finished=true; 
          message = "Out of bounds, try again!"; 
          return; 
         }else{ 
          rendedMap[initX][initY+1]= rendedMap[initX][initY+1]+6; 
          rendedMap[initX][initY]=rendedMap[initX][initY]-6; 
         } 
        } 
       }//action if 
      }//color if 
     }//movements for loop 

     if(numOfPlanets > 0){ 
      finished = true; 

      message ="No more actions"; 
     } 
    }//movements if statement 
} 

我的問題是,當我渲染某種原因originalMap變化以及與renderMap陣列時,我試圖退原始地圖它不會改變。 我甚至打印出來並逐行檢查,它們是一樣的。

什麼可能會導致這種情況?我花了幾天的時間來弄清楚。

+0

做'Puzzle.getRendedMap()的GetMap();'和'Puzzle.getMapObj()的GetMap();'返回相同的2D數組,還是他們不同?有可能你的'rendedMap'和'originalMap'數組引用了同一個對象。 –

+0

實際上在拼圖類我創建2類不同的對象的類地圖, 和我分配相同的2D陣列上。 因此,在線程類中,我從地圖對象中獲取地圖數組,但實際上它們具有相同的數據。 – cotsios

+0

然後我認爲那是你的問題。當您通過使用int [] [] rendedMap = Puzzle.getRendedMap()。getMap();和int [] [] originalMap = Puzzle.getMapObj()。getMap();'你不是複製數組,但只是引用它們。因此,由於它們都引用相同的數組,所以在一個數組中進行的任何更改都會影響另一個數組。嘗試爲每個Map對象創建一個單獨的2d數組,或者創建一個從數組複製數據而不是僅返回引用的方法。 –

回答

0
if(direction==RIGHT) { 
    if(rendedMap[initX][initY+1]==0) { 
     finished=true; 
     message = "Out of bounds, try again!"; 
     return; 
    } else { 
     rendedMap[initX][initY+1]= rendedMap[initX][initY+1]+6; 
     rendedMap[initX][initY]=rendedMap[initX][initY]-6; 
    } 
} 

檢查rendedMap數組初始化,因爲這往往會導致上下文的錯誤,尤其是在Android的IDE。

+0

這似乎與這個問題無關。 –

+0

是什麼?它解決了我的問題和我的組織,如果你沒有良好的信息,請不要留下這樣的批評性評論 –

+0

您的評論在您修改之前留下。在編輯之前,你已經發布了一些與該問題無關的代碼。 –

0
if(!holder.getSurface().isValid()) 
       continue; 

        canvas = holder.lockCanvas(); 

        if(runSolution && movements.size()>0){      
         executeSolution(); 
         drawPuzzle(canvas, rendedMap); 
         if(finished){//checks if the execution finished 
          runSolution=false; 
         } 
        if(message.equals("No more actions") || 
            message.equals("Out of bounds, try again!")){ 
          System.out.println(message); 
          drawPuzzle(canvas, originalMap); 
        } 
        }else{ 
         drawPuzzle(canvas, originalMap); 
        } 

        drawMovements(canvas); 

召回您drawPuzzle beforte面視圖被鎖定爲別的使其不得以任何上下文環路我說befor它是與我們的組織COMON一個問題的應用

希望執行,這有助於!不要猶豫,馬上要求更多assistence

遺憾的英語,我的印度

+0

感謝您的回答,我已經檢查了可以訪問的其他情況 – cotsios