Метод Canvas OnDraw

В настоящее время я создаю лабиринт, используя пару логических массивов (горизонтальный и вертикальный), чтобы рисовать линии для лабиринта.

В лабиринте одновременно отображается только 5 логических значений из массива. Затем у меня есть пользователь, который всегда находится в центре, и когда он движется по лабиринту, рисуется следующий набор логических значений. Это работает как надо.

Проблема, с которой я сталкиваюсь, заключается в следующем: когда пользователь перемещается в определенную часть лабиринта, цикл for, рисующий линии, становится выше, чем массив bool, и, следовательно, приводит к сбою приложения. Ниже приведены некоторые фрагменты кода.

onDraw:

protected void onDraw(Canvas canvas) {
    canvas.drawRect(0, 0, width, height, background);
    int currentX = maze.getCurrentX(),currentY = maze.getCurrentY();
    int drawSizeX = 6 + currentX;
    int drawSizeY = 6 + currentY;
    currentX = currentX - 2;
    currentY = currentY - 2;

    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 + currentY][j + currentX])  {
                canvas.drawLine(x + cellWidth,   //start X
                                y,               //start Y
                                x + cellWidth,   //stop X
                                y + cellHeight,  //stop Y
                                line);
            }
            if(hLines[i + currentY][j + currentX]) {
                canvas.drawLine(x,               //startX 
                                y + cellHeight,  //startY 
                                x + cellWidth,   //stopX 
                                y + cellHeight,  //stopY 
                                line);
            }
        }
        //draw the user ball
        canvas.drawCircle((2 * totalCellWidth)+(cellWidth/2),   //x of center
                          (2 * totalCellHeight)+(cellWidth/2),  //y of center
                          (cellWidth*0.45f),                    //radius
                          ball);
    }

РЕДАКТИРОВАТЬ 1 - Движение -

public boolean move(int direction) {
    boolean moved = false;
    if(direction == UP) {
        if(currentY != 0 && !horizontalLines[currentY-1][currentX]) {
            currentY--;
            moved = true;
        }
    }
    if(direction == DOWN) {
        if(currentY != sizeY-1 && !horizontalLines[currentY][currentX]) {
            currentY++;
            moved = true;
        }
    }
    if(direction == RIGHT) {
        if(currentX != sizeX-1 && !verticalLines[currentY][currentX]) {
            currentX++;
            moved = true;
        }
    }
    if(direction == LEFT) {
        if(currentX != 0 && !verticalLines[currentY][currentX-1]) {
            currentX--;
            moved = true;
        }
    }
    if(moved) {
        if(currentX == finalX && currentY == finalY) {
            gameComplete = true;
        }
    }
    return moved;
}

Если есть что-то еще, что мне нужно уточнить, пожалуйста, дайте мне знать.

Заранее спасибо.


person Raj    schedule 03.07.2012    source источник
comment
Привет, лабиринт - это экземпляр класса Android или один из ваших собственных? Как вычисляется maze.getCurrentX()? лабиринт.getCurrentY() ? С уважением   -  person loloof64    schedule 03.07.2012
comment
Все это рассчитывается в отдельном классе, который определяет различные вещи, такие как размер, конечная позиция и т. д. Как вы можете видеть в отредактированном коде, текущие X и Y определены как 0, а затем увеличиваются и уменьшаются в зависимости от движения пользователя.   -  person Raj    schedule 03.07.2012
comment
В вашем методе перемещения, почему бы вам не написать код, например, для проверки направления вверх, если (currentY › 0 && !horizontalLines[currentY-1][currentX]). Таким образом, используя оператор «›» вместо оператора «!=». Таким образом, вы будете использовать более защитное программирование. Возможно, это не решит вашу проблему, но уже может решить потенциальные проблемы в будущем.   -  person loloof64    schedule 03.07.2012
comment
Разве вы не смешиваете i и x с j и y?   -  person Marcio Covre    schedule 03.07.2012
comment
@LaurentBERNABE, я внес эти изменения, но это не решило проблему. В настоящее время у меня есть рисунок лабиринта, как и должен, и я могу предотвратить сбой приложения, ограничив размер прорисовки до 10/11 (X/Y), однако это означает, что пользователь не может передать 5-й блок в 6-й блок. Любое дальнейшее руководство высоко ценится. Спасибо   -  person Raj    schedule 03.07.2012
comment
@nininho - i и js верны. Пожалуйста, смотрите комментарий выше, чтобы подробно описать мою проблему / исправить немного больше, спасибо.   -  person Raj    schedule 03.07.2012
comment
Но вы используете [i + currentY][j + currentX] как для vLines, так и для hLines, но они имеют разный размер.   -  person Marcio Covre    schedule 03.07.2012
comment
@nininho, правильно настроены логические массивы, но, как я уже говорил, это не моя проблема, поскольку лабиринт рисуется правильно. У меня проблема с перемещением пользователя за 5-й блок. Спасибо   -  person Raj    schedule 03.07.2012


Ответы (1)


drawSizeX/Y индексирует массив, когда currentX/Y достаточно высок (длина-6)

Поэтому ограничьте значения до Math.min(current + 6, array.length)

person jpa    schedule 03.07.2012
comment
Я не совсем уверен, где я должен использовать это, я ранее пробовал оператор if в цикле for, чтобы ограничить drawSize X/Y до 10 и 11. Это действительно предотвратило сбой приложения, однако также остановило пользователя, проходящего мимо определенную точку, в этом случае не мог перейти на 6-й блок вправо. Спасибо - person Raj; 03.07.2012
comment
@LandLPartners Я думаю, вам следует публиковать больше своего кода, иначе вашим читателям, вероятно, будет трудно помочь вам. - person loloof64; 03.07.2012
comment
@LaurentBERNABE Я добавил в свой вопрос еще один раздел кода, это биты импорта из класса лабиринта и дополнительный раздел фрагмента логических массивов. Спасибо - person Raj; 03.07.2012
comment
Где произошло исключение? (Кроме того, было ли это ArrayIndexOutOfBoundsException?) - person loloof64; 03.07.2012
comment
@LaurentBERNABE, проведя еще немного отладки, я понял, что после 5 квадратов ничего не срабатывает. Это связано с тем, что я использую SizeY/X = 5. Причина, по которой я использую это, заключается в том, что я хочу отображать только блок 5 x 5 за один раз. Поэтому мне нужно каким-то образом разработать другой способ отображения 5x5, а затем изменить этот код обратно на sizeX = horizontalLines[0].length; Вы можете увидеть пример кода во фрагменте для класса лабиринта. Спасибо - person Raj; 03.07.2012
comment
@LandLPartners if(vLines[i + currentY][j + currentX]) вы могли бы сделать, например if (i + currnentY<v.lines.length && j+currentX < vlines[i.currentY].lenght && vLines[i + currentY][j + currentX] ) Если бы это была ваша проблема - person jpa; 04.07.2012
comment
@jpa спасибо за исправление, однако это было не то, что мне нужно. Я понял, что мой onDraw на самом деле правильный, и проблема, с которой я столкнулся, связана с видом на мой лабиринт. Однако он правильно вытягивается, поскольку я ограничиваю размер отрисовки 5 блоками, когда пользователь достигает этого, никакие дальнейшие функции перемещения не запускаются. По сути, мне нужно разработать другой способ увеличения холста, возможно, рисуя весь лабиринт при первой загрузке. Спасибо - person Raj; 04.07.2012
comment
@jpa код, который вы указали, был на самом деле правильным, в конце концов мне пришлось внести небольшое редактирование в мой фрагмент перемещения, чтобы сохранить масштаб до 5x5, позволяя пользователю перемещаться по всему лабиринту. Спасибо - person Raj; 04.07.2012