技能碰撞改回物理碰撞

This commit is contained in:
2025-03-30 16:59:40 +08:00
parent 67704725b2
commit 798a831227
85 changed files with 13428 additions and 7394 deletions

View File

@@ -43,34 +43,31 @@ export class HeroSkillSystem extends ecs.ComblockSystem implements ecs.ISystemUp
private castSkill(caster: ecs.Entity, skillId: number, config: typeof SkillSet[keyof typeof SkillSet]) {
const view = caster.get(HeroViewComp);
const skillEntity = ecs.getEntity<Skill>(Skill);
console.log(view.hero_name+"施放技能:"+config.uuid+"=>"+view.hero_name);
console.log(view.uuid+"=>"+view.hero_name+"施放技能:"+config.uuid);
if (config.TargetGroup === TargetGroup.Enemy) {
const targets = this.selectEnemyTargets(caster, config);
console.log("敌人 targets:"+targets);
if (targets.length === 0) return;
skillEntity.load(
new Vec3(view.node.position.x, view.node.position.y+BoxSet.ATK_Y, 0), // 起始位置
view.fac, // 阵营
view.box_group, // 阵营
view.node.parent, // 父节点
config.uuid, // 技能ID
new Vec3(targets[0]?.get(HeroViewComp).node.position.x, targets[0]?.get(HeroViewComp).node.position.y, 0), // 目标位置
targets[0]?.get(HeroViewComp),
view
);
targets.forEach(target => {
this.applySkillEffect(caster, target, config,skillEntity);
console.log("施放技能:"+config.uuid+"=>"+target.get(HeroViewComp).hero_name);
});
caster.get(HeroViewComp).playSkillEffect(config.uuid);
console.log("技能:"+config.uuid+"=>"+targets[0]?.get(HeroViewComp).hero_name);
}
if (config.TargetGroup === TargetGroup.Ally) {
const targets = this.selectAllyTargets(caster, config);
if (targets.length === 0) return;
targets.forEach(target => {
this.applySkillEffect(caster, target, config,skillEntity);
});
}
if (config.TargetGroup === TargetGroup.Self) {
this.applySkillEffect(caster, caster, config,skillEntity);
}
}
@@ -119,13 +116,6 @@ export class HeroSkillSystem extends ecs.ComblockSystem implements ecs.ISystemUp
return shuffled.slice(0, count);
}
/** 应用技能效果 */
private applySkillEffect(caster: ecs.Entity, target: ecs.Entity, config: typeof SkillSet[keyof typeof SkillSet],skillEntity:ecs.Entity) {
const casterView = caster.get(HeroViewComp);
// 播放技能特效
casterView.playSkillEffect(config.uuid);
}
public clear_timer() {
console.log("clear_timer");

View File

@@ -1,148 +0,0 @@
import { Node, Vec3 } from "cc";
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
import { HeroViewComp } from "../hero/HeroViewComp";
import { HeroSkillsComp } from "./heroSkillsComp";
import { endType, SkillSet, TargetGroup, TargetType } from "../common/config/SkillSet";
import { CdType } from "../common/config/SkillSet";
import { oops } from "db://oops-framework/core/Oops";
import { GameEvent } from "../common/config/GameEvent";
import { Skill } from "../skills/Skill";
import { SkillCom } from "../skills/SkillCom";
import { AnimType } from "../common/config/SkillSet";
/** 技能系统 */
@ecs.register('SkillSystem')
export class SkillSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate {
private _timers: { [key: string]: number } = {};
private _damageQueue: Array<{ timer: number; callback: () => void }> = [];
private readonly SKILL_RANGE_X = 10; // x轴判定范围
private readonly SKILL_RANGE_Y = 10; // y轴判定范围
init(): void {
oops.message.on(GameEvent.MissionEnd, this.clear_timer, this);
}
filter(): ecs.IMatcher {
return ecs.allOf(SkillCom);
}
update(e: ecs.Entity) {
const skill = e.get(SkillCom);
if(this.checkSkill(skill)){
if(skill.atk_count < 1){
skill.atk_count++;
// console.log("技能命中目标",skill.caster,skill.target,SkillSet[skill.s_uuid]);
this.applySkillEffect(skill.caster,skill.target,SkillSet[skill.s_uuid],e);
}
}
this.processDamageQueue();
}
private processDamageQueue() {
const delta = this.dt;
for (let i = this._damageQueue.length - 1; i >= 0; i--) {
this._damageQueue[i].timer -= delta;
if (this._damageQueue[i].timer <= 0) {
this._damageQueue[i].callback();
this._damageQueue.splice(i, 1);
}
}
}
checkSkill(skill: SkillCom) {
const targetPos = skill.target.node.position;
const target = skill.target;
const skillPos = skill.node.position;
// 根据技能配置获取判定范围
const config = SkillSet[skill.s_uuid];
const rangeX = config?.rangeX || 30; // 默认值为10
const rangeY = config?.rangeY || 40;
const distanceX = Math.abs(targetPos.x - skillPos.x);
const distanceY = Math.abs(targetPos.y+40 - skillPos.y);
const isInRange = distanceX < rangeX && distanceY < rangeY;
return isInRange;
}
/** 应用技能效果 */
private applySkillEffect(casterView:HeroViewComp, targetView: HeroViewComp, config: typeof SkillSet[keyof typeof SkillSet],e:ecs.Entity) {
// 直接计算伤害(包含防御减免)
const damageResult = this.calculateDamage(casterView, targetView, config);
// 将施法者传入applyDamage方法
this.applyDamage(targetView,damageResult);
// 播放技能特效
casterView.playSkillEffect(config.uuid);
console.log(`${casterView.hero_name}${targetView.hero_name} 造成 ${damageResult.value}伤害`);
if(config.endType === endType.collision){
e.destroy();
}
}
private calculateDamage(caster: HeroViewComp, target: HeroViewComp, config: typeof SkillSet[keyof typeof SkillSet]) {
const result = {
value: 0,
isCrit: false,
isDodged: false,
delay: 0.3, // 默认延迟
ignoreDefense: false,
canCrit: true,
}
let final = caster.ap * config.ap / 100;
// 伤害浮动±10%
const damageFloat = 0.9 + Math.random() * 0.2; // 0.9~1.1
final *= damageFloat;
final = Math.round(final);
result.value = Math.max(1, final); // 确保最小伤害为1
result.isCrit = false;
return result;
}
private applyDamage(targetView: HeroViewComp, result: any,) {;
this._damageQueue.push({
timer: 0,
callback: () => {
if (!targetView?.ent.has(HeroViewComp)) return;
let remainingDamage = result.value;
if (targetView.shield > 0) {
const shieldAbsorb = Math.min(targetView.shield, remainingDamage);
targetView.shield -= shieldAbsorb;
remainingDamage -= shieldAbsorb;
if (targetView.shield <= 0) {
targetView.BUFFCOMP.show_shield(false);
}
}
if (remainingDamage > 0) {
targetView.hp -= remainingDamage;
if(targetView.hp <= 0) {
targetView.BUFFCOMP.dead()
targetView.to_grave();
}
targetView.showDamage(result.value, true);
} else {
targetView.BUFFCOMP.tooltip(5,"*吸收*");
}
}
});
}
public clear_timer() {
console.log("clear_timer");
Object.values(this._timers).forEach(clearTimeout);
}
onDestroy() {
Object.values(this._timers).forEach(clearTimeout);
}
/** 应用负面状态 */
private applyDebuff(target: ecs.Entity, config: typeof SkillSet[keyof typeof SkillSet]) {
// 实现debuff逻辑...
}
}

View File

@@ -1,9 +0,0 @@
{
"ver": "4.0.23",
"importer": "typescript",
"imported": true,
"uuid": "9b14bcef-b9c5-4132-ab96-e089fc1d8545",
"files": [],
"subMetas": {},
"userData": {}
}