WEEK 06 · JAVASCRIPT
05|重複處理資料
看懂一小段,動手改一點,再回到遊戲找用途。
for 與 push:重複新增資料
從 i = 0 開始,i < 30 就繼續,每次完成後 i++。共執行 30 次。push() 在原陣列尾端新增項目。
{ x, y } 是 { x: x, y: y } 的簡寫,使用外面同名變數的值。
for (let i = 0; i < 30; i++) {
particles.push({ x, y, life: 0.8 });
}forEach:每一個都處理
b 逐一代表每顆子彈。下列程式修改每顆子彈的位置,forEach() 本身不產生新的子彈陣列。
回呼內的 return 只離開當次回呼,不會離開外面的 update,也不等於跳出整個迴圈。
bullets.forEach(b => b.y += b.vy * dt);
// 可以展開成:
bullets.forEach(function (b) {
b.y = b.y + b.vy * dt;
});filter:只留下符合條件的項目
b 代表一顆子彈;判斷 b.y > -10 是否成立。filter 建立新的陣列,所以要指定回 bullets,才會更新子彈清單。
bullets = bullets.filter(b => b.y > -10);every:是否全部符合?
只有全部敵機都不存活才回傳 true。空陣列的 every 也會回傳 true;本遊戲初始化時有兩架敵機。
if (state === 'playing' && enemies.every(e => !e.alive)) state = 'win';操作看看
子彈 y 座標:[-20, -5, 100]
尚未篩選。
動手修改
保留 life 大於 0 的爆炸粒子。
展開參考答案
使用 filter,並把新陣列指定回 particles。
particles = particles.filter(p => p.life > 0);