Нарисуйте квадраты на холсте из массива - PullRequest
0 голосов
/ 06 марта 2019

У меня проблема с тем, как рисовать квадраты на холсте, используя координаты во вложенном массиве. Идея состоит в том, чтобы выделить несколько квадратов, чтобы игрок знал, что он может двигаться по ним.

Функция рисования этих квадратов вызывается после, поэтому весь холст не рисуется снова.

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

Как преобразовать "координаты массива" в значения, используемые методами рисования на холсте.

Или проблема кроется в разнице между availableSquare и chartBoard?

Поскольку я не нашел ни одной темы по этому вопросу, я надеюсь, что мой пример достаточно подробный.

function Game(width, height) {
  this.width = width;
  this.height = height;
}
const game = new Game(10, 10)
const chartBoard = [];
const availableSquares = [
  [6, 6],
  [6, 7],
  [6, 8]
]


// The nested arrays with all the possible position
function createBoard(width, height) {
  for (let i = 0; i < width; i++) {
    const row = [];
    chartBoard.push(row);
    for (let j = 0; j < height; j++) {
      const col = {};
      row.push(col);
    }
  }
  return chartBoard;
};
createBoard(game.width, game.height);
console.log(chartBoard)

// Display the array on the canvas
const ctx = $('#board').get(0).getContext('2d');

function drawBoard(width, height) {
  for (let i = 0; i < width; i++) {
    for (let j = 0; j < height; j++) {
      ctx.strokeStyle = 'rgba(0, 0, 0, 0.7)';
      ctx.beginPath();
      ctx.strokeRect(j * 64, i * 64, 64, 64);
      ctx.closePath();
    }
  }
};
drawBoard(game.width, game.height);

// Function to highlight the squares from the array availableSquares
//        function showAvailableMovement(array) {
//            for (let i = 0; i < array.length; i++) {
//                for (let j = 0; j < array[i].length; j++) {
//
//                    ctx.strokeStyle = 'red';
//                    ctx.beginPath();
//                    ctx.strokeRect(j * 64, i * 64, 64, 64);
//                    ctx.closePath();
//                }
//            }
//        };
//        showAvailableMovement(availableSquares);
body {
  background-color: black;
}

#board {
  background-color: white;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<canvas id="board" width="640" height="640"></canvas>

Ответы [ 2 ]

1 голос
/ 06 марта 2019

Поскольку у вас есть только массив координат, вам не нужно запускать вложенные циклы для доступа к значениям. Вы можете сделать это так:

function showAvailableMovement(array) {
    for (let i = 0; i < array.length; i++) {
        let x = array[i][0],
            y = array[i][1];
        ctx.strokeStyle = 'red';
        ctx.beginPath();
        ctx.strokeRect(x * 64, y * 64, 64, 64);
        ctx.closePath();
        }
    };

В вашем методе вы фактически работали дважды, поэтому значения были итерациями:

  1. i = 0, j = 0
  2. i = 0, j = 1
  3. ... и т. Д.
1 голос
/ 06 марта 2019

Вы на самом деле очень близки, вы просто путаете ваши значения x и y:

// Function to highlight the squares from the array availableSquares
function showAvailableMovement(array) {
    for (let i = 0; i < array.length; i++) {
        for (let j = 0; j < array[i].length; j++) {

            let x = array[i][0];
            let y = array[i][1];

            ctx.strokeStyle = 'red';
            ctx.beginPath();
            ctx.strokeRect(x * 64, y * 64, 64, 64);
            ctx.closePath();
        }
    }
};
showAvailableMovement(availableSquares);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...