109 lines
2.8 KiB
TypeScript
109 lines
2.8 KiB
TypeScript
import type Phaser from 'phaser'
|
||
import { EnemyBase, type PathPoint } from './EnemyBase'
|
||
import { getRandomQuote } from '../data/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 getRandomQuote('BossVP')
|
||
}
|
||
}
|