目前我們仍然無法拾取這些物品,它們只是簡單地掉落在地上。因此,我們需要對這些功能進行增強。
目標
- ?彈射物品?:當物品生成時,我們希望它們能以一定的力量彈出,而不是無力地掉落。
- ?添加不同類型的物品?:例如星星物品,以增加游戲的多樣性。
- ?生成多個物品?:在某些情況下,我們需要能夠一次性生成多個物品。
- ?拾取物品?:玩家需要能夠拾取這些物品,并且舊物品在離開屏幕時應該被刪除。
- ?磁吸效果?:我們希望實現一種磁吸效果,讓玩家能夠從遠處吸引物品。
實現細節
彈射物品
為了實現彈射效果,我們需要修改物品的生成函數,使其在生成時具有一定的初速度。這將增加物品的動感,使其看起來像是從爆炸中彈出。
markdownCopy Code
// 修改生成函數,增加彈射效果 function spawnPickup(x, y, type, num) { // ... 其他代碼 let speed = 5; // 彈射速度 pickups.push({ x: x, y: y, type: type, sx: Math.random() * speed - speed / 2, // 隨機水平速度 sy: -speed, // 垂直向下的速度 // ... 其他屬性 }); }
添加不同類型的物品
為了添加不同類型的物品(如星星),我們需要在生成函數中添加一個類型參數,并在繪制時根據類型選擇不同的圖形。
markdownCopy Code
// 生成物品時指定類型 spawnPickup(enemyX, enemyY, true, 1); // 生成一個星星物品 // 在繪制函數中根據類型選擇圖形 function drawPickups() { for (let pickup of pickups) { if (pickup.type) { // 繪制星星 drawStar(pickup.x, pickup.y); } else { // 繪制普通物品 drawOval(pickup.x, pickup.y, 10, 10); } } }
生成多個物品
為了實現一次性生成多個物品,我們需要在生成函數中增加一個數量參數,并在循環中生成指定數量的物品。同時,我們需要調整它們的位置,以避免重疊。
markdownCopy Code
// 生成多個物品 function spawnMultiplePickups(x, y, type, num) { for (let i = 0; i < num; i++) { let angle = Math.random() * 2 * Math.PI; // 隨機角度 let offsetX = Math.cos(angle) * 10; // 根據角度計算偏移量 let offsetY = Math.sin(angle) * 10; spawnPickup(x + offsetX, y + offsetY, type, 1); } }
拾取物品
為了實現物品拾取功能,我們需要計算玩家與物品之間的距離,并在距離小于一定閾值時拾取物品。同時,我們需要播放拾取音效并顯示拾取動畫。
markdownCopy Code
// 計算玩家與物品之間的距離 function updatePickups() { for (let pickup of pickups) { let distance = Math.sqrt(Math.pow(player.x - pickup.x, 2) + Math.pow(player.y - pickup.y, 2)); if (distance < 32) { // 如果距離小于32,則拾取物品 playSoundEffect("pickup"); // 播放拾取音效 showPickupAnimation(pickup.x, pickup.y); // 顯示拾取動畫 pickups.splice(pickups.indexOf(pickup), 1); // 從列表中刪除物品 } } }
磁吸效果
為了實現磁吸效果,我們需要在物品距離玩家較近時,計算一個指向玩家的向量,并逐漸改變物品的速度方向,使其向玩家移動。同時,我們可以繪制一條從物品當前位置到上一幀位置的線,以模擬速度線效果。
markdownCopy Code
// 實現磁吸效果 function updatePickups() { for (let pickup of pickups) { let distance = Math.sqrt(Math.pow(player.x - pickup.x, 2) + Math.pow(player.y - pickup.y, 2)); if (distance < 64) { // 如果距離小于64,則激活磁吸效果 let angle = Math.atan2(player.y - pickup.y, player.x - pickup.x); // 計算角度 let speed = 0.3; // 磁吸速度 pickup.sx += Math.cos(angle) * speed; // 更新水平速度 pickup.sy += Math.sin(angle) * speed; // 更新垂直速度 // 限制最大速度 let maxSpeed = 4; if (Math.sqrt(pickup.sx * pickup.sx + pickup.sy * pickup.sy) > maxSpeed) { let scale = maxSpeed / Math.sqrt(pickup.sx * pickup.sx + pickup.sy * pickup.sy); pickup.sx *= scale; pickup.sy *= scale; } // 繪制速度線 drawLine(pickup.lastX, pickup.lastY, pickup.x, pickup.y, 7); } // 保存上一幀位置 pickup.lastX = pickup.x; pickup.lastY = pickup.y; } }
總結
通過今天的修改,我們的游戲物品拾取功能得到了顯著的增強。我們實現了物品的彈射效果、添加了不同類型的物品、支持了一次性生成多個物品、實現了物品拾取功能以及磁吸效果。在下一集中,我們將繼續完善這些功能,并添加爆炸效果等更多游戲元素。感謝大家的支持,我們下期再見!