- PVSM.RU - https://www.pvsm.ru -
HTML5 Canvas — элемент для работы с графикой. Почти все мы начинали с простых fillRect, strokeRect и clearRect, но затем мы переходили на использование Path и картинок, или брались за «тяжелые» библиотеки. Сегодня я расскажу простой способ упростить работу с Canvas элементом.
Для рисования фигур, например круга мы используем следующую операцию:
ctx.beginPath();
ctx.arc(0,0,100,0,Math.PI*2,true);
ctx.closePath();
И не редко, когда мы используем более одной фигуры, мы вынуждены писать много одинаково или аналогичного кода. Обычные функции не всегда нам могут помочь в этом. Я предлагаю следовать принципу буферов: накопление и/или сохранение операций.
Shape — это JS объект который сначала «накапливает» нужные нам операции, затем применяет их в 2D context у Canvas элемента (заливка, штриховка или обрезание).
Пример и исходники можете найти здесь: github.com/Alexei03a/shape [1]
Код нашей библиотеки строится следующим образом:
var Shape = function(){
this.path = [];
}
Shape.prototype = {
//...
}
Здесь я комментировать не буду.
Накопление операций происходит функцией:
function(obj){
this.path.push([funcName,obj]);
}
Где:
funcName — имя функции в context
obj — массив аргументов
Вопрос: «а почему не arguments?»
Ответ: arguments лишает нас гибкости, поэтому мы используем обыкновенный массив для гибкости т.е. чтобы аргументы можно было сменить вместо создания нового объекта Shape.
Прежде чем что-либо рисовать, мы должны использовать «пре-процессор». Это делается для того, чтобы 2D контекст «увидел» нашу фигуру.
context.beginPath();
context.save();
this.path.map(function(a){
context[a[0]].apply(context,a[1]);
});
context.restore();
context.closePath();
После чего мы используем любую из операций:
context.fill()
context.stroke()
context.clip()
То есть заливка, штриховка или обрезание.
Благодаря такой библиотеки мы сможем создавать анимации, не используя лишние части кода (за исключением массивов, они нам будут очень нужны).
Моя крутящаяся стрелочка [2] была написана путем использования накопителей и массивов аргументов.
В целом, мы могли бы упростить саму библиотеку (использование объектов, arguments и массивы), но это значительно усложнило бы наш код. Впрочем, это зависит от вашей фантазии.
WhatWG также в спецификации [3] описал объект Path, однако наш shape.js совершенно не похож на тот самый Path, который описал whatwg. Впрочем вы можете доработать мою идею в соответствии спецификации. Я лишь просто рассказал как можно сделать работу с Canvas проще. Я не гарантирую повышение производительности.
UPDATE! Я улучшил свой вариант shape.js и теперь он стал более гибок и более похожа на библиотеку JS. Вы можете не только написать свой вариант shape.js и подглядеть у меня.
Ссылка на Github по прежнему здесь: github.com/Alexei03a/shape [1]
Автор: Alexei03a
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/canvas-2/14776
Ссылки в тексте:
[1] github.com/Alexei03a/shape: https://github.com/Alexei03a/shape
[2] крутящаяся стрелочка: https://github.com/Alexei03a/shape/blob/master/test.html
[3] спецификации: http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html
Нажмите здесь для печати.