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