Java 线程游戏循环中的图形渲染。更改阵列上的数据

Java 线程游戏循环中的图形渲染。更改阵列上的数据,java,android,multithreading,Java,Android,Multithreading,我有两个2D int数组对象,称为: originalMap和RendeMap,其中包含与益智游戏地图相对应的数字。 从thread类中,我从类调用Puzzle.java中获得map数组,并修改该数组 int [][] rendedMap = Puzzle.getRendedMap().getMap(); int [][] originalMap = Puzzle.getMapObj().getMap(); 这是我的线程循环: 绘图拼图(画布、地图);获取画布和数组并绘制地图

我有两个2D int数组对象,称为: originalMap和RendeMap,其中包含与益智游戏地图相对应的数字。 从thread类中,我从类调用Puzzle.java中获得map数组,并修改该数组

   int [][] rendedMap = Puzzle.getRendedMap().getMap();
   int [][] originalMap = Puzzle.getMapObj().getMap();
这是我的线程循环:

绘图拼图(画布、地图);获取画布和数组并绘制地图

    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
}
public void executeSolution(){
numofplants=2;
对于(int x=0;x
检查
rendemap
数组是否已初始化,因为这通常会导致上下文错误,尤其是在android IDE中

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 Befort曲面视图被锁定,因为else导致它可能无法在该上下文循环中执行,正如我之前所说,这是一个与我们的组织应用程序有关的问题

希望这有帮助!请不要犹豫寻求更多的帮助


抱歉用英语说“我是印度人”

这似乎与问题无关。什么?它解决了我的问题和我的组织,如果您没有iGod信息,请不要留下评论,如编辑之前留下的评论。编辑之前,您发布了一些与问题无关的代码。m我的问题不是RendeMap数组。问题是当更改RendeMap数组的信息时,它也会更改原始映射数组。啊哈,jsut检查我的新答案以查看结果。谢谢你,okDo
Puzzle.GetRendeMap().getMap();
Puzzle.getMapObj().getMap())
返回相同的2d数组,还是它们不同?可能是您的
渲染贴图
原始贴图
数组引用了相同的对象。实际上,在益智类中,我创建了类Map的两个不同对象,并在其上分配了相同的2d数组。因此,在线程类中,我从贴图对象获取贴图数组,但实际上,它们在上有相同的数据。然后我认为这是您的问题。当您使用
int[]rendedMap=Puzzle.getRendedMap().getMap();
int[]originalMap=Puzzle.getMapObj().getMap()返回数组时;
您不是在复制数组,而是在引用它们。因此,由于它们都引用同一个数组,您在一个数组中所做的任何更改都会影响另一个数组。请尝试为每个贴图对象创建单独的2d数组,或者创建一个方法,从数组复制数据,而不是仅返回引用。好的,非常感谢,我将我试了一下,让你知道。显然这是我的问题。我创建了一个方法,将数组复制到一个新的数组对象,然后进行渲染。谢谢你的回答,我已经检查了其他条件它是可访问的
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);