Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π’Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ JavaScriptΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 57

Автор ΠœΠ°Ρ€Π΅ΠΉΠ½ Π₯Π°Π²Π΅Ρ€Π±Π΅ΠΊΠ΅

<canvas width="200" height="200"></canvas>

<script>

  var cx = document.querySelector("canvas").getContext("2d");

  var total = results.reduce(function(sum, choice) {

    return sum + choice.count;

  }, 0);

  // Start at the top

  var currentAngle = -0.5 * Math.PI;

  results.forEach(function(result) {

    var sliceAngle = (result.count / total) * 2 * Math.PI;

    cx.beginPath();

    // center=100,100, radius=100

    // from current angle, clockwise by slice's angle

    cx.arc(100, 100, 100,

           currentAngle, currentAngle + sliceAngle);

    currentAngle += sliceAngle;

    cx.lineTo(100, 100);

    cx.fillStyle = result.color;

    cx.fill();

  });

</script>

Но Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ значСния сСкторов – это Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ. Нам Π½Π°Π΄ΠΎ ΠΊΠ°ΠΊ-Ρ‚ΠΎ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π½Π° холстС тСкст.

ВСкст

Π£ контСкста Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ холста Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ fillText ΠΈ strokeText. ПослСдний ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΎΠ±Π²Π΅Π΄Ρ‘Π½Π½Ρ‹Ρ… Π±ΡƒΠΊΠ², Π½ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ fillText. Он заполняСт Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ тСкст Ρ†Π²Π΅Ρ‚ΠΎΠΌ fillColor.

<canvas></canvas>

<script>

  var cx = document.querySelector("canvas").getContext("2d");

  cx.font = "28px Georgia";

  cx.fillStyle = "fuchsia";

  cx.fillText("Π― ΠΈ тСкст ΠΌΠΎΠ³Ρƒ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ!", 10, 50);

</script>

МоТно Π·Π°Π΄Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€, ΡΡ‚ΠΈΠ»ΡŒ ΠΈ ΡˆΡ€ΠΈΡ„Ρ‚ тСкста Ρ‡Π΅Ρ€Π΅Π· свойство font. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ задаётся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ ΡˆΡ€ΠΈΡ„Ρ‚. МоТно Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½Π°ΠΊΠ»ΠΎΠ½ ΠΈ ΠΆΠΈΡ€Π½ΠΎΡΡ‚ΡŒ Π² Π½Π°Ρ‡Π°Π»Π΅ строки.

Π”Π²Π° послСдних Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° fillText (ΠΈ strokeText) Π·Π°Π΄Π°ΡŽΡ‚ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ начинаСтся тСкст. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ это Π½Π°Ρ‡Π°Π»ΠΎ Π»ΠΈΠ½ΠΈΠΈ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ «стоят» Π±ΡƒΠΊΠ²Ρ‹ – Π½Π΅ считая ΡΠ²ΠΈΡΠ°ΡŽΡ‰ΠΈΡ… частСй Π±ΡƒΠΊΠ² Ρ‚ΠΈΠΏΠ° Ρ€ ΠΈ Ρƒ. МоТно ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΏΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ, задавая свойству textAlign значСния "end" ΠΈΠ»ΠΈ "center", Π° ΠΏΠΎ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ – задавая textBaseline "top", "middle", ΠΈΠ»ΠΈ "bottom".

Π’ ΠΊΠΎΠ½Ρ†Π΅ Π³Π»Π°Π²Ρ‹ ΠΌΡ‹ вСрнёмся ΠΊ нашСй Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ΅.

Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ

Π’ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊΠ΅ проводится Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Π΅ΠΊΡ‚ΠΎΡ€Π½ΠΎΠΉ ΠΈ растровой Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠΉ. ΠŸΠ΅Ρ€Π²Π°Ρ – Ρ‚ΠΎ, Ρ‡Π΅ΠΌ ΠΌΡ‹ занимались Π² этой Π³Π»Π°Π²Π΅, рисованиС ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ логичСских описаний Ρ„ΠΎΡ€ΠΌ. Вторая – Π½Π΅ Π·Π°Π΄Π°Ρ‘Ρ‚ Ρ„ΠΎΡ€ΠΌΡ‹, Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ пиксСлСй.

ΠœΠ΅Ρ‚ΠΎΠ΄ drawImage позволяСт Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π° холст ΠΏΠΈΠΊΡΠ΅Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅. Они ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ взяты ΠΈΠ· элСмСнта <img> ΠΈΠ»ΠΈ с Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ холста, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π²ΠΈΠ΄Π½Ρ‹ Π² самом Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ создаёт элСмСнт <img> ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π² Π½Π΅Π³ΠΎ Ρ„Π°ΠΉΠ» изобраТСния. Но ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ сразу Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ этой ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ ΠΌΠΎΠ³ Π½Π΅ ΡƒΡΠΏΠ΅Ρ‚ΡŒ Π΅Ρ‘ ΠΏΠΎΠ΄Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ. Для этого ΠΌΡ‹ рСгистрируСм ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ события β€œload” ΠΈ рисуСм послС Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ.

<canvas></canvas>

<script>

  var cx = document.querySelector("canvas").getContext("2d");

  var img = document.createElement("img");

  img.src = "img/hat.png";

  img.addEventListener("load", function() {

    for (var x = 10; x < 200; x += 30)

      cx.drawImage(img, x, 10);

  });

</script>

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ drawImage нарисуСт ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°. Π•ΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Π΄Π²Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° для измСнСния ΡˆΠΈΡ€ΠΈΠ½Ρ‹ ΠΈ высоты.

Когда drawImage Π·Π°Π΄Π°Π½ΠΎ Π΄Π΅Π²ΡΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Π΅Ρ‘ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для рисования части изобраТСния. Π‘ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΠΎ пятый Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ (x, y, ΡˆΠΈΡ€ΠΈΠ½Π° ΠΈ высота) Π² исходной ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°Π΄ΠΎ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π‘ ΡˆΠ΅ΡΡ‚ΠΎΠ³ΠΎ ΠΏΠΎ дСвятый – ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ Π½Π° холстС, ΠΊΡƒΠ΄Π° Π΅Π³ΠΎ Π½Π°Π΄ΠΎ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ нСсколько спрайтов (элСмСнтов ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ ΠΈΠ»ΠΈ ΠΊΠ°Π΄Ρ€ΠΎΠ² Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ) Π² ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ» изобраТСния, ΠΈ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΡƒΠΆΠ½Ρ‹Π΅ Π΅Π³ΠΎ части. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π΅ΡΡ‚ΡŒ Ρƒ нас ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ³ΠΎ пСрсонаТа Π² Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΠΎΠ·Π°Ρ…:



ΠŸΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Ρ ΠΏΠΎΠ·Ρ‹, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ вывСсти Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ ΠΈΠ΄ΡƒΡ‰Π΅Π³ΠΎ пСрсонаТа.

Для Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ Π½Π° холстС пригодится ΠΌΠ΅Ρ‚ΠΎΠ΄ clearRect. Он Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ fillRect, Π½ΠΎ вмСсто окраски ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° ΠΎΠ½ Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΌ, удаляя ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ пиксСли.

ΠœΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ спрайт ΡˆΠΈΡ€ΠΈΠ½ΠΎΠΉ 24 ΠΈ высотой 30 пиксСлСй. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΈ Π·Π°Π΄Π°Ρ‘Ρ‚ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» для рисования ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠ°Π΄Ρ€ΠΎΠ²:

<canvas></canvas>

<script>

  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);

  });

</script>

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ cycle отслСТиваСт ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π² Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠ°Π΄Ρ€ ΠΎΠ½Π° увСличиваСтся ΠΈ ΠΏΠΎ Π΄ΠΎΡΡ‚ΠΈΠΆΠ΅Π½ΠΈΡŽ 7 Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ сначала, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ дСлСния с остатком. Она ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для подсчёта ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ x, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π² ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ находится спрайт с Π½ΡƒΠΆΠ½ΠΎΠΉ ΠΏΠΎΠ·ΠΎΠΉ.

ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΡ

А Ρ‡Ρ‚ΠΎ, Ссли Π½Π°ΠΌ Π½Π°Π΄ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ пСрсонаТ ΡˆΡ‘Π» Π²Π»Π΅Π²ΠΎ, Π° Π½Π΅ Π²ΠΏΡ€Π°Π²ΠΎ? ΠœΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ Π½Π°Π±ΠΎΡ€ спрайтов. Но ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ холсту, Ρ‡Ρ‚ΠΎΠ± ΠΎΠ½ рисовал ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π·Π΅Ρ€ΠΊΠ°Π»ΡŒΠ½ΠΎ.

Π’Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° scale ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ всС ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ рисунки Π±ΡƒΠ΄ΡƒΡ‚ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹. Он ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° – ΠΌΠ°ΡΡˆΡ‚Π°Π± ΠΏΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ ΠΈ ΠΏΠΎ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ.

<canvas></canvas>

<script>

  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();

</script>

ΠœΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ растягиваСт ΠΈΠ»ΠΈ сТимаСт всС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΡˆΠΈΡ€ΠΈΠ½Ρƒ Π»ΠΈΠ½ΠΈΠΈ ΠΏΠΎ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ. ΠœΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ с ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ ΠΏΠ΅Ρ€Π΅Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π·Π΅Ρ€ΠΊΠ°Π»ΡŒΠ½ΠΎ. ΠŸΠ΅Ρ€Π΅Π²ΠΎΡ€ΠΎΡ‚ происходит Π²ΠΎΠΊΡ€ΡƒΠ³ Ρ‚ΠΎΡ‡ΠΊΠΈ (0, 0), Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ систСмы ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ Ρ‚ΠΎΠΆΠ΅ помСняСтся. ΠŸΡ€ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±Π° -1, Ρ„ΠΎΡ€ΠΌΠ°, нарисованная Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ x = 100, Π±ΡƒΠ΄Π΅Ρ‚ нарисована Ρ‚Π°ΠΌ, Π³Π΄Π΅ Ρ€Π°Π½ΡŒΡˆΠ΅ Π±Ρ‹Π»Π° позиция -100.

Π—Π½Π°Ρ‡ΠΈΡ‚, для отзСркаливания ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ просто Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ cx.scale(-1, 1) ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ drawImage – наша ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΡƒΠ΅Π΄Π΅Ρ‚ с холста ΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΈΠ΄Π½Π°. МоТно Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠΎΠ΄ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ Π² drawImage, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠΌΠΏΠ΅Π½ΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ этот сдвиг. Π”Ρ€ΡƒΠ³ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ дСйствий, ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠ΄ рисования Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π·Π½Π°Π΅Ρ‚ ΠΏΡ€ΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ направлСния оси.

Π•ΡΡ‚ΡŒ нСсколько Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΊΡ€ΠΎΠΌΠ΅ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ, Π²Π»ΠΈΡΡŽΡ‰ΠΈΡ… Π½Π° ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π½ΡƒΡŽ систСму холста. НарисованныС Ρ„ΠΎΡ€ΠΌΡ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ rotate ΠΈ ΡΠ΄Π²ΠΈΠ³Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ translate. Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ, Ρ‡Ρ‚ΠΎ всС трансформации Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°ΡŽΡ‚ΡΡ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ каТдая ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ происходит ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ….

Π—Π½Π°Ρ‡ΠΈΡ‚, Ссли ΠΌΡ‹ Π΄Π²Π°ΠΆΠ΄Ρ‹ сдвинСм ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° 10 пиксСлСй ΠΏΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ, Ρ‚ΠΎ всё Π±ΡƒΠ΄Π΅Ρ‚ нарисовано Π½Π° 20 пиксСлСй ΠΏΡ€Π°Π²Π΅Π΅. Если ΠΌΡ‹ сначала сдвинСм Π½Π°Ρ‡Π°Π»ΠΎ отсчёта Π½Π° (50, 50), Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠ²Π΅Ρ€Π½Ρ‘ΠΌ всё Π½Π° 20 градусов (0,1Ο€ Ρ€Π°Π΄ΠΈΠ°Π½), ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚ Π²ΠΎΠΊΡ€ΡƒΠ³ Ρ‚ΠΎΡ‡ΠΊΠΈ (50, 50).



А Ссли ΠΌΡ‹ сначала ΠΏΠΎΠ²Π΅Ρ€Π½Ρ‘ΠΌ всё Π½Π° 20 градусов, Π° ΡƒΠΆΠ΅ Π·Π°Ρ‚Π΅ΠΌ сдвинСм Π½Π° (50, 50), Ρ‚ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ случится Π² ΠΏΠΎΠ²Ρ‘Ρ€Π½ΡƒΡ‚ΠΎΠΉ систСмС ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ ΠΈΠ½ΠΎΠΌΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ. ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Π·Π΅Ρ€ΠΊΠ°Π»ΠΈΡ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ Π½Π° Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ x, ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

function flipHorizontally(context, around) {

  context.translate(around, 0);

  context.scale(-1, 1);

  context.translate(-around, 0);

}

ΠœΡ‹ сдвигаСм ось Y Ρ‚ΡƒΠ΄Π°, Π³Π΄Π΅ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°ΡΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ нашС Π·Π΅Ρ€ΠΊΠ°Π»ΠΎ, ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΠΌ ΠΎΡ‚Π·Π΅Ρ€ΠΊΠ°Π»ΠΈΠ²Π°Π½ΠΈΠ΅, ΠΈ сдвигаСм ось Y ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π½Π° ΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‰Π΅Π΅ΡΡ мСсто Π² Π·Π΅Ρ€ΠΊΠ°Π»ΡŒΠ½ΠΎΠΉ всСлСнной. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ рисунок ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚, ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚:



Π’ΡƒΡ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ систСмы ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ Π΄ΠΎ ΠΈ послС отзСркаливания ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠΉ Π»ΠΈΠ½ΠΈΠΈ. Если ΠΌΡ‹ нарисуСм Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ Π² ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ полуплоскости ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Y, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π½Π° мСстС Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° 1. Π’Ρ‹Π·ΠΎΠ² flipHorizontally сначала сдвигаСт Π΅Π³ΠΎ Π²ΠΏΡ€Π°Π²ΠΎ, Π½Π° мСсто Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° 2. Π—Π°Ρ‚Π΅ΠΌ происходит ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, ΠΈ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ оказываСтся Π½Π° мСстС 3. Он Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ Ρ‚Π°ΠΌ, Ссли Π½Π°ΠΌ Π½Π°Π΄ΠΎ ΠΎΡ‚Π·Π΅Ρ€ΠΊΠ°Π»ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Π»ΠΈΠ½ΠΈΠΈ. Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π²Ρ‹Π·ΠΎΠ² translate исправляСт это – ΠΎΠ½ «отмСняСт» ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ сдвиг ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ 4.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π·Π΅Ρ€ΠΊΠ°Π»Π΅Π½Π½ΠΎΠ³ΠΎ пСрсонаТа Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ (100, 0), ΠΏΠ΅Ρ€Π΅Π²Π΅Ρ€Π½ΡƒΠ² ΠΌΠΈΡ€ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ изобраТСния пСрсонаТа.

<canvas></canvas>

<script>

  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() {

    flipHorizontally(cx, 100 + spriteW / 2);