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

Идоракунӣ

Ду усули гӯш кардани клавиатура

Дар мавзӯи гузаштаи DOM мо ба keydown дарҳол ҷавоб медодем: тирчаро пахш кардед — тӯбча як катак ҷаҳид. Барои бозӣ ин бад аст: ҳангоми нигоҳ доштани тугма keydown бо таъхир такрор мешавад (мисли ҳарфҳо дар майдони матн), ва ҳаракат ҷаҳиш-ҷаҳиш мешавад. Ду тугмаро якбора (рост + ҷаҳиш) ҳамин тавр умуман дошта намешавад.

Бинобар ин дар бозиҳо ҳодисаҳои клавиатура танҳо дар хотир медоранд, ки кадом тугмаҳо ҳоло пахшанд, давраи бозӣ бошад дар ҳар кадр ба ин менигарад ва қаҳрамонро ҳамвор ҳаракат медиҳад.

Маҷмӯи тугмаҳои пахшшуда

Set — коллексия бе такрор бо add, delete ва has-и тез. Комилан мувофиқ аст:

const keys = new Set();

document.addEventListener("keydown", (e) => keys.add(e.key));
document.addEventListener("keyup", (e) => keys.delete(e.key));

// дар update:
if (keys.has("ArrowLeft")) player.x -= 200 * dt;
if (keys.has("ArrowRight")) player.x += 200 * dt;

keydown-ҳои такрорӣ ҳангоми нигоҳ доштан халал намерасонанд: ба Set илова кардани он чи аллакай ҳаст — ҳеҷ чизро иваз намекунад.

Тирчаҳо ва фосила бо пешфарз саҳифаро варақ мезананд. Барои он ки ин ҳангоми бозӣ нашавад:

document.addEventListener("keydown", (e) => {
  keys.add(e.key);
  if (e.key.startsWith("Arrow") || e.key === " ") e.preventDefault();
});

Боз як майдачиз: агар равзана бо тугмаи пахшшуда фокусро гум кунад, keyup намеояд, ва қаҳрамон худ ба худ медавад. Ҳамин тавр ислоҳ мешавад: window.addEventListener("blur", () => keys.clear());.

Самт ва суръат

Қулай аст, ки аввал самт-ро −1, 0 ё 1 ҳисоб кунем, баъд ба суръат зарб занем:

let dx = 0;
if (keys.has("ArrowLeft")) dx -= 1;
if (keys.has("ArrowRight")) dx += 1;   // ҳарду пахш → 0, меистем
player.x += dx * SPEED * dt;

Агар аз рӯи диагонал ҳаракат кунем, тезтар мешавад (√2 ≈ 1.41 маротиба), чунки ду ҳаракат ҷамъ мешаванд. Дар аркадаҳо инро аксар вақт мебахшанд, дар бозиҳои дақиқ бошад самтро нормал мекунанд — dx ва dy-ро ба дарозии вектор тақсим мекунанд.

Аз канор нагузаштан

Барои он ки қаҳрамон аз экран нагурезад, координатаи онро байни ҳадди ақал ва ҳадди аксар фишор медиҳанд:

const clamp = (v, min, max) => Math.max(min, Math.min(max, v));

player.x = clamp(player.x, 0, canvas.width - player.w);
player.y = clamp(player.y, 0, canvas.height - player.h);

Ҳадди аксар — паҳнои ҳолст − паҳнои қаҳрамон, чунки x — канори чап аст, канори рости қаҳрамон бошад w пиксел дуртар.

Ҷаҳиш

Ҷаҳиш — ин суръати фаврӣ ба боло (vy-и манфӣ, зеро y ба поён меафзояд), ки баъд онро ҷозиба хомӯш мекунад:

if (keys.has(" ") && player.onGround) {
  player.vy = -400;
  player.onGround = false;
}
player.vy += GRAVITY * dt;
player.y += player.vy * dt;

if (player.y >= GROUND) {      // ба замин афтод
  player.y = GROUND;
  player.vy = 0;
  player.onGround = true;
}

Парчами onGround ҷаҳиданро дар ҳаво манъ мекунад. Баландии ҷаҳиш аз суръати ибтидоӣ ва ҷозиба вобаста аст: ҷозиба зиёдтар — ҷаҳиш пасттар ва «вазнинтар». Интихоби ин ададҳо — қисми геймдизайн аст.

Муш

Муш дар ҳолст ҳамин тавр, тавассути ҳодисаҳо кор мекунад. Танҳо координатаҳои муш — нисбат ба равзана, ба мо бошад координатаҳо дар дохили ҳолст лозиманд:

canvas.addEventListener("click", (e) => {
  const rect = canvas.getBoundingClientRect();
  const x = e.clientX - rect.left;
  const y = e.clientY - rect.top;
  console.log("клик дар нуқтаи ҳолст", x, y);
});

Хулоса

  • Ҳодисаҳои клавиатура танҳо ҳолатро сабт мекунанд: keys.add / keys.delete; қарорҳо — дар update.
  • preventDefault() барои тирчаҳо ва фосила, keys.clear() ҳангоми гум шудани фокус.
  • Самти −1/0/1 × суръат × dt; координатаҳоро бо Math.max / Math.min фишор медиҳем.
  • Ҷаҳиш: vy-и манфӣ + ҷозиба + парчами onGround.

Кадом тугмаҳо пахшанд

Осон+10 XP

Маҷмӯи keys (new Set()) эълон кунед ва онро нигоҳ доред: ҳангоми keydown дар document ба он e.key-ро илова кунед, ҳангоми keyup — хориҷ кунед. Функсияи isDown(key)-ро нависед, ки ҷавоб медиҳад, оё тугма ҳоло пахш аст.

пахш карданд →    isDown("ArrowRight") → true
раҳо карданд →    isDown("ArrowRight") → false

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

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

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

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

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