fix: 修复技能节点池逻辑并调整UI显示
- 修复技能节点池获取和回收时的有效性检查,避免无效节点 - 修复技能父节点查找逻辑,增加空值检查 - 调整卡牌UI的文本样式和宽度 - 启用SkillView调试日志以便问题排查 - 修复英雄后撤动画逻辑,取消注释 - 更新加载页面资源引用
This commit is contained in:
@@ -2901,7 +2901,7 @@
|
||||
"a": 255
|
||||
},
|
||||
"_spriteFrame": {
|
||||
"__uuid__": "6165ffc9-a838-4a33-b569-bdbaaab0e6b4@7a4bc",
|
||||
"__uuid__": "6165ffc9-a838-4a33-b569-bdbaaab0e6b4@ec5a5",
|
||||
"__expectedType__": "cc.SpriteFrame"
|
||||
},
|
||||
"_type": 0,
|
||||
@@ -3003,7 +3003,7 @@
|
||||
},
|
||||
"_contentSize": {
|
||||
"__type__": "cc.Size",
|
||||
"width": 15.123046875,
|
||||
"width": 17.90380859375,
|
||||
"height": 35.5
|
||||
},
|
||||
"_anchorPoint": {
|
||||
@@ -3042,8 +3042,8 @@
|
||||
"_string": "3",
|
||||
"_horizontalAlign": 1,
|
||||
"_verticalAlign": 1,
|
||||
"_actualFontSize": 20,
|
||||
"_fontSize": 20,
|
||||
"_actualFontSize": 25,
|
||||
"_fontSize": 25,
|
||||
"_fontFamily": "Arial",
|
||||
"_lineHeight": 25,
|
||||
"_overflow": 0,
|
||||
@@ -3052,7 +3052,7 @@
|
||||
"_isSystemFontUsed": true,
|
||||
"_spacingX": 0,
|
||||
"_isItalic": false,
|
||||
"_isBold": false,
|
||||
"_isBold": true,
|
||||
"_isUnderline": false,
|
||||
"_underlineHeight": 2,
|
||||
"_cacheMode": 0,
|
||||
|
||||
@@ -172,7 +172,10 @@
|
||||
"b": 0,
|
||||
"a": 134
|
||||
},
|
||||
"_spriteFrame": null,
|
||||
"_spriteFrame": {
|
||||
"__uuid__": "d7d869bc-06aa-4876-806f-487e68b96780@dc000",
|
||||
"__expectedType__": "cc.SpriteFrame"
|
||||
},
|
||||
"_type": 1,
|
||||
"_fillType": 0,
|
||||
"_sizeMode": 0,
|
||||
@@ -186,7 +189,7 @@
|
||||
"_isTrimmedMode": true,
|
||||
"_useGrayscale": false,
|
||||
"_atlas": {
|
||||
"__uuid__": "fbfc0bb3-1ab9-4b38-8173-112c0ac3e4eb",
|
||||
"__uuid__": "d7d869bc-06aa-4876-806f-487e68b96780",
|
||||
"__expectedType__": "cc.SpriteAtlas"
|
||||
},
|
||||
"_id": ""
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -460,16 +460,16 @@ export class HeroViewComp extends CCComp {
|
||||
.start()
|
||||
}
|
||||
|
||||
// if(this.model.fac==FacSet.HERO) {
|
||||
// let tx=this.node.position.x-5
|
||||
// if(tx < -320) tx=-320
|
||||
// tween(this.node)
|
||||
// .to(0.1, { position:v3(tx,this.node.position.y,0)})
|
||||
// .call(() => {
|
||||
// this.isBackingUp = false; // 🔥 动画完成后重置状态
|
||||
// })
|
||||
// .start()
|
||||
// }
|
||||
if(this.model.fac==FacSet.HERO) {
|
||||
let tx=this.node.position.x-5
|
||||
if(tx < -320) tx=-320
|
||||
tween(this.node)
|
||||
.to(0.1, { position:v3(tx,this.node.position.y,0)})
|
||||
.call(() => {
|
||||
this.isBackingUp = false; // 🔥 动画完成后重置状态
|
||||
})
|
||||
.start()
|
||||
}
|
||||
}
|
||||
// 伤害计算和战斗逻辑已迁移到 HeroBattleSystem
|
||||
|
||||
|
||||
@@ -22,14 +22,18 @@ export class Skill extends ecs.Entity {
|
||||
static getFromPool(path: string): Node | null {
|
||||
if (this.pools.has(path)) {
|
||||
const pool = this.pools.get(path)!;
|
||||
if (pool.size() > 0) {
|
||||
return pool.get();
|
||||
while (pool.size() > 0) {
|
||||
const node = pool.get();
|
||||
if (node && node.isValid) {
|
||||
return node;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
static putToPool(path: string, node: Node) {
|
||||
if (!node || !node.isValid) return;
|
||||
if (!this.pools.has(path)) {
|
||||
this.pools.set(path, new NodePool());
|
||||
}
|
||||
@@ -72,10 +76,29 @@ export class Skill extends ecs.Entity {
|
||||
return;
|
||||
}
|
||||
const node: Node = Skill.getFromPool(path) || instantiate(prefab);
|
||||
if (!node || !node.isValid) {
|
||||
mLogger.error(this.debugMode, 'Skill', "[Skill] 节点无效:", path);
|
||||
return;
|
||||
}
|
||||
|
||||
this.prefabPath = path;
|
||||
this.skillNode = node;
|
||||
var scene = smc.map.MapView.scene;
|
||||
node.parent = scene.entityLayer!.node!.getChildByName("SKILL") || parent;
|
||||
|
||||
let skillParent: Node | null = null;
|
||||
if (smc.map && smc.map.MapView && smc.map.MapView.scene && smc.map.MapView.scene.entityLayer && smc.map.MapView.scene.entityLayer.node) {
|
||||
skillParent = smc.map.MapView.scene.entityLayer.node.getChildByName("SKILL");
|
||||
}
|
||||
if (!skillParent || !skillParent.isValid) {
|
||||
skillParent = parent;
|
||||
}
|
||||
|
||||
if (!skillParent || !skillParent.isValid) {
|
||||
mLogger.error(this.debugMode, 'Skill', "[Skill] 父节点无效");
|
||||
if(node.isValid) node.destroy();
|
||||
return;
|
||||
}
|
||||
|
||||
node.parent = skillParent;
|
||||
// 设置节点属性
|
||||
let face=caster.node.scale.x < 0 ? -1 : 1
|
||||
node.setScale(v3(node.scale.x*face,node.scale.y,1))
|
||||
|
||||
@@ -22,7 +22,7 @@ export class SkillView extends CCComp {
|
||||
atk_y: number = 0
|
||||
|
||||
@property({ tooltip: "是否启用调试日志" })
|
||||
private debugMode: boolean = false;
|
||||
private debugMode: boolean = true;
|
||||
|
||||
anim:Animation=null;
|
||||
group:number=0;
|
||||
@@ -105,50 +105,6 @@ export class SkillView extends CCComp {
|
||||
mLogger.log(this.debugMode, 'SkillView', `[SkillView] [${this.SConf?.name}] 第${this.attackFrameCount}次攻击帧开启碰撞检测`);
|
||||
}
|
||||
|
||||
// let dis=this.node.getComponent(UITransform).width/2
|
||||
// let enemys:any=[]
|
||||
// if( this.sData.fac==FacSet.HERO){
|
||||
// enemys=ecs.query(ecs.allOf(MonMoveComp))
|
||||
// }else{
|
||||
// enemys=ecs.query(ecs.allOf(HeroMoveComp))
|
||||
// }
|
||||
// let IRTargets: HeroViewComp[] = []
|
||||
// // 收集范围内所有敌方目标
|
||||
// enemys.some(e => {
|
||||
// const view = e.get(HeroViewComp);
|
||||
// const model=e.get(HeroAttrsComp)
|
||||
// const distance = Math.abs(this.node.position.x - view.node.position.x);
|
||||
// if(distance <= dis&&!model.is_dead) {
|
||||
// IRTargets.push(view);
|
||||
// }
|
||||
|
||||
// });
|
||||
// // 根据配置的hit_num决定攻击模式
|
||||
// const hitNum = SkillSet[this.s_uuid].hit_num || 0;
|
||||
// if(hitNum > 0) {
|
||||
// // 限制目标数量:按距离排序,选择最近的N个目标
|
||||
// if(IRTargets.length > 0) {
|
||||
// // 按距离排序(从近到远)
|
||||
// IRTargets.sort((a, b) => {
|
||||
// const distanceA = Math.abs(this.node.position.x - a.node.position.x);
|
||||
// const distanceB = Math.abs(this.node.position.x - b.node.position.x);
|
||||
// return distanceA - distanceB;
|
||||
// });
|
||||
// // 限制目标数量
|
||||
// const maxTargets = Math.min(hitNum, IRTargets.length);
|
||||
// const sTargets = IRTargets.slice(0, maxTargets);
|
||||
// sTargets.forEach(target => {
|
||||
// this.apply_damage(target, false);
|
||||
// });
|
||||
// }
|
||||
// } else {
|
||||
// // 范围伤害:对所有范围内目标造成伤害
|
||||
// if(IRTargets.length > 0) {
|
||||
// IRTargets.forEach(target => {
|
||||
// this.apply_damage(target, true);
|
||||
// });
|
||||
// }
|
||||
// }
|
||||
}
|
||||
//伤害应用
|
||||
apply_damage(target:HeroViewComp,is_range:boolean=false){
|
||||
@@ -156,7 +112,12 @@ export class SkillView extends CCComp {
|
||||
// 安全检查:如果目标实体已不存在,直接返回
|
||||
if (!target.ent) return;
|
||||
if (!this.SConf) return;
|
||||
|
||||
// 检查技能是否应该销毁
|
||||
const max_hit_count=this.SConf.hit + this.sData.Attrs[Attrs.puncture]
|
||||
if ( this.sData.hit_count >= max_hit_count ) {
|
||||
this.close_collider()
|
||||
return
|
||||
}
|
||||
// 对于非持续碰撞类型的技能,在造成伤害后立即关闭碰撞检测
|
||||
// 这样可以避免同一帧内的重复伤害
|
||||
if(this.SConf.EType !== EType.collision && this.collider) {
|
||||
@@ -181,19 +142,23 @@ export class SkillView extends CCComp {
|
||||
);
|
||||
// 更新技能命中次数
|
||||
this.sData.hit_count++
|
||||
// 检查技能是否应该销毁
|
||||
if (
|
||||
this.sData.hit_count >= (this.SConf.hit + this.sData.Attrs[Attrs.puncture]) &&
|
||||
(this.SConf.DTType != DTType.range) &&
|
||||
(this.SConf.EType != EType.animationEnd) &&
|
||||
(this.SConf.EType != EType.timeEnd)
|
||||
) {
|
||||
// 修复:物理回调中不能直接销毁刚体,需延迟到下一帧
|
||||
this.scheduleOnce(() => {
|
||||
if (this.ent) {
|
||||
this.ent.destroy();
|
||||
}
|
||||
}, 0);
|
||||
(this.SConf.DTType != DTType.range) &&
|
||||
(this.SConf.EType != EType.animationEnd) &&
|
||||
(this.SConf.EType != EType.timeEnd)
|
||||
) {
|
||||
// 修复:物理回调中不能直接销毁刚体,需延迟到下一帧
|
||||
this.close_collider();
|
||||
this.scheduleOnce(() => {
|
||||
if (this.ent) {
|
||||
this.ent.destroy();
|
||||
}
|
||||
}, 0);
|
||||
}
|
||||
}
|
||||
close_collider(){
|
||||
if (this.collider) {
|
||||
this.collider.enabled = false;
|
||||
}
|
||||
}
|
||||
/** 视图对象通过 ecs.Entity.remove(ModuleViewComp) 删除组件是触发组件处理自定义释放逻辑 */
|
||||
|
||||
Reference in New Issue
Block a user