Stundas uzdevums: Izstrādāt matemātisku algoritmu, kas reāllaikā pārbauda, vai divi spēles elementi (piemēram, spēlētājs un šķērslis) ekrānā pārklājas, un atbilstoši reaģēt.
2.6.1. Izstrādā komplicētas darbības un algoritmus; 5.2.1. Definē problēmas būtību un risina kompleksus izaicinājumus.70 min darba sadalījums: 1. uzdevums (~20 min) - atjauno teorijas piemēru vai minimālo prototipu; 2. uzdevums (~25 min) - pielieto to galvenajā uzdevumā; 3. uzdevums (~25 min) - pārbaudi rezultātu, izlabo kļūdas un tikai beigās pieraksti vienu secinājumu. Papildus/4. līmeņa uzdevums ir paredzēts tikai tad, ja pamatdarbs ir pabeigts.
Pirms sāc: izmanto iepriekš apgūto un šīs lapas teorijas/koda piemērus. Ja vajadzīga jauna komanda vai rīks, vispirms atrodi tās paraugu teorijas sadaļā.
Dators neskatās uz tavu uzzīmēto varoni kā uz cilvēku. Tas redz tikai kastes (taisnstūrus). Divas kastes saduras TIKAI TAD, ja vienlaicīgi izpildās četri nosacījumi:
getBoundingClientRect(), kas uzreiz iedod elementa X un Y koordinātas, kā arī tā platumu un augstumu, padarot šo matemātiku daudz vieglāku!
Šis ir īss iesildīšanās uzdevums. Nokopē sagatavi, ielīmē to pareizajā koda vietā un palaid. Šeit pietiek droši izmēģināt tēmu 4.5 Sadursmju noteikšanas (Collision detection) pamati; detalizētu izpratni veidosi nākamajos uzdevumos.
Kopējamais piemērs vai sagatave: izmanto šo bloku kā starta punktu, nevis kā gala risinājumu.
<section class="iesildisanas-demo">
<h2>4.5 Sadursmju noteikšanas (Collision detection) pamati</h2>
<p id="rezultats">Sākuma teksts</p>
<button id="poga">Pārbaudīt</button>
</section>
.iesildisanas-demo {
padding: 16px;
border: 2px solid #FFB142;
border-radius: 6px;
}
.iesildisanas-demo button {
cursor: pointer;
}
const rezultats = document.querySelector("#rezultats");
const poga = document.querySelector("#poga");
poga.addEventListener("click", () => {
rezultats.textContent = "Kods darbojas: 4.5 Sadursmju noteikšanas (Collision detection) pamati";
});
index.html, style.css un script.js.Pievieno šīs stundas paņēmienu kā nelielu, lietotājam redzamu projekta daļu.
script.js un pievieno sadursmju pārbaudes funkciju, kas izmanto getBoundingClientRect() uz spēlētāja un ienaidnieka elementiem.parbauditSadursmi() no spelesCikls() katru kadru.true, izsauc beigtSpeli().position: absolute.git commit -m "Add AABB collision detection".Pārbaudi, vai algoritms darbojas paredzami vairākās situācijās.
console.log(parbauditSadursmi()) un pārbaudi konsolē, ka true parādās tikai sadursmē.beigtSpeli() cikls ir apstājies un vairs netiek pārbaudītas sadursmes.getBoundingClientRect() izsaukumu laiku.background: red.Ja pamatdarbs ir pabeigts, paplašini projektu ar vienu nelielu programmētu uzlabojumu.
<div id="ienaidnieks2"> ar citu sākuma pozīciju laukumā.parbauditSadursmi(), lai pārbauda arī otro ienaidnieku.git commit -m "Add second enemy with collision".alert, tas var izlēkt 50 reizes sekundē un "uzkārt" pārlūku. Vienmēr labāk nomainīt HTML tekstu vai apturēt ciklu ar clearInterval!bottom (apakša) vērtība vienmēr ir lielāka (vairāk pikseļu) nekā top (augša).parbauditSadursmi() faila sākumā tikai vienu reizi, dators to pārbaudīs tikai lapas ielādes brīdī un pēc tam vairs nekad. Tai obligāti jābūt ciklā vai uz taustiņa nospiešanas notikuma!function parbauditSadursmi() {
// 1. Iegūstam abu elementu kastes (izveidojot 'taisnstūrus' atmiņā)
let speletajs = document.getElementById("speletajs").getBoundingClientRect();
let skerslis = document.getElementById("ienaidnieks").getBoundingClientRect();
// 2. AABB Sadursmes matemātika (vai tie PĀRKLĀJAS?)
if (
speletajs.left < skerslis.right &&
speletajs.right > skerslis.left &&
speletajs.top < skerslis.bottom &&
speletajs.bottom > skerslis.top
) {
// SADURSME IR NOTIKUSI!
console.log("BOOM! Spēle beigusies.");
document.getElementById("status").innerText = "GAME OVER";
// Šeit parasti aptur spēles dzinēju
// clearInterval(spelesCiklsID);
}
}
// 3. Spēles dzinējs, kas kustina lietas un vienmēr pārbauda sadursmes
let spelesCiklsID = setInterval(function() {
// Kustinām ienaidnieku...
// Atjauninām laiku...
// Un katru kadru pārbaudām, vai neesam saskrējušies!
parbauditSadursmi();
}, 20); // 20 milisekundes = 50 FPS