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

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

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

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ спрайты Ρ‡ΡƒΡ‚ΡŒ ΡˆΠΈΡ€Π΅ ΡˆΠΈΡ€ΠΈΠ½Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΠ³Ρ€ΠΎΠΊΠ° – 24 пиксСля вмСсто 16, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π»ΠΎ мСсто для Ρ€ΡƒΠΊ ΠΈ Π½ΠΎΠ³, ΠΌΠ΅Ρ‚ΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρƒ x ΠΈ ΡˆΠΈΡ€ΠΈΠ½Ρƒ Π½Π° Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ число (playerXOverlap).

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

playerSprites.src = "img/player.png";

var playerXOverlap = 4;


CanvasDisplay.prototype.drawPlayer = function(x, y, width,

                                              height) {

  var sprite = 8, player = this.level.player;

  width += playerXOverlap * 2;

  x -= playerXOverlap;

  if (player.speed.x != 0)

    this.flipPlayer = player.speed.x < 0;


  if (player.speed.y != 0)

    sprite = 9;

  else if (player.speed.x != 0)

    sprite = Math.floor(this.animationTime * 12) % 8;


  this.cx.save();

  if (this.flipPlayer)

    flipHorizontally(this.cx, x + width / 2);


  this.cx.drawImage(playerSprites,

                    sprite * width, 0, width, height,

                    x,              y, width, height);


  this.cx.restore();

};

ΠœΠ΅Ρ‚ΠΎΠ΄ drawPlayer вызываСтся Ρ‡Π΅Ρ€Π΅Π· drawActors, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ рисуСт всСх Π°ΠΊΡ‚Ρ‘Ρ€ΠΎΠ² Π² ΠΈΠ³Ρ€Π΅.

CanvasDisplay.prototype.drawActors = function() {

  this.level.actors.forEach(function(actor) {

    var width = actor.size.x * scale;

    var height = actor.size.y * scale;

    var x = (actor.pos.x - this.viewport.left) * scale;

    var y = (actor.pos.y - this.viewport.top) * scale;

    if (actor.type == "player") {

      this.drawPlayer(x, y, width, height);

    } else {

      var tileX = (actor.type == "coin" ? 2 : 1) * scale;

      this.cx.drawImage(otherSprites,

                        tileX, 0, width, height,

                        x,     y, width, height);

    }

  }, this);

};

ΠŸΡ€ΠΈ отрисовкС Ρ‡Π΅Π³ΠΎ-Π»ΠΈΠ±ΠΎ ΠΊΡ€ΠΎΠΌΠ΅ ΠΈΠ³Ρ€ΠΎΠΊΠ° ΠΌΡ‹ смотрим Π½Π° Π΅Π³ΠΎ Ρ‚ΠΈΠΏ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ смСщСниС для Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ спрайта. Π›Π°Π²Π° находится ΠΏΠΎ ΡΠΌΠ΅Ρ‰Π΅Π½ΠΈΡŽ 20, ΠΌΠΎΠ½Π΅Ρ‚Π° – 40.

НуТно Π²Ρ‹Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΎΠΊΠ½Π° просмотра ΠΏΡ€ΠΈ подсчётС ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Π°ΠΊΡ‚Ρ‘Ρ€Π°, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ‚ΠΎΡ‡ΠΊΠ° (0, 0) нашСго холста соотвСтствуСт Π»Π΅Π²ΠΎΠΉ Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠ΅ ΠΎΠΊΠ½Π° просмотра, Π° Π½Π΅ Π»Π΅Π²ΠΎΠΉ Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠ΅ уровня. Π•Ρ‰Ρ‘ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для этой Ρ†Π΅Π»ΠΈ translate.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ малСнький Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ display Π² runGame:

<body>

  <script>

    runGame(GAME_LEVELS, CanvasDisplay);

  </script>

</body>

Π’Ρ‹Π±ΠΎΡ€ графичСского интСрфСйса

Когда Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π³Ρ€Π°Ρ„ΠΈΠΊΡƒ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅, Ρƒ вас Π΅ΡΡ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€ – HTML, SVG ΠΈ холст. НС сущСствуСт идСального ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° для всСх ситуаций. Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Π΅ΡΡ‚ΡŒ ΠΏΠ»ΡŽΡΡ‹ ΠΈ минусы.

Чистый HTML прост. Он Ρ…ΠΎΡ€ΠΎΡˆΠΎ сочСтаСтся с тСкстом. SVG ΠΈ холст ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ тСкст, Π½ΠΎ Π½Π΅ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ Π² Π΅Π³ΠΎ располоТСнии ΠΈ Π½Π΅ Π΄Π΅Π»Π°ΡŽΡ‚ пСрСносов, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠΉ Π»ΠΈΠ½ΠΈΠΈ. Π’ HTML просто Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈ тСкста.

SVG ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для создания Ρ‡Ρ‘Ρ‚ΠΊΠΎΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ, которая выглядит Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΡ€ΠΈ любом ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠΈ. Он слоТнСС ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ HTML, Π½ΠΎ ΠΈ Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΌΠΎΡ‰Π½Π΅Π΅.

SVG ΠΈ HTML строят структуру Π΄Π°Π½Π½Ρ‹Ρ… (DOM), которая прСдставляСт ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ. Π­Ρ‚ΠΎ позволяСт ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ элСмСнты послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ нарисованы. Если Π²Π°ΠΌ Π½Π°Π΄ΠΎ пСриодичСски ΠΌΠ΅Π½ΡΡ‚ΡŒ Π½Π΅Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ большой ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ Π² ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° дСйствия ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈΠ»ΠΈ Π² качСствС Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ, Π½Π° холстС это Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ Π·Π°Ρ‚Ρ€Π°Ρ‚Π½ΠΎ. DOM позволяСт Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ событий ΠΌΡ‹ΡˆΠΈ Π½Π° любом элСмСнтС ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ (Π΄Π°ΠΆΠ΅ Π½Π° Ρ„ΠΎΡ€ΠΌΠ°Ρ…, нарисованных Ρ‡Π΅Ρ€Π΅Π· SVG). Π‘ холстом это Π½Π΅ ΠΏΡ€ΠΎΠΉΠ΄Ρ‘Ρ‚.

Но ΠΏΠΈΠΊΡΠ΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ холста ΠΈΠΌΠ΅Π΅Ρ‚ прСимущСство ΠΏΡ€ΠΈ рисовании большого количСства Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… элСмСнтов. Он Π½Π΅ строит структуру Π΄Π°Π½Π½Ρ‹Ρ…, Π° просто рисуСт Π½Π° Ρ‚ΠΎΠΉ ΠΆΠ΅ самой повСрхности пиксСли, Ρ‡Ρ‚ΠΎ сниТаСт Π·Π°Ρ‚Ρ€Π°Ρ‚Π½ΠΎΡΡ‚ΡŒ Π² пСрСсчётС Π½Π° Ρ„ΠΎΡ€ΠΌΡ‹.

Π•ΡΡ‚ΡŒ Π΅Ρ‰Ρ‘ Ρ„Π°ΠΊΡ‚ΠΎΡ€Ρ‹, Ρ‚ΠΈΠΏΠ° создания сцСны попиксСльно (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ использовании трассировки Π»ΡƒΡ‡Π΅ΠΉ) ΠΈΠ»ΠΈ постобработка ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ Π² JavaScript (Ρ€Π°Π·ΠΌΡ‹Ρ‚ΠΈΠ΅ ΠΈΠ»ΠΈ искаТСниС), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ попиксСльного рисования.

Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эти Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ. НапримСр, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π³Ρ€Π°Ρ„ Ρ‡Π΅Ρ€Π΅Π· SVG ΠΈΠ»ΠΈ холст, Π° Ρ‚Π΅ΠΊΡΡ‚ΠΎΠ²ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ, позиционируя элСмСнты HTML ΠΏΠΎΠ²Π΅Ρ€Ρ… ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ.

Для Π½Π΅ΠΏΡ€ΠΈΠ²Π΅Ρ€Π΅Π΄Π»ΠΈΠ²Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π΅Π²Π°ΠΆΠ½ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ интСрфСйс. ДисплСй, построСнный Π½Π°ΠΌΠΈ для нашСй ΠΈΠ³Ρ€Ρ‹, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹ΠΌ ΠΈΠ· Ρ‚Ρ€Ρ‘Ρ… графичСских способов, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ Π½Π΅ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ тСкст ΠΈ Π½Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ наТатия ΠΌΡ‹ΡˆΠΈ, ΠΈ Π½Π΅ обслуТиваСт ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ΅ количСство элСмСнтов.

Π˜Ρ‚ΠΎΠ³

Π’ этой Π³Π»Π°Π²Π΅ ΠΌΡ‹ обсудили Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ рисования Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅, ΡΠΊΠΎΠ½Ρ†Π΅Π½Ρ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Π²ΡˆΠΈΡΡŒ Π½Π° элСмСнтС <canvas>.

Π£Π·Π΅Π» холста прСдставляСт ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°, Π³Π΄Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ. Π­Ρ‚ΠΎ дСлаСтся Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ context, создаваСмый ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ getContext. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ рисования позволяСт Π·Π°ΠΊΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ ΠΈ ΠΎΠ±Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΡ‹. Бвойство fillStyle Π·Π°Π΄Π°Ρ‘Ρ‚ Π·Π°Π»ΠΈΠ²ΠΊΡƒ Ρ„ΠΎΡ€ΠΌ. Бвойства strokeStyle ΠΈ lineWidth ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ Ρ€ΠΈΡΡƒΡŽΡ‚ΡΡ Π»ΠΈΠ½ΠΈΠΈ.

ΠŸΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΈ ΠΈ куски тСкста ΠΌΠΎΠΆΠ½ΠΎ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΈΠΌ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ fillRect ΠΈ strokeRect Ρ€ΠΈΡΡƒΡŽΡ‚ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΈ, Π° fillText ΠΈ strokeText выводят тСкст. Для создания ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… Ρ„ΠΎΡ€ΠΌ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΡƒΡ‚ΠΈ.

Π’Ρ‹Π·ΠΎΠ² beginPath Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΠΏΡƒΡ‚ΡŒ. НСсколько ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ Π»ΠΈΠ½ΠΈΠΈ ΠΈ ΠΊΡ€ΠΈΠ²Ρ‹Π΅ ΠΊ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌΡƒ ΠΏΡƒΡ‚ΠΈ. НапримСр, lineTo добавляСт ΠΏΡ€ΡΠΌΡƒΡŽ. Когда ΠΏΡƒΡ‚ΡŒ Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ fill ΠΈΠ»ΠΈ обвСсти ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ stroke.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ пиксСлСй с ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ холста Π½Π° наш дСлаСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ drawImage. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΎΠ½ рисуСт всю ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ, Π½ΠΎ с большим количСством ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹ΠΉ участок изобраТСния. Π’ нашСй ΠΈΠ³Ρ€Π΅ ΠΌΡ‹ использовали эту Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, копируя Ρ€Π°Π·Π½Ρ‹Π΅ ΠΏΠΎΠ·Ρ‹ ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ³ΠΎ пСрсонаТа ΠΈΠ· частСй ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Π²ΡˆΠ΅ΠΉ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ·.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ, ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ. Π”Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΉ контСкст Ρ…Ρ€Π°Π½ΠΈΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ translate, scale ΠΈ rotate. Π­Ρ‚ΠΎ повлияСт Π½Π° всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ рисования. Π’Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ save ΠΈ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ restore.

ΠŸΡ€ΠΈ рисовании Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΉ Π½Π° холстС ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ clearRect для очистки частСй холста ΠΏΠ΅Ρ€Π΅Π΄ пСрСрисовкой.

УпраТнСния

Π€ΠΎΡ€ΠΌΡ‹

ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Ρ€ΠΈΡΡƒΡŽΡ‰ΡƒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹:

1 Ρ‚Ρ€Π°ΠΏΠ΅Ρ†ΠΈΡŽ

2 ΠΊΡ€Π°ΡΠ½Ρ‹ΠΉ Ρ€ΠΎΠΌΠ±

3 Π·ΠΈΠ³Π·Π°Π³

4 ΡΠΏΠΈΡ€Π°Π»ΡŒ ΠΈΠ· 100 ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΎΠ²

5 ΠΆΡ‘Π»Ρ‚ΡƒΡŽ Π·Π²Π΅Π·Π΄Ρƒ



Рисуя Π΄Π²Π΅ послСдних, ΠΊΠΎΠ½ΡΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ΡΡŒ с описаниями Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Math.cos ΠΈ Math.sin ΠΈΠ· Π³Π»Π°Π²Ρ‹ 13, которая описываСт ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ Π½Π° ΠΊΡ€ΡƒΠ³Π΅ с ΠΈΡ… использованиСм.

Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. ΠŸΠ΅Ρ€Π΅Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ свойства, Ρ‚ΠΈΠΏΠ° Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, количСства Ρ‚ΠΎΡ‡Π΅ΠΊ. Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ со вписываниСм Π½ΡƒΠΆΠ½Ρ‹Ρ… чисСл прямо Π² ΠΊΠΎΠ΄ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ‚Ρ€ΡƒΠ΄Π½Π΅Π΅ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ.

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

<script>

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


  // Π’Π°Ρˆ ΠΊΠΎΠ΄

</script>

ΠšΡ€ΡƒΠ³ΠΎΠ²Π°Ρ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ°

Π Π°Π½Π΅Π΅ ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ для рисования ΠΊΡ€ΡƒΠ³ΠΎΠ²ΠΎΠΉ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹. ΠŸΠΎΠΌΠ΅Π½ΡΠΉΡ‚Π΅ Π΅Ρ‘, Ρ‡Ρ‚ΠΎΠ±Ρ‹ имя ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ рядом с куском, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅Ρ‘ прСдставляСт. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΠΎΡ‚Ρ‹ΡΠΊΠ°Ρ‚ΡŒ симпатичный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ автоматичСского позиционирования тСкста, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π» ΠΈ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… Π½Π°Π±ΠΎΡ€Π°Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. МоТно ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½Π΅Ρ‚ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ мСньшС 5% (Ρ‡Ρ‚ΠΎΠ±Ρ‹ тСкст Π½Π΅ громоздился Π΄Ρ€ΡƒΠ³ Π½Π° Π΄Ρ€ΡƒΠ³Π°).

Π’Π°ΠΌ снова ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Math.sin ΠΈ Math.cos.

<canvas width="600" height="300"></canvas>

<script>

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

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

    return sum + choice.count;

  }, 0);


  var currentAngle = -0.5 * Math.PI;

  var centerX = 300, centerY = 150;

  // Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΊΠΎΠ΄ для Π²Ρ‹Π²ΠΎΠ΄Π° ΠΌΠ΅Ρ‚ΠΎΠΊ

  results.forEach(function(result) {

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

    cx.beginPath();

    cx.arc(centerX, centerY, 100,

           currentAngle, currentAngle + sliceAngle);

    currentAngle += sliceAngle;

    cx.lineTo(centerX, centerY);

    cx.fillStyle = result.color;

    cx.fill();

  });

</script>

ΠŸΡ€Ρ‹Π³Π°ΡŽΡ‰ΠΈΠΉ мячик

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ‚Π΅Ρ…Π½ΠΈΠΊΡƒ requestAnimationFrame ΠΈΠ· Π³Π»Π°Π² 13 ΠΈ 15 для рисования ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° с ΠΏΡ€Ρ‹Π³Π°ΡŽΡ‰ΠΈΠΌ Π²Π½ΡƒΡ‚Ρ€ΠΈ мячом. ΠœΡΡ‡ двигаСтся с постоянной ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ ΠΈ отскакиваСт ΠΎΡ‚ сторон ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° ΠΏΡ€ΠΈ соударСнии.

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

<script>

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


  var lastTime = null;

  function frame(time) {

    if (lastTime != null)

      updateAnimation(Math.min(100, time - lastTime) / 1000);

    lastTime = time;

    requestAnimationFrame(frame);