1

迷路の垂直壁と水平壁を参照して、2 セットのブール配列で構成される 2D 迷路を作成しました。この迷路は現在 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 つの異なる手順を示してください。最初の画像は開始点であり、必要に応じて描画されていますが、ユーザーの円を線の周りに移動し始めると、正しく描画されません。

drawLine の問題を示す 3 つの異なるユーザー位置

最後に、Waze の壁を描画するために使用している現在のブール配列を以下に示します。

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

迷路が常に 5 x 5 として描画されるように、描画時に使用し、移動時に変更する 2 つの変数scroll_xscroll_y使用し、2 つの変数を使用してマップのどの部分のオフセットを描画するかを決定します。

また、変数を実装zoom_xして、必要zoom_yに応じてズームを変更することもできます。

onDraw メソッドを使用しているため、「すべてを一度にペイントしてマップを移動する」と考えることができる可能性は排除されます。

これは、問題の説明に基づいて、現時点で私ができる最善の答えです。

編集:

より多くの情報を提供したので、再設計された onDraw を次に示します。

以下の関数では、迷路が 5 x 5 より大きい場合に、スクロール オフセットとして動作するように と を使用しました。また、描画する領域の大きさを定義するプロパティを追加maze.scrollXしました。マップの左上にいる場合は、両方とも 0 に設定する必要があります。私はこのコードを自分でテストしていないので、どのように機能するか教えてください。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 に答える