From 883b9a48df99f05507c1d766dca0c05b1b5e9ef9 Mon Sep 17 00:00:00 2001 From: Cloud Bot Date: Sat, 21 Mar 2026 08:14:58 +0000 Subject: [PATCH] =?UTF-8?q?feat(game/towers):=20TowerBase=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=20isFrozen=20=E7=A6=81=E9=94=A2=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E6=94=AF=E6=8C=81=EF=BC=8C=E7=A6=81=E9=94=A2=E6=97=B6=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E7=81=B0=E8=89=B2=E8=A6=86=E7=9B=96=E5=B1=82=E5=B9=B6?= =?UTF-8?q?=E8=B7=B3=E8=BF=87=E6=94=BB=E5=87=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/towers/TowerBase.ts | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/game/towers/TowerBase.ts b/game/towers/TowerBase.ts index 4ae6a98..3e30e31 100644 --- a/game/towers/TowerBase.ts +++ b/game/towers/TowerBase.ts @@ -9,6 +9,7 @@ export abstract class TowerBase { public gridY: number protected sprite!: Phaser.GameObjects.Graphics protected staminaBar!: Phaser.GameObjects.Graphics + private frozenOverlay!: Phaser.GameObjects.Graphics public readonly cost: number public readonly attackRange: number @@ -16,6 +17,7 @@ export abstract class TowerBase { public readonly attackSpeed: number public readonly maxStamina: number = STAMINA_MAX public stamina: number = STAMINA_MAX + public isFrozen: boolean = false protected attackCooldown: number = 0 protected staminaRegen: number = STAMINA_REGEN @@ -47,12 +49,20 @@ export abstract class TowerBase { this.sprite = scene.add.graphics() this.staminaBar = scene.add.graphics() + this.frozenOverlay = scene.add.graphics() this.drawSprite() this.updateStaminaBar() } update(delta: number, enemies: EnemyBase[]): void { + // 禁锢状态:跳过攻击,显示灰色覆盖 + if (this.isFrozen) { + this.drawFrozenOverlay() + return + } + // 解除禁锢时清除覆盖层 + this.clearFrozenOverlay() this.attackCooldown -= delta if (this.stamina <= 0) { @@ -135,11 +145,31 @@ export abstract class TowerBase { return { x: this.px, y: this.py } } + /** 绘制禁锢状态灰色覆盖层 */ + protected drawFrozenOverlay(): void { + this.frozenOverlay.clear() + const half = TILE_SIZE / 2 + this.frozenOverlay.fillStyle(0x6b7280, 0.6) + this.frozenOverlay.fillRect( + this.px - half, + this.py - half, + TILE_SIZE, + TILE_SIZE + ) + this.frozenOverlay.setDepth(13) + } + + /** 清除禁锢覆盖层 */ + protected clearFrozenOverlay(): void { + this.frozenOverlay.clear() + } + abstract attack(target: EnemyBase): void abstract drawSprite(): void destroy(): void { this.sprite?.destroy() this.staminaBar?.destroy() + this.frozenOverlay?.destroy() } }