feat(enemies): 实现怪物基类与4种怪物及波次管理器
This commit is contained in:
113
game/enemies/BossVP.ts
Normal file
113
game/enemies/BossVP.ts
Normal 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)]
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user