> for (var x = 10; x < 200; x += 30)
> cx.drawImage(img, x, 10);
> });
>
По умолчанию >drawImage
нарисует картинку оригинального размера. Ему можно задать два дополнительных параметра для изменения ширины и высоты.
Когда >drawImage
задано девять аргументов, её можно использовать для рисования части изображения. Со второго по пятый аргументы обозначают прямоугольник (x, y, ширина и высота) в исходной картинке, который надо скопировать. С шестого по девятый – прямоугольник на холсте, куда его надо скопировать.
Это можно использовать, чтобы упаковывать несколько спрайтов (элементов картинки или кадров анимации) в один файл изображения, и рисовать только нужные его части. К примеру, есть у нас картинка игрового персонажа в разных позах:
Перебирая позы, мы можем вывести анимацию идущего персонажа.
Для анимации на холсте пригодится метод >clearRect
. Он напоминает >fillRect
, но вместо окраски прямоугольника он делает его прозрачным, удаляя предыдущие пиксели.
Мы знаем, что каждый спрайт шириной 24 и высотой 30 пикселей. Следующий код загружает картинку и задаёт интервал для рисования следующих кадров:
>
>
> var cx = document.querySelector("canvas").getContext("2d");
> var img = document.createElement("img");
> img.src = "img/player.png";
> var spriteW = 24, spriteH = 30;
> img.addEventListener("load", function() {
> var cycle = 0;
> setInterval(function() {
> cx.clearRect(0, 0, spriteW, spriteH);
> cx.drawImage(img,
> // source rectangle
> cycle * spriteW, 0, spriteW, spriteH,
> // destination rectangle
> 0, 0, spriteW, spriteH);
> cycle = (cycle + 1) % 8;
> }, 120);
> });
>
Переменная >cycle
отслеживает позицию в анимации. Каждый кадр она увеличивается и по достижению 7 начинает сначала, используя оператор деления с остатком. Она используется для подсчёта координаты x, на которой в изображении находится спрайт с нужной позой.
А что, если нам надо, чтобы персонаж шёл влево, а не вправо? Мы могли бы добавить ещё один набор спрайтов. Но мы также можем сказать холсту, чтоб он рисовал картинку зеркально.
Вызов метода >scale
приведёт к тому, что все последующие рисунки будут масштабированы. Он принимает два параметра – масштаб по горизонтали и по вертикали.
>
>
> var cx = document.querySelector("canvas").getContext("2d");
> cx.scale(3, .5);
> cx.beginPath();
> cx.arc(50, 50, 40, 0, 7);
> cx.lineWidth = 3;
> cx.stroke();
>
Масштабирование растягивает или сжимает все параметры картинки, включая ширину линии по заданным параметрам. Масштабирование с отрицательным параметром переворачивает картинку зеркально. Переворот происходит вокруг точки (0, 0), что означает, что направление системы координат тоже поменяется. При применении горизонтального масштаба -1, форма, нарисованная на позиции x = 100, будет нарисована там, где раньше была позиция -100.