›_ ebskola.lv
Datorika 9 · 4. tēma · 6 dubultstundas - funkcijas · notikumi · spēles cikls

Spēles dzinēja // izstrāde un funkcijas

Uzbūvē savu spēles dzinēju no nulles - notikumu klausītāji, requestAnimationFrame, DOM manipulācija un sadursmju noteikšana reālā laikā.

6 dubultstundas funkcijas · DOM 60fps spēles cikls projekts 4.6
funkcijas · atkārtošana addEventListener 60fps · rAF
# 01 stundas

6 dubultstundas - tēmas saturs

No funkcijām un notikumiem līdz pilnam spēles dzinēja prototipam.

kursa pārskats
# 02 špikeris

Spēles dzinēja špikeris

Funkcijas, notikumi, DOM, laika vadība un sadursmju formula.

1. Funkciju definēšana un izsaukšana

// Funkcija ar parametru un atgriešanas vērtību
function aprēķināt(a, b) {
  return a + b;
}
let rezultāts = aprēķināt(10, 5); // = 15

// Arrow funkcija (īsāks pieraksts)
const kustēt = (obj, dx) => obj.x += dx;
function – definē atkārtoti izmantojamu koda bloku.

parametri – mainīgie, ko padod funkcijai izsaucot.

return – atgriež vērtību no funkcijas.

Arrow => – īsāks funkcijas pieraksts ES6 stilā.

2. addEventListener - tastatūra un pele

// Tastatūras notikums
document.addEventListener("keydown", e => {
  if (e.key === "ArrowLeft")  x -= 5;
  if (e.key === "ArrowRight") x += 5;
  if (e.key === " ") lekt();
});

// Peles klikšķis
canvas.addEventListener("click", e => {
  console.log(e.clientX, e.clientY);
});
addEventListener – piereģistrē funkciju notikumam.

e.key – nospiestā taustiņa nosaukums ("ArrowLeft", " " utt.).

e.clientX/Y – peles koordinātes ekrānā.

"keydown" – notikums kad taustiņš nospiests.

3. DOM manipulācija

// Elementu atrašana un mainīšana
let punktiElem = document.getElementById("punkti");
punktiElem.innerHTML = "Punkti: " + p;
punktiElem.classList.add("aktīvs");
punktiElem.style.color = "orange";

// Jauna elementa izveide
let div = document.createElement("div");
document.body.appendChild(div);
getElementById() – atrod elementu pēc ID.

innerHTML – iestata HTML saturu.

classList.add/remove – pievieno/noņem CSS klasi.

createElement – izveido jaunu HTML elementu.

4. Spēles cikls ar requestAnimationFrame

// 60fps spēles cikls
function spelesCikls() {
  // 1. Nodzēst iepriekšējo kadru
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  // 2. Atjaunot stāvokli
  speletajs.x += atrums;
  // 3. Uzzīmēt visu
  zzimēt();
  // 4. Pieprasīt nākamo kadru
  requestAnimationFrame(spelesCikls);
}
spelesCikls(); // Palaiž ciklu
requestAnimationFrame – izsauc funkciju pirms nākamā ekrāna kadra (~60x/s).

ctx.clearRect – notīra canvas pirms uzzīmēšanas.

setInterval(fn, 16) – alternatīva, bet rAF ir labāka.

5. AABB sadursmju noteikšana

// Vienkārša taisnstūru sadursme
function saduras(a, b) {
  return (
    a.x < b.x + b.w &&
    a.x + a.w > b.x &&
    a.y < b.y + b.h &&
    a.y + a.h > b.y
  );
}
if (saduras(speletajs, skerslis)) {
  dzivibas--;
}
AABB – Axis-Aligned Bounding Box - visvienkāršākā sadursmju metode.

4 nosacījumi – pārbauda visas 4 puses overlap.

Lietošana – salīdzina spēlētāja un šķēršļa koordinātes katru kadru.
requestAnimationFrame(spelesCikls); // 60 kadri sekundē