Сетка javascript

Всем доброго времени суток. На связи Алексей Гулынин. В прошлой статье вы узнали как работать с объектом geolocation в html5. В данной статье я бы хотел отойти от теории и написать пример того, как можно нарисовать макетную сетку на холсте ("canvas") с помощью html5 и javascript. Пусть требуется написать функцию, которая отрисовывает макетную сетку. Необходимо предусмотреть возможность изменение размеров холста, ячеек сетки и цвета линий
Для начала подготовим разметку и добавим стили к элементу "canvas":
<!doctype html> <html> <head> <title>Макетная сетка javascript</title> <style> body { margin: 0; padding: 0; } canvas { display: block; margin: 20px auto 0; border: 1px dotted #000; } </style> </head> <body> <canvas id="mycanvas" ></canvas> </body> </html>
Рисование выполняется исключительно средствами javascript. Приведу пример кода:
<script> var myGridObject = { canvasWidth : 400, //ширина холста canvasHeight : 400, //высота холста cellsNumberX : 15, //количество ячеек по горизонтали cellsNumberY : 15, //количество ячеек по вертикали color : "#00f", //цвет линий //Метод setSettings устанавливает все настройки setSettings : function() { // получаем наш холст по id canvas = document.getElementById("mycanvas"); // устанавливаем ширину холста canvas.width = this.canvasWidth; // устанавливаем высоту холста canvas.height = this.canvasHeight; // canvas.getContext("2d") создает объект для рисования ctx = canvas.getContext("2d"); // задаём цвет линий ctx.strokeStyle = this.color; // вычисляем ширину ячейки по горизонтали lineX = canvas.width / this.cellsNumberX; // вычисляем высоту ячейки по вертикали lineY = canvas.height / this.cellsNumberY; }, // данная функция как раз и будет отрисовывать сетку drawGrid : function() { // в переменной buf будет храниться начальная координата, откуда нужно рисовать линию // с каждой итерацией она должна увеличиваться либо на ширину ячейки, либо на высоту var buf = 0; // Рисуем вертикальные линии for (var i = 0; i <= this.cellsNumberX; i++) { // начинаем рисовать ctx.beginPath(); // ставим начальную точку ctx.moveTo(buf, 0); // указываем конечную точку для линии ctx.lineTo(buf, canvas.height); // рисуем и выводим линию ctx.stroke(); buf +=lineX; } buf = 0; // Рисуем горизонтальные линии for (var j = 0; j <= this.cellsNumberY; j++) { ctx.beginPath(); ctx.moveTo(0, buf); ctx.lineTo(canvas.width, buf); ctx.stroke(); buf +=lineY; } } } myGridObject.setSettings(); myGridObject.drawGrid(); </script>
Я решил сделать один объект, в котором будет пять свойств и два метода: "setSettings()" и "drawGrid()". Специально решил показать, как можно реализовать такую задачу в объектном стиле. Хотя, именно для такой задачи, этого и не требовалось. Хорошо бы подошёл и функциональный подход.
Что в итоге получилось вы можете посмотреть ниже:
В качестве домашнего задания: улучшите механизм создания макетной сетки, добавив интерактивности. Создайте форму с 5 элементами "input", в которые можно будет вводить значения наших свойств (canvasWidth, canvasHeight, cellsNumberX, cellsNumberY, color) и одной кнопкой, по нажатию на которую будет перерисовываться сетка.
В данной статье мы нарисовали на холсте макетную сетку. В одной из следующих статей будем делать игру "крестики-нолики"
На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.