feat(enemies): 实现怪物基类与4种怪物及波次管理器

This commit is contained in:
Cloud Bot
2026-03-21 08:04:11 +00:00
parent 84816cf39e
commit 6a21ece3ee
6 changed files with 661 additions and 0 deletions

113
game/enemies/BossVP.ts Normal file
View File

@@ -0,0 +1,113 @@
import type Phaser from 'phaser'
import { EnemyBase, type PathPoint } from './EnemyBase'
const QUOTES = [
'我来教大家怎么做事',
'你们缺乏战略眼光',
'这不是执行力的问题',
]
export class BossVP extends EnemyBase {
private skillTimer: number = 20000
private onDestroyTower?: () => void
constructor(
scene: Phaser.Scene,
pathPoints: PathPoint[],
onDestroyTower?: () => void
) {
super(scene, pathPoints, 800, 40, 30, 150)
this.onDestroyTower = onDestroyTower
this.drawSprite()
// BOSS 出现时全屏红色闪光
scene.cameras.main.flash(800, 255, 0, 0, false)
this.showBossAlert()
}
private showBossAlert(): void {
const alert = this.scene.add
.text(640, 360, '⚠ 空降VP来袭⚠', {
fontFamily: 'VT323, monospace',
fontSize: '36px',
color: '#FBBF24',
backgroundColor: '#7F1D1D',
padding: { x: 16, y: 8 },
})
.setOrigin(0.5, 0.5)
.setDepth(50)
this.scene.tweens.add({
targets: alert,
alpha: 0,
duration: 2500,
delay: 500,
onComplete: () => alert.destroy(),
})
}
drawSprite(): void {
if (!this.sprite) return
this.sprite.clear()
// 金色六边形
this.sprite.fillStyle(0xfbbf24, 1)
const r = 22
this.sprite.fillPoints(this.hexPoints(r), true)
// 金色外框
this.sprite.lineStyle(3, 0xf59e0b, 1)
this.sprite.strokePoints(this.hexPoints(r + 4), false)
// 内部颜色
this.sprite.fillStyle(0xd97706, 1)
this.sprite.fillCircle(0, 0, 8)
this.sprite.setDepth(12)
this.sprite.setPosition(this.x, this.y)
}
private hexPoints(r: number): Phaser.Types.Math.Vector2Like[] {
const pts: Phaser.Types.Math.Vector2Like[] = []
for (let i = 0; i < 6; i++) {
const angle = (Math.PI / 3) * i - Math.PI / 6
pts.push({ x: Math.cos(angle) * r, y: Math.sin(angle) * r })
}
return pts
}
override update(delta: number): void {
if (this.isDead) return
super.update(delta)
this.skillTimer -= delta
if (this.skillTimer <= 0) {
this.skillTimer = 20000
this.triggerOrgRestructure()
}
// 重绘六边形到新位置
this.drawSprite()
}
private triggerOrgRestructure(): void {
// 组织架构调整:随机摧毁一个防御塔
if (this.onDestroyTower) {
this.onDestroyTower()
}
const txt = this.scene.add
.text(this.x, this.y - 40, '组织架构调整!', {
fontFamily: 'VT323, monospace',
fontSize: '18px',
color: '#FBBF24',
backgroundColor: '#7C2D12',
padding: { x: 6, y: 3 },
})
.setOrigin(0.5, 1)
.setDepth(25)
this.scene.tweens.add({
targets: txt,
y: this.y - 70,
alpha: 0,
duration: 2000,
onComplete: () => txt.destroy(),
})
}
getQuote(): string {
return QUOTES[Math.floor(Math.random() * QUOTES.length)]
}
}