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);