feat(game): 添加全套音效系统(背景BGM+7种攻击音+波次/Boss/死亡/建塔音效),纯Web Audio API合成

This commit is contained in:
Cloud Bot
2026-03-24 08:01:27 +00:00
parent c8b8c7109f
commit 08a3612ba1
12 changed files with 351 additions and 2 deletions

View File

@@ -1,6 +1,7 @@
import type Phaser from 'phaser'
import { TowerBase } from './TowerBase'
import { GameManager } from '../GameManager'
import { AudioEngine } from '../AudioEngine'
import type { EnemyBase } from '../enemies/EnemyBase'
export class InternTower extends TowerBase {
@@ -32,6 +33,7 @@ export class InternTower extends TowerBase {
}
attack(target: EnemyBase): void {
AudioEngine.getInstance().playPunch()
const isInstakill = Math.random() < 0.05 && target.hp < 500
if (isInstakill) {
target.takeDamage(9999)

View File

@@ -1,5 +1,6 @@
import type Phaser from 'phaser'
import { TowerBase } from './TowerBase'
import { AudioEngine } from '../AudioEngine'
import type { EnemyBase } from '../enemies/EnemyBase'
/**
@@ -13,6 +14,7 @@ export class OpsTower extends TowerBase {
}
attack(target: EnemyBase): void {
AudioEngine.getInstance().playOpsAttack()
this.fireChart(target)
}

View File

@@ -1,5 +1,6 @@
import type Phaser from 'phaser'
import { TowerBase } from './TowerBase'
import { AudioEngine } from '../AudioEngine'
import type { EnemyBase } from '../enemies/EnemyBase'
/**
@@ -15,6 +16,7 @@ export class OutsourceTower extends TowerBase {
}
attack(target: EnemyBase): void {
AudioEngine.getInstance().playOutsourceAttack()
// 5% 概率 Bug 反弹(精力归零)
if (Math.random() < 0.05) {
this.stamina = 0

View File

@@ -1,5 +1,6 @@
import type Phaser from 'phaser'
import { TowerBase } from './TowerBase'
import { AudioEngine } from '../AudioEngine'
import type { EnemyBase } from '../enemies/EnemyBase'
/**
@@ -15,6 +16,7 @@ export class PMTower extends TowerBase {
}
attack(target: EnemyBase): void {
AudioEngine.getInstance().playPMAttack()
this.firePRD(target)
}

View File

@@ -1,5 +1,6 @@
import type Phaser from 'phaser'
import { TowerBase } from './TowerBase'
import { AudioEngine } from '../AudioEngine'
import type { EnemyBase } from '../enemies/EnemyBase'
export class PPTMasterTower extends TowerBase {
@@ -12,6 +13,7 @@ export class PPTMasterTower extends TowerBase {
}
attackAoe(enemies: EnemyBase[]): void {
AudioEngine.getInstance().playPPTBlast()
const rangePx = this.attackRange * this.cellW
this.showAoeEffect(rangePx)
for (const e of enemies) {

View File

@@ -1,5 +1,6 @@
import type Phaser from 'phaser'
import { TowerBase } from './TowerBase'
import { AudioEngine } from '../AudioEngine'
import type { EnemyBase } from '../enemies/EnemyBase'
export class SeniorDevTower extends TowerBase {
@@ -8,6 +9,7 @@ export class SeniorDevTower extends TowerBase {
}
attack(target: EnemyBase): void {
AudioEngine.getInstance().playKeyboard()
this.fireCodeBullet(target)
}

View File

@@ -2,6 +2,7 @@ import type Phaser from 'phaser'
import { GameManager } from '../GameManager'
import { HUD_HEIGHT, COFFEE_COST, STAMINA_MAX, STAMINA_REGEN } from '../constants'
import { getCellSize } from '../mapRenderer'
import { AudioEngine } from '../AudioEngine'
import type { EnemyBase } from '../enemies/EnemyBase'
export abstract class TowerBase {
@@ -141,6 +142,8 @@ export abstract class TowerBase {
this.isActive = true
this.imageSprite.setAlpha(1)
this.updateStaminaBar()
// 购买咖啡音效
AudioEngine.getInstance().playDingTalk()
return true
}
return false

View File

@@ -2,6 +2,7 @@ import type Phaser from 'phaser'
import { GameManager } from '../GameManager'
import { getCellSize } from '../mapRenderer'
import { COFFEE_COST } from '../constants'
import { AudioEngine } from '../AudioEngine'
import type { EnemyBase } from '../enemies/EnemyBase'
import { TowerBase } from './TowerBase'
import { InternTower } from './InternTower'
@@ -60,6 +61,8 @@ export class TowerManager {
const tower = this.createTower(type, gridX, gridY)
this.towers.push(tower)
this.occupiedCells.add(`${gridX},${gridY}`)
// 建塔音效(钉钉消息音)
AudioEngine.getInstance().playNotify()
// 监听实习生自毁事件
if (tower instanceof InternTower) {
@@ -226,6 +229,8 @@ export class TowerManager {
this.showDestroyEffect(tower)
tower.destroy()
this.removeTower(tower)
// 塔被摧毁音效
AudioEngine.getInstance().playTowerDestroyed()
}
private showDestroyEffect(tower: TowerBase): void {