feat(game): 添加全套音效系统(背景BGM+7种攻击音+波次/Boss/死亡/建塔音效),纯Web Audio API合成
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user