Гузариш ба мундариҷа
Мавзӯи 1 аз 5
Назария

Ҳолст ва шаклҳо

Ҳолст — расм аз пикселҳо

Барои бозиҳо дар браузер элементи <canvas> ҳаст — росткунҷаи пикселҳо, ки дар он аз JavaScript расм мекашанд. Баръакси элементҳои оддии саҳифа, дар ҳолст «объектҳо» нестанд: росткунҷа кашидед — ва ин танҳо пикселҳои рангкардашуда аст. Барои ҳаракат додани чизе кадрро пок мекунанд ва аз нав мекашанд. Қариб ҳамаи бозиҳои 2D маҳз ҳамин тавр кор мекунанд.

<canvas id="game" width="400" height="300"></canvas>

Андозаи ҳолстро бо атрибутҳои width ва height медиҳанд — ин андоза дар пикселҳо аст. (Агар ҳолстро бо CSS кашол диҳед, расм танҳо миқёс мешавад ва хира мегардад.)

Контексти расмкашӣ

На дар худи элемент, балки тавассути контексти он расм мекашанд — объекте бо ҳамаи фармонҳои расмкашӣ:

const canvas = document.querySelector("#game");
const ctx = canvas.getContext("2d");

ctx — номи кӯтоҳ ва умумиқабул. Минбаъд ҳамаи фармонҳо аз он даъват мешаванд.

Координатаҳо

Ибтидои координатаҳо (0, 0) — кунҷи чапи болоии ҳолст. x ба рост меафзояд, y — ба поён (на ба боло, мисли математикаи мактабӣ!). Пиксели рости поёнии ҳолсти 400×300 — (399, 299).

(0,0) ──────────► x
  │
  │      • (100, 50)
  ▼
  y

Росткунҷаҳо ва ранг

ctx.fillStyle = "orange";           // ранги пуркунӣ барои шаклҳои оянда
ctx.fillRect(20, 30, 120, 80);      // x, y, паҳно, баландӣ — пуррангшуда

ctx.strokeStyle = "#1e88e5";        // ранги хатҳо
ctx.lineWidth = 4;                  // ғафсии хатҳо
ctx.strokeRect(200, 30, 120, 80);   // танҳо чорчӯба

ctx.clearRect(0, 0, canvas.width, canvas.height);   // ҳамаро пок кардан (пикселҳои шаффоф)

Рангро мисли CSS додан мумкин аст: ном "red", "#ff0000", "rgb(255, 0, 0)", бо шаффофӣ "rgba(0, 0, 0, 0.5)". fillStyle ба ҳамаи шаклҳои минбаъда таъсир мекунад, то онро иваз накунанд — фаромӯш кардед рангро иваз кунед, ва ҳама чиз бо ранги пешина кашида мешавад.

Хатҳо ва роҳҳо

Шаклҳои мураккабро бо роҳ (path) мекашанд: роҳро сар мекунанд, «қалам»-ро мебаранд, баъд гирдогирд мекашанд ё пур мекунанд:

ctx.beginPath();
ctx.moveTo(50, 250);     // қаламро гузоштан, бе кашидан
ctx.lineTo(150, 150);    // хат кашидан
ctx.lineTo(250, 250);
ctx.closePath();         // ба аввал пайваст кардан — секунҷа шуд
ctx.fillStyle = "green";
ctx.fill();              // пур кардан
ctx.stroke();            // ва гирдогирд кашидан

beginPath() муҳим аст: бе он шакли нав ба роҳи кӯҳна «мечаспад», ва ҳангоми fill() ҳама чиз якбора аз нав ранг мешавад.

Доираҳо

Доира — ин камони arc(x, y, радиус, кунҷиИбтидоӣ, кунҷиНиҳоӣ) аст. Кунҷҳо дар радианҳо: доираи пурра — Math.PI * 2.

ctx.beginPath();
ctx.arc(300, 200, 40, 0, Math.PI * 2);
ctx.fillStyle = "gold";
ctx.fill();

Дар доира x, y — ин марказ аст, дар росткунҷа бошад — кунҷи чапи болоӣ. Ин дар бархӯрдҳо бисёр ошуфтагӣ меорад, баъдтар ба он бармегардем.

Матн

ctx.font = "24px sans-serif";
ctx.fillStyle = "black";
ctx.fillText("Хол: 120", 10, 30);     // x, y — канори чапи хати асосии матн
ctx.textAlign = "center";             // акнун x — миёнаи матн
ctx.fillText("GAME OVER", canvas.width / 2, 150);

Тартиб муҳим аст

Ҳолст мисли коғаз аст: он чи баъдтар кашида шудааст, кашидашудаи пештараро мепӯшонад. Бинобар ин ҳар кадри бозиро аз дур ба наздик мекашанд: замина → объектҳо → интерфейс (хол, ҷонҳо).

Санҷиши ранги пиксел

Ранги пикселро тавассути getImageData фаҳмидан мумкин аст: он массиви [сурх, сабз, кабуд, шаффофӣ]-ро бармегардонад, ҳар кадом аз 0 то 255. Масъалаҳои ин курс ҳамин тавр санҷида мешаванд:

const [r, g, b, a] = ctx.getImageData(100, 70, 1, 1).data;
console.log(r, g, b, a);   // 255 0 0 255 — сурхи ношаффоф

Пиксели шаффоф (ҳанӯз ранг накардашуда) — 0 0 0 0.

Хулоса

  • canvas.getContext("2d") — контекст бо фармонҳои расмкашӣ.
  • (0, 0) — кунҷи чапи болоӣ, y ба поён меафзояд.
  • fillStyle + fillRect, strokeStyle + strokeRect, clearRect — пок кардан.
  • Роҳҳо: beginPath → moveTo / lineTo / arc → fill / stroke.
  • Он чи баъдтар кашида шуд, дар боло мехобад; кадри бозӣ — пок кардан ва ҳамаро аз нав кашидан.

Росткунҷаи сурх

Осон+10 XP

Дар ҳолсти #game росткунҷаи сурхи пуррангшуда кашед: кунҷи чапи болоӣ дар нуқтаи (50, 40), паҳно 100, баландӣ 60. Ранг — "red".

(50, 40) ┌──────────┐
         │   red    │ 60
         └──────────┘
             100

Барои ҳал кардани масъалаҳо коннекторро пайваст кун

Коди масъалаҳо дар компютери худат иҷро мешавад — ин аз браузер тезтар ва боэътимодтар аст. Барои ин барномаи ройгони коннектори CodeWithMe лозим аст. Онро як бор пайваст кардан кифоя аст.

Коннекторро дар ин компютер ҷустуҷӯ мекунем…

  1. 1
    Коннекторро барои системаи худ (Windows, macOS ё Linux) зеркашӣ кун.Зеркашии коннекторДар саҳифаи зеркашӣ файлеро интихоб кун, ки дар номаш системаи ту ҳаст, масалан windows-amd64.
  2. 2Онро иҷро кун ва ҷузвдонеро интихоб кун, ки ҳалҳоят дар он ҷо меистанд. Python ва Node.js-ро ӯ худаш ҳангоми зарурат ба он ҷо мегузорад.
  3. 3
    Дар поён рамзи 6-рақамаро ворид кун — он дар равзанаи коннектор навишта шудааст («Рамз барои сайти CodeWithMe»). Агар браузер дар бораи дастрасӣ ба шабакаи маҳаллӣ пурсад — иҷозат деҳ.

Коннектор кушода аст (рамзи манбаъ дар GitHub), танҳо дар компютери ту кор мекунад ва кодро танҳо пас аз ворид кардани рамзи пайвастшавӣ иҷро мекунад.