1

我创建了一个 2D 迷宫,它由 2 组布尔数组组成,指的是我的迷宫的垂直和水平墙。这个迷宫目前是 12 x 12,但我只想显示 5 x 5。

有没有办法将迷宫缩放到用户所在位置的 5 x 5 圆周,然后在每次移动时简单地显示下一个块,因此只显示 5 x 5。

理想情况下,我想坚持把整个东西画出来,然后简单地进行某种鸟瞰视图缩放(这将提高可用性并通常加快应用程序的速度)。

编辑 下面是我目前用来绘制迷宫的代码。但是,当我移动用户圈时,下面的代码似乎没有绘制正确的 v 和 hLines。

public void onDraw(Canvas canvas) 
{
    canvas.drawRect(0, 0, width, height, background);
    mazeSizeX = 5 + maze.getCurrentX();
    mazeSizeY = 5 + maze.getCurrentY();
    for(int i = maze.getCurrentX(); i < mazeSizeX; i++) 
    {
        for(int j = maze.getCurrentY(); j < mazeSizeY; j++){
            float x = j * totalCellWidth;
            float y = i * totalCellHeight;
            if(j < mazeSizeX -1 && vLines[i][j]) {
                //we'll draw a vertical line
                canvas.drawLine(x + cellWidth,   //start X
                                y,               //start Y
                                x + cellWidth,   //stop X
                                y + cellHeight,  //stop Y
                                line);
            }
            if(i < mazeSizeY -1 && hLines[i][j]) {
            //we'll draw a horizontal line
                canvas.drawLine(x,               //startX 
                                y + cellHeight,  //startY 
                                x + cellWidth,   //stopX 
                                y + cellHeight,  //stopY 
                                line);
            }
        }
    }
}

注意 - mazeSizeX 和 Y 最初设置为 5。任何关于我哪里出错的进一步指导将不胜感激。

编辑 2:请参阅下图以指示用户可能已采取的 3 个不同步骤来帮助进一步解释我遇到的问题。第一个图像是起点,并且已经按原样绘制,但是当我开始移动用户圆圈时,线条周围的绘制不正确。

3 个不同的用户位置显示 drawLine 问题

最后,请看下面我用来绘制位智墙的当前布尔数组:

boolean[][] vLines = new boolean[][]{
                        {true ,false,false,false,true ,false,false},
                        {true ,false,false,true ,false,true ,true },
                        {false,true ,false,false,true ,false,false},
                        {false,true ,true ,false,false,false,true },
                        {true ,false,false,false,true ,true ,false},
                        {false,true ,false,false,true ,false,false},
                        {false,true ,true ,true ,true ,true ,false},
                        {false,false,false,true ,false,false,false}
                     };
boolean[][] hLines = new boolean[][]{
                        {false,false,true ,true ,false,false,true ,false},
                        {false,false,true ,true ,false,true ,false,false},
                        {true ,true ,false,true ,true ,false,true ,true },
                        {false,false,true ,false,true ,true ,false,false},
                        {false,true ,true ,true ,true ,false,true ,true },
                        {true ,false,false,true ,false,false,true ,false},
                        {false,true ,false,false,false,true ,false,true }
                    };

提前致谢

4

1 回答 1

1

我会使用两个变量,scroll_xscroll_y在绘制时使用,在移动时修改,这样你的迷宫总是被绘制为 5 x 5,你使用这两个变量来确定你应该绘制地图的哪些部分的偏移量。

此外,如果您愿意,您可以实现zoom_x和变量来更改缩放。zoom_y

由于您使用的是 onDraw 方法,因此排除了我能想到的“绘制一次并移动地图”的任何可能性。

根据您对问题的描述,这是我目前能给出的最佳答案。

编辑:

现在您已经提供了更多信息,下面是为您重新设计的 onDraw:

在下面的函数中,如果迷宫大于 5 x 5 ,我使用maze.scrollX和作为滚动偏移。我还添加了属性来定义你想要绘制的大小。如果您位于地图的左上角,则这两个都应设置为零。我自己没有测试过这段代码,所以请告诉我它是如何工作的。maze.scrollYdrawSize

请注意,此代码没有错误检查,如果maze.scrollX太大,则会导致错误。

public void onDraw(Canvas canvas) 
{
    canvas.drawRect(0, 0, width, height, background);
    int drawSizeX = 5;
    int drawSizeY = 5;
    for(int i = 0; i < drawSizeX - 1; i++) 
    {
        for(int j = 0; j < drawSizeY - 1; j++){
            float x = j * totalCellWidth;
            float y = i * totalCellHeight;
            if(vLines[i + maze.scrollX][j + maze.scrollY]) {
                //we'll draw a vertical line
                canvas.drawLine(x + cellWidth,   //start X
                                y,               //start Y
                                x + cellWidth,   //stop X
                                y + cellHeight,  //stop Y
                                line);
            }
            if(hLines[i + maze.scrollX][j + maze.scrollY]) {
            //we'll draw a horizontal line
                canvas.drawLine(x,               //startX 
                                y + cellHeight,  //startY 
                                x + cellWidth,   //stopX 
                                y + cellHeight,  //stopY 
                                line);
            }
        }
    }
}
于 2012-05-15T13:26:30.017 回答