feat(towers): 实现防御塔基类与4种塔及塔管理器
This commit is contained in:
76
game/towers/SeniorDevTower.ts
Normal file
76
game/towers/SeniorDevTower.ts
Normal file
@@ -0,0 +1,76 @@
|
||||
import type Phaser from 'phaser'
|
||||
import { TowerBase } from './TowerBase'
|
||||
import type { EnemyBase } from '../enemies/EnemyBase'
|
||||
|
||||
export class SeniorDevTower extends TowerBase {
|
||||
constructor(scene: Phaser.Scene, gridX: number, gridY: number) {
|
||||
super(scene, gridX, gridY, 120, 5, 30, 1.0)
|
||||
this.drawSprite()
|
||||
}
|
||||
|
||||
drawSprite(): void {
|
||||
if (!this.sprite) return
|
||||
this.sprite.clear()
|
||||
// 深蓝色方块
|
||||
this.sprite.fillStyle(0x3b82f6, 1)
|
||||
this.sprite.fillRect(-12, -12, 24, 24)
|
||||
this.sprite.lineStyle(1, 0x93c5fd, 1)
|
||||
this.sprite.strokeRect(-12, -12, 24, 24)
|
||||
this.sprite.setPosition(this.px, this.py)
|
||||
this.sprite.setDepth(10)
|
||||
|
||||
// 顶部 </> 符号文字
|
||||
if (this.scene) {
|
||||
const existing = this.scene.children.getByName(`dev_label_${this.gridX}_${this.gridY}`)
|
||||
if (!existing) {
|
||||
this.scene.add
|
||||
.text(this.px, this.py, '</>', {
|
||||
fontFamily: 'monospace',
|
||||
fontSize: '10px',
|
||||
color: '#DBEAFE',
|
||||
})
|
||||
.setOrigin(0.5, 0.5)
|
||||
.setDepth(11)
|
||||
.setName(`dev_label_${this.gridX}_${this.gridY}`)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
attack(target: EnemyBase): void {
|
||||
// 发射绿色代码块子弹
|
||||
this.fireBullet(target)
|
||||
}
|
||||
|
||||
private fireBullet(target: EnemyBase): void {
|
||||
const bullet = this.scene.add.graphics()
|
||||
bullet.fillStyle(0x22c55e, 1)
|
||||
bullet.fillRect(-4, -4, 8, 8)
|
||||
bullet.setPosition(this.px, this.py)
|
||||
bullet.setDepth(13)
|
||||
|
||||
const startX = this.px
|
||||
const startY = this.py
|
||||
const targetX = target.sprite.x
|
||||
const targetY = target.sprite.y
|
||||
|
||||
const dx = targetX - startX
|
||||
const dy = targetY - startY
|
||||
const dist = Math.sqrt(dx * dx + dy * dy)
|
||||
const duration = (dist / 400) * 1000
|
||||
|
||||
this.scene.tweens.add({
|
||||
targets: bullet,
|
||||
x: targetX,
|
||||
y: targetY,
|
||||
duration,
|
||||
onComplete: () => {
|
||||
bullet.destroy()
|
||||
if (!target.isDead) {
|
||||
target.takeDamage(this.attackDamage)
|
||||
// 代码屎山:附加 DOT
|
||||
target.addDOT(10, 3000)
|
||||
}
|
||||
},
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user