Как получить доступ к массиву из класса представления? - PullRequest
0 голосов
/ 09 февраля 2019

В настоящее время я работаю над сеткой 10x10 и пытаюсь внести в нее изменения.У меня есть 3 класса для этой операции, но я не могу изменить представление после внесения изменений.3 класса:

  1. Main (где я делаю изменения)

    placeButton.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View view) {
            mGame.place(size, isHorizontal, row, column);});
    
  2. Игра (где я обрабатываю и применяю изменения)

    System.out.println("Place Ships: " + size + isHorizontal + left + top);
    
    if(isHorizontal == true) {//if horiz
        if(gameGrid[top][left] ==0) {
            for (int i = 0; i < size; i++) {
                gameGrid[top][left + i] = size;
            } }
        else{
            System.out.println("ALREADY FILLED");
        }
    
  3. Представление (где я рисую и рисую свою сетку)

    System.out.println("SETUP VIEW ARRAY");
    for (int col = 0; col < colCount; col++) {
    
        for (int row = 0; row < rowCount; row++) {
    
            int x = mGame.placedCell(row, col);
            System.out.print(x + " ");//tocheck if the array obtained correctly
            float cx = separatorSize + (chosenDiameter + separatorSize) * col;
            float cy = separatorSize + (chosenDiameter + separatorSize) * row;
    
            if(x > 0){
                System.out.println("FOOOOOOOOOOOUND! ");   //received fine
                paint = mPlayer1Paint;
            }else {
                paint = mBGPaint;
            }
            canvas.drawRect(cx, cy, oneSide + (cx), oneSide + (cy), paint);
        }
        System.out.println("");
    }
    System.out.println("SETUP VIEW ARRAY END");   
    
  4. метод поместил ячейку в моем игровом классе

        mainActivity.setRow(row);
        mainActivity.setCol(column);
    
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                int flag = gameGrid[row][column];
                if(i == column && j == row){
                    if(flag > 0){ //because unedited places is 0, edited places are more than 0
                        gameGrid[row][column] = flag;
                    }
                } } }
        return gameGrid[row][column];
    

Моя проблема в том, что мой класс просмотра не может получить измененный массив (gameGrid) из моего игрового класса.Я попытался напечатать массив, чтобы проверить, правильно ли он изменился, и это так.Я также объявил массив в своем классе Game как статический, но ничего не изменилось.Любая помощь приветствуется.

1 Ответ

0 голосов
/ 09 февраля 2019
  • Чтобы внести изменения в класс View, можно передать ссылку на весь класс view в класс Game, где вы вносите изменения в массив gameGrid.

  • Затем вы можете вызвать view.invalidate (), чтобы перерисовать вашу сетку при обновлении массива.invalidate () вызовет метод onDraw () класса представления снова.

Вы можете передать ссылку на представление внутри конструктора вашего игрового класса-

MyGameView mView; 
    public Game(MyGameView view)
    {
    mView=view;
     ...
    }

Или создайте метод внутри класса Game для установки значения mView после создания вашего представления -

public void setViewReference(MyGameView view)
{
mView=view;
}

Теперь создайте открытый метод внутри вашего класса View, который будет получать обновленный массив и перерисовывать всю сеткуснова -

public void update(int [][] updatedGameGrid) //Assuming the array is int. Change the datatype is its not an int array
{
   gameGrid=updatedGameGrid; //Here gameGrid is the array inside your view class
   invalidate(); // Redraw the entire View (grid) again by calling onDraw()
}

Теперь в вашем классе Game вы можете обновить массив и передать его в класс представления

public void update() 
{
 ... //Place you code to update the gameGrid array
 mView.update(gameGrid); //Pass the array to view class
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...