НАЙКРАЩИЙ САЙТ ДЛЯ ВЕБ-РОЗРОБНИКІВ
Графіка. Уроки W3Schools українською для початківців

En

Гра Обертання


Червоний квадрат може обертатися:


Обертання компонентів

Раніше в цьому підручнику червоний квадрат міг рухатися в ігровій зоні, але він не міг повертатися чи обертатися.

Щоб обертати компоненти, нам потрібно змінити спосіб малювання компонентів.

Єдиний метод обертання, доступний для елемента canvas, обертатиме все полотно:

rotate

Усе інше, що ви малюєте на полотні, також буде повернуто, а не лише певний компонент.

Ось чому ми повинні внести деякі зміни в метод update():

По-перше, ми зберігаємо поточний об’єкт контексту canvas:

ctx.save();

Потім ми переміщуємо все полотно в центр конкретного компонента, використовуючи метод translate (перекладу):

ctx.translate(x, y);

game movement

Потім ми виконуємо бажане обертання за допомогою методу rotate():

ctx.rotate(angle);

game movement

Тепер ми готові намалювати компонент на полотні, але тепер ми будемо малювати його з центральною позицією в позиції 0,0 на перенесеному (і повернутому) полотні:

ctx.fillRect(width / -2, height / -2, width, height);

game movement

Коли ми закінчимо, ми повинні відновити об’єкт контексту назад до його збереженої позиції, використовуючи метод restore (відновлення):

ctx.restore();

Компонент — це єдине, що обертається:

game movement

Конструктор component

Конструктор component має нову властивість під назвою angle, яка є радіанним числом, що представляє кут компонента.

Метод update конструктора component є місцем, де ми малюємо компонент, і тут ви можете побачити зміни, які дозволять компоненту обертатися:

Приклад

function component(width, height, color, x, y) {
  this.width = width;
  this.height = height;
  this.angle = 0;
  this.x = x;
  this.y = y;
  this.update = function() {
    ctx = myGameArea.context;
    ctx.save();
    ctx.translate(this.x, this.y);
    ctx.rotate(this.angle);
    ctx.fillStyle = color;
    ctx.fillRect(this.width / -2, this.height / -2, this.width, this.height);
    ctx.restore();
  }
}

function updateGameArea() {
  myGameArea.clear();
  myGamePiece.angle += 1 * Math.PI / 180;
  myGamePiece.update();
}
Спробуйте самі »