feat(map): 新增任务技能面板并优化技能触发逻辑

- 新增 mskills.prefab 作为任务技能容器
- 将 MissSkillsComp 挂载到场景实体层,移除 MissionCardComp 中的引用
- 优化 SkillBoxComp 触发坐标计算,改为基于父节点位置
- 调整技能盒尺寸并添加等级标签显示
- 修复战斗开始时技能触发计时器重置逻辑
This commit is contained in:
walkpan
2026-04-06 22:09:43 +08:00
parent 2010e2adc5
commit 62b7b9783a
8 changed files with 1716 additions and 1310 deletions

View File

@@ -5,6 +5,7 @@ import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/modu
import { SkillBoxComp } from "./SkillBoxComp";
import { oops } from "db://oops-framework/core/Oops";
import { GameEvent } from "../common/config/GameEvent";
import { smc } from "../common/SingletonModuleComp";
const { ccclass, property } = _decorator;
@@ -19,6 +20,7 @@ export class MissSkillsComp extends CCComp {
onLoad() {
oops.message.on(GameEvent.UseSkillCard, this.onUseSkillCard, this);
this.node.parent=smc.map.MapView.scene.entityLayer!.node!
}
onDestroy() {

View File

@@ -55,8 +55,6 @@ export class MissionCardComp extends CCComp {
hero_info_prefab:Prefab=null! //场上英雄信息面板Prefab
@property(Node)
hero_num_node:Node=null!
@property(Node)
miss_skill_node:Node=null!
/** 预留图集缓存(后续接入按钮/卡面图标时复用) */
private uiconsAtlas: SpriteAtlas | null = null;

View File

@@ -47,6 +47,7 @@ export class SkillBoxComp extends CCComp {
}
init(uuid: number, card_lv: number) {
// this.node.parent=smc.map.MapView.scene.entityLayer!.node!
this.s_uuid = uuid;
this.card_lv = card_lv;
@@ -104,7 +105,9 @@ export class SkillBoxComp extends CCComp {
this.in_combat = true;
if (!this.is_instant) {
this.timer = this.trigger_interval; // 确保第一次能立即或按间隔触发
// 战斗开始时计时归0重新计时
this.timer = 0;
// 如果这个技能每回合都可以触发 t_times 次,则在每回合开始时重置当前回合触发次数
this.current_trigger_times = 0;
}
}
@@ -141,7 +144,7 @@ export class SkillBoxComp extends CCComp {
if (this.current_trigger_times < this.trigger_times) {
this.timer += dt;
if (this.timer >= this.trigger_interval) {
this.timer = 0;
this.timer = 0; // 触发后重新计时
this.triggerSkill();
this.current_trigger_times++;
}
@@ -149,8 +152,13 @@ export class SkillBoxComp extends CCComp {
}
private triggerSkill() {
// 使用固定的全局坐标
const targetPos = new Vec3(-340, 30, 0);
// 获取自身在父节点下的局部坐标
// UI 的局部坐标在 2D 相机中和实际的游戏逻辑坐标存在偏移关系,
// 可以结合自身局部坐标做一次偏移,此处直接读取自身的 localPosition 加上父节点的偏移
let targetPos = new Vec3();
const localPos = this.node.position;
const parentPos = this.node.parent ? this.node.parent.position : new Vec3(0, 0, 0);
targetPos.set(parentPos.x + localPos.x, parentPos.y + localPos.y, 0);
oops.message.dispatchEvent(GameEvent.TriggerSkill, {
s_uuid: this.s_uuid,