释放技能动画 设定在技能参数中+伤害系统建立
This commit is contained in:
41
assets/script/game/damage/DamageComp.ts
Normal file
41
assets/script/game/damage/DamageComp.ts
Normal file
@@ -0,0 +1,41 @@
|
||||
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
|
||||
|
||||
export enum DamageType {
|
||||
Physical = 1,
|
||||
Magic = 2,
|
||||
True = 3
|
||||
}
|
||||
|
||||
/** 伤害请求组件 */
|
||||
@ecs.register('DamageRequest')
|
||||
export class DamageRequest extends ecs.Comp {
|
||||
source!: ecs.Entity; // 伤害来源
|
||||
target!: ecs.Entity; // 伤害目标
|
||||
baseValue!: number; // 基础伤害值
|
||||
damageType: number = 1; // 伤害类型
|
||||
canCrit: boolean = true; // 是否可暴击
|
||||
ignoreDefense: boolean = false; // 是否忽略防御
|
||||
|
||||
reset() {
|
||||
this.source = null!;
|
||||
this.target = null!;
|
||||
this.baseValue = 0;
|
||||
this.damageType = 1;
|
||||
this.canCrit = true;
|
||||
this.ignoreDefense = false;
|
||||
}
|
||||
}
|
||||
|
||||
/** 伤害结果组件 */
|
||||
@ecs.register('DamageResult')
|
||||
export class DamageResult extends ecs.Comp {
|
||||
finalDamage: number = 0;
|
||||
isCrit: boolean = false;
|
||||
isDodged: boolean = false;
|
||||
|
||||
reset(finalDamage: number = 0, isCrit: boolean = false, isDodged: boolean = false) {
|
||||
this.finalDamage = finalDamage;
|
||||
this.isCrit = isCrit;
|
||||
this.isDodged = isDodged;
|
||||
}
|
||||
}
|
||||
70
assets/script/game/damage/DamageSystem.ts
Normal file
70
assets/script/game/damage/DamageSystem.ts
Normal file
@@ -0,0 +1,70 @@
|
||||
import { oops } from "db://oops-framework/core/Oops";
|
||||
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
|
||||
import { HeroViewComp } from "../hero/HeroViewComp";
|
||||
import { DamageRequest, DamageResult } from "./DamageComp";
|
||||
|
||||
@ecs.register('DamageSystem')
|
||||
export class DamageSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate {
|
||||
filter(): ecs.IMatcher {
|
||||
return ecs.allOf(DamageRequest);
|
||||
}
|
||||
|
||||
update(entity: ecs.Entity) {
|
||||
const req = entity.get(DamageRequest);
|
||||
const result = this.calculateDamage(req);
|
||||
this.applyDamage(req.target, result);
|
||||
entity.remove(DamageRequest);
|
||||
}
|
||||
|
||||
private calculateDamage(req: DamageRequest): DamageResult {
|
||||
const targetView = req.target.get(HeroViewComp);
|
||||
const sourceView = req.source.get(HeroViewComp);
|
||||
let final = req.baseValue;
|
||||
|
||||
// 闪避判定
|
||||
if (Math.random() < targetView.dodge) {
|
||||
const result = new DamageResult();
|
||||
result.finalDamage = 0;
|
||||
result.isDodged = true;
|
||||
return result;
|
||||
}
|
||||
|
||||
// 护甲减伤
|
||||
if (!req.ignoreDefense) {
|
||||
final -= targetView.def * 0.5;
|
||||
}
|
||||
|
||||
// 暴击判定
|
||||
let isCrit = false;
|
||||
if (req.canCrit) {
|
||||
const critRate = sourceView.crit;
|
||||
if (Math.random() < critRate) {
|
||||
final *= 1.5;
|
||||
isCrit = true;
|
||||
}
|
||||
}
|
||||
|
||||
const result = new DamageResult();
|
||||
result.finalDamage = Math.max(0, final);
|
||||
result.isCrit = isCrit;
|
||||
return result;
|
||||
}
|
||||
|
||||
private applyDamage(target: ecs.Entity, result: DamageResult) {
|
||||
const view = target.get(HeroViewComp);
|
||||
view.hp -= result.finalDamage;
|
||||
|
||||
// 添加伤害结果组件
|
||||
const comp = target.add(DamageResult);
|
||||
comp.finalDamage = result.finalDamage;
|
||||
comp.isCrit = result.isCrit;
|
||||
comp.isDodged = result.isDodged;
|
||||
|
||||
// 触发伤害事件
|
||||
oops.message.dispatchEvent("OnDamage", {
|
||||
target,
|
||||
damage: result.finalDamage,
|
||||
isCrit: result.isCrit
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user