dd
This commit is contained in:
41
assets/script/game/system/CombatSystem.ts
Normal file
41
assets/script/game/system/CombatSystem.ts
Normal file
@@ -0,0 +1,41 @@
|
||||
@ecs.registerSystem()
|
||||
export class CombatSystem extends ecs.System {
|
||||
filter(): ecs.IMatcher {
|
||||
return ecs.allOf(Combat, HeroModel);
|
||||
}
|
||||
|
||||
update(entities: ecs.Entity[]) {
|
||||
entities.forEach(attacker => {
|
||||
if (attacker.has(HeroModel)) {
|
||||
this.processHeroAttack(attacker);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private processHeroAttack(attacker: ecs.Entity) {
|
||||
const combat = attacker.get(Combat);
|
||||
const model = attacker.get(HeroModel);
|
||||
|
||||
if (combat.target && model.hp > 0) {
|
||||
// 攻击逻辑
|
||||
combat.attackTimer += this.dt;
|
||||
if (combat.attackTimer >= combat.attackInterval) {
|
||||
this.executeAttack(attacker, combat.target);
|
||||
combat.attackTimer = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private executeAttack(attacker: ecs.Entity, target: ecs.Entity) {
|
||||
// 伤害计算逻辑
|
||||
const attack = attacker.get(HeroModel).attack;
|
||||
const defense = target.get(HeroModel).defense;
|
||||
const damage = Math.max(attack - defense, 1);
|
||||
|
||||
oops.message.dispatch('CombatEvent', {
|
||||
attacker,
|
||||
target,
|
||||
damage
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user