ARCADE ▶ BRICK BREAKER

打磚塊

經典打磚塊,把技術債一塊一塊敲掉!接住掉落的道具,讓球分裂、板子變長,但小心別接到縮短板子的陷阱。

  • ← → 或 A D 移動
  • 滑鼠/手指直接控制板子
  • 空白鍵/點擊:發球

玩法說明

球會停在板子上,按空白鍵或點擊畫面發球。移動板子把球打回去,敲碎所有磚塊就能進入下一關。

磚塊

磚塊顏色 要敲幾下
彩色 1 下
淡紫色 2 下,敲過一次會出現裂痕
銀白色 3 下

每敲一下得 10 分,敲碎時再依磚塊硬度加分,過關另有獎勵分數。

道具

敲碎磚塊時有機會掉出道具膠囊,用板子接住就會生效:

道具 效果 持續時間
藍色 M 分裂球:場上每顆球各分裂出 2 顆,最多 9 顆 直到球掉光
綠色 L 板子加長 12 秒
紅色 S 板子縮短(陷阱!) 10 秒
橘色 T 球變慢 8 秒
粉紅 + 生命 +1,最多 5 條 立即

板子變長時會變成綠色、縮短時變成紅色,球變慢時會變成橘色,一眼就能看出目前的狀態。

  • 一開始有 3 條命,場上所有球都掉下去才會扣命。
  • 一共有 4 種關卡配置,全部破完會從頭循環,但球速會越來越快。

小技巧

  • 球打在板子哪裡,決定它往哪裡飛:打在中間會直直往上,越靠邊緣角度越斜,可以用來瞄準角落的磚塊。
  • 紅色的 S 不一定要接,看到它掉下來可以刻意閃開。

開發筆記

為什麼做打磚塊

打磚塊幾乎是每個人都玩過的遊戲,規則不用解釋。但要讓它「好玩」,物理碰撞和手感調整其實有不少眉角,很適合當作遊戲廳的第三台機台。

板子決定反彈角度

如果球只是單純照入射角反彈,玩家根本沒辦法控制球的方向,很快就會覺得無聊。所以板子的反彈不看入射角,而是看球打在板子的哪個位置:

const rel = (ballCenterX - paddle.x) / paddle.w; // 0 是最左邊,1 是最右邊
setVelocity(ball, (rel - 0.5) * 2 * 1.05);       // 換算成約 ±60 度的角度

打在正中間直直往上,打在邊緣會斜斜飛出去。這是打磚塊「有手感」的關鍵。

防止球穿牆

球速最快每秒 150 像素,一幀大約移動 2.5 像素,而磚塊只有 6 像素高。如果每幀只檢查一次碰撞,球偶爾會直接「穿過」磚塊或板子。

解法是把每一幀的移動切成好幾小步,每一步最多只走 1.5 像素,每一步都檢查碰撞:

const steps = Math.ceil(distance / 1.5);
for (let i = 0; i < steps; i++) {
  // 移動一小步,檢查牆壁、板子、磚塊
}

判斷撞到磚塊的哪一面

撞到磚塊後,要決定球是「左右反彈」還是「上下反彈」。做法是計算球和磚塊在水平、垂直方向各重疊了多少:水平重疊比較少,代表是從側面撞進來的,就左右反彈;反之就上下反彈。簡單又穩定。

避免球卡在水平方向

打磚塊常見的惱人狀況是:球角度太平,在左右兩面牆之間來回彈很久都不上不下。所以每一幀都會檢查球的垂直速度,至少要保持總速度的 35%,不夠就自動修正角度。

道具的平衡

道具掉落機率是 16%,而且每種道具出現的比例不同:分裂球最常見,加長和縮短各占一部分,生命最稀有。縮短板子的陷阱是刻意加入的,讓玩家看到道具時要判斷「這個要不要接」,而不是無腦全接。

分裂球則設了最多 9 顆的上限,避免畫面亂成一團,也讓效能保持穩定。

共用引擎的好處

這款和芭樂接接樂、抓 Bug 大作戰共用同一支小引擎 px.js,輸入、音效、最高分紀錄、遊戲迴圈都不用重寫,所以這款大部分的時間都花在調整物理和手感上。

下一步

想加入的東西:

  • 打不破的鐵磚塊
  • 可以發射子彈的雷射板子
  • 更多關卡,以及關卡編輯器

有想法歡迎到關於頁告訴我。