Kunci jawaban 16 Latihan Game Platform. Ide solusinya; sesuaikan dengan nama fungsi di kode game-mu.
16.1 Game Over
async function runGame(plans, Display) {
let nyawa = 3;
for (let level = 0; level < plans.length && nyawa > 0;) {
let status = await runLevel(
new Level(plans[level]), Display);
if (status == "won") {
level++;
} else {
nyawa--;
console.log(`Nyawa tersisa: ${nyawa}`);
}
}
if (nyawa > 0) console.log("Kamu menang!");
else console.log("Game Over");
}Kenapa: runLevel (async) mengembalikan "won" atau "lost". Kalau menang, maju ke level berikutnya (level++); kalau kalah, kurangi nyawa dan jangan naikkan level (ulangi level yang sama). Kondisi loop nyawa > 0 menghentikan permainan waktu nyawa habis, jadi gak mengulang selamanya.
→ Soal: 16 Latihan Game Platform > 16.1 Game Over
16.2 Menjeda Game
Ide: bungkus loop animasi supaya bisa dihentikan, dan pasang handler Esc yang membalik status jeda.
function runLevel(level, Display) {
let display = new Display(document.body, level);
let state = State.start(level);
let ending = 1;
let berjalan = true;
return new Promise(resolve => {
function keydown(event) {
if (event.key == "Escape") {
event.preventDefault();
if (berjalan) {
berjalan = false; // jeda
} else {
berjalan = true; // lanjut
requestAnimationFrame(frame);
}
}
}
window.addEventListener("keydown", keydown);
let lastTime = null;
function frame(time) {
if (lastTime != null) {
let step = Math.min((time - lastTime) / 1000, 0.1);
state = state.update(step, arrowKeys);
display.syncState(state);
if (state.status != "playing") {
display.clear();
window.removeEventListener("keydown", keydown);
resolve(state.status);
return;
}
}
lastTime = time;
if (berjalan) requestAnimationFrame(frame);
}
requestAnimationFrame(frame);
});
}Kenapa: flag berjalan menentukan apakah frame menjadwalkan frame berikutnya. Waktu Esc ditekan saat berjalan → berjalan = false, loop berhenti menjadwalkan diri (game beku). Esc lagi → berjalan = true dan panggil requestAnimationFrame(frame) sekali untuk membangunkan loop. Yang krusial: removeEventListener("keydown", keydown) dipanggil waktu level selesai, supaya handler dari level ini gak menumpuk waktu level berikutnya dimulai. lastTime di-reset (jadi null di frame pertama setelah bangun) mencegah lompatan besar setelah jeda.