歡迎來到第十一天!繼昨天順利完成「青花瓷豆花怪」的戰鬥與抓捕演算法後,今天我們要將戰場轉移到大廳櫃檯上的**「雪花冰機」**,展開第二款小遊戲——甜點時間挑戰的核心寫碼實戰!
這款遊戲的魅力在於高節奏的緊張感:顧客點餐後,玩家必須在有限時間內,按照正確順序組裝雪花冰食材。稍微手滑點錯或動作太慢,分數就會大打折扣!
在甜點製作中,「食材順序」是判定成功與否的核心。我們將每道甜點拆解為一個字串陣列(Array):
['ice_base', 'red_bean', 'condensed_milk', 'pudding']
在 Cocos Creator 中,我建立了一個 RecipeManager.ts 腳本,透過 Vibe Coding 讓 Cursor 自動產生比對邏輯:
public onIngredientClick(ingredientId: string): void {
const currentIndex = this.playerInput.length;
// 比對目前點擊的食材是否符合訂單對應位置
if (this.currentOrder[currentIndex] === ingredientId) {
this.playerInput.push(ingredientId);
this.playAddIngredientAnimation(ingredientId); // 播放配料掉落動畫
// 檢查是否完成整份甜點
if (this.playerInput.length === this.currentOrder.length) {
this.completeDessert();
}
} else {
// 順序點錯,觸發震動與扣分/扣時懲罰
this.triggerWrongFeedback();
}
}
透過 AI 產生的線性比對邏輯,當玩家點擊錯誤時會立刻觸發「錯誤紅框 Shake 動畫」與音效;點擊正確則會觸發配料層層堆疊的動畫,回饋感十足。
在遊戲開發中,絕對不能使用傳統 JavaScript 的 setInterval 來做遊戲計時,因為當瀏覽器分頁切換或效能波動時,setInterval 會產生嚴重漂移。
我們採用 Cocos Creator 原生的 update(dt) 生命週期函式,利用每幀傳入的微小時間差(dt, Delta Time)進行精準累積:
private elapsedTime: number = 0; // 累積消耗毫秒數
private isTimerRunning: boolean = false;
update(dt: number) {
if (!this.isTimerRunning) return;
this.elapsedTime += dt;
const remainingTime = Math.max(0, this.timeLimit - this.elapsedTime);
// 更新 UI 毫秒倒數文字 (例如:08.45s)
this.timerLabel.string = remainingTime.toFixed(2) + "s";
if (remainingTime <= 0) {
this.onTimeUp(); // 時間到,結算遊戲
}
}
完成甜點時,剩餘時間越多,加成係數就越高:
\[\text{最終得分} = \text{基礎完成分數} + \text{Math.floor}(\text{剩餘秒數} \times 100) \times \text{連續完美combo係數}\]
為了防止玩家在前端透過腳本修改得分,我們在按下完成時,將 elapsedTime(總耗時)、點擊步驟序列與時間戳記 打包成 JSON,準備傳給後端 Ktor 進行二驗。
今天我們只花了不到兩小時,就透過 Cursor 建立了完整的「配方比對陣列 + 高精度計時器 + 倒數回饋系統」。
至此,兩款核心小遊戲的原型已經雙雙寫碼完成!明天(Day 12)將迎來階段二的收尾,我們將進行第一次遊戲實機測試與試玩對齊,看看朋友對這兩款遊戲的實際反饋!