61 lines
1.6 KiB
TypeScript
61 lines
1.6 KiB
TypeScript
import type Phaser from 'phaser'
|
||
import { TowerBase } from './TowerBase'
|
||
import type { EnemyBase } from '../enemies/EnemyBase'
|
||
|
||
export class PPTMasterTower extends TowerBase {
|
||
constructor(scene: Phaser.Scene, gridX: number, gridY: number) {
|
||
super(scene, gridX, gridY, 100, 3, 5, 1.5)
|
||
this.drawSprite()
|
||
}
|
||
|
||
drawSprite(): void {
|
||
if (!this.sprite) return
|
||
this.sprite.clear()
|
||
// 橙色圆形
|
||
this.sprite.fillStyle(0xf59e0b, 1)
|
||
this.sprite.fillCircle(0, 0, 16)
|
||
// 圆心白点
|
||
this.sprite.fillStyle(0xffffff, 0.9)
|
||
this.sprite.fillCircle(0, 0, 5)
|
||
this.sprite.setPosition(this.px, this.py)
|
||
this.sprite.setDepth(10)
|
||
}
|
||
|
||
attack(target: EnemyBase): void {
|
||
// AOE 攻击:对射程内所有怪物造成伤害 + 减速
|
||
this.showAoeEffect()
|
||
}
|
||
|
||
/** 该方法由 TowerManager 调用,传入全体敌人 */
|
||
attackAoe(enemies: EnemyBase[]): void {
|
||
const rangePx = this.attackRange * 80 // TILE_SIZE
|
||
this.showAoeEffect()
|
||
for (const e of enemies) {
|
||
if (e.isDead) continue
|
||
const dx = e.sprite.x - this.px
|
||
const dy = e.sprite.y - this.py
|
||
const dist = Math.sqrt(dx * dx + dy * dy)
|
||
if (dist <= rangePx) {
|
||
e.takeDamage(this.attackDamage)
|
||
// 黑话领域:减速40%持续2秒
|
||
e.addSlow(0.4, 2000)
|
||
}
|
||
}
|
||
}
|
||
|
||
private showAoeEffect(): void {
|
||
const g = this.scene.add.graphics()
|
||
g.lineStyle(2, 0xf59e0b, 0.8)
|
||
g.strokeCircle(this.px, this.py, this.attackRange * 80)
|
||
g.setDepth(12)
|
||
this.scene.tweens.add({
|
||
targets: g,
|
||
alpha: 0,
|
||
scaleX: 1.2,
|
||
scaleY: 1.2,
|
||
duration: 400,
|
||
onComplete: () => g.destroy(),
|
||
})
|
||
}
|
||
}
|