Merge branch 'card' of git.eoxnet.com:pan/pixelheros into card
This commit is contained in:
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -110,7 +110,7 @@
|
||||
},
|
||||
"_lpos": {
|
||||
"__type__": "cc.Vec3",
|
||||
"x": 45,
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"z": 0
|
||||
},
|
||||
@@ -151,8 +151,8 @@
|
||||
},
|
||||
"_contentSize": {
|
||||
"__type__": "cc.Size",
|
||||
"width": 160,
|
||||
"height": 160
|
||||
"width": 200,
|
||||
"height": 200
|
||||
},
|
||||
"_anchorPoint": {
|
||||
"__type__": "cc.Vec2",
|
||||
@@ -294,8 +294,8 @@
|
||||
},
|
||||
"_lpos": {
|
||||
"__type__": "cc.Vec3",
|
||||
"x": 45,
|
||||
"y": 17.631,
|
||||
"x": 0,
|
||||
"y": 11.301,
|
||||
"z": 0
|
||||
},
|
||||
"_lrot": {
|
||||
@@ -307,8 +307,8 @@
|
||||
},
|
||||
"_lscale": {
|
||||
"__type__": "cc.Vec3",
|
||||
"x": -0.8,
|
||||
"y": 0.8,
|
||||
"x": -1,
|
||||
"y": 1,
|
||||
"z": 1
|
||||
},
|
||||
"_mobility": 0,
|
||||
@@ -509,7 +509,7 @@
|
||||
"_top": 0,
|
||||
"_bottom": 0,
|
||||
"_horizontalCenter": 0,
|
||||
"_verticalCenter": 17.631,
|
||||
"_verticalCenter": 11.301,
|
||||
"_isAbsLeft": true,
|
||||
"_isAbsRight": true,
|
||||
"_isAbsTop": true,
|
||||
@@ -572,7 +572,7 @@
|
||||
},
|
||||
"_lpos": {
|
||||
"__type__": "cc.Vec3",
|
||||
"x": 103.653,
|
||||
"x": 72.111,
|
||||
"y": 0,
|
||||
"z": 0
|
||||
},
|
||||
@@ -772,8 +772,8 @@
|
||||
},
|
||||
"_contentSize": {
|
||||
"__type__": "cc.Size",
|
||||
"width": 60,
|
||||
"height": 170
|
||||
"width": 80,
|
||||
"height": 210
|
||||
},
|
||||
"_anchorPoint": {
|
||||
"__type__": "cc.Vec2",
|
||||
@@ -991,8 +991,8 @@
|
||||
},
|
||||
"_lpos": {
|
||||
"__type__": "cc.Vec3",
|
||||
"x": 45,
|
||||
"y": -8.595,
|
||||
"x": 0,
|
||||
"y": -12.461,
|
||||
"z": 0
|
||||
},
|
||||
"_lrot": {
|
||||
@@ -1085,8 +1085,8 @@
|
||||
},
|
||||
"_contentSize": {
|
||||
"__type__": "cc.Size",
|
||||
"width": 90,
|
||||
"height": 20
|
||||
"width": 105,
|
||||
"height": 25
|
||||
},
|
||||
"_anchorPoint": {
|
||||
"__type__": "cc.Vec2",
|
||||
@@ -1163,8 +1163,8 @@
|
||||
"_target": null,
|
||||
"_left": 0,
|
||||
"_right": 0,
|
||||
"_top": 0,
|
||||
"_bottom": 0,
|
||||
"_top": -2.5,
|
||||
"_bottom": -2.5,
|
||||
"_horizontalCenter": 0,
|
||||
"_verticalCenter": 0,
|
||||
"_isAbsLeft": true,
|
||||
@@ -1435,8 +1435,8 @@
|
||||
"_string": "99999",
|
||||
"_horizontalAlign": 1,
|
||||
"_verticalAlign": 1,
|
||||
"_actualFontSize": 18,
|
||||
"_fontSize": 18,
|
||||
"_actualFontSize": 20,
|
||||
"_fontSize": 20,
|
||||
"_fontFamily": "Arial",
|
||||
"_lineHeight": 20,
|
||||
"_overflow": 2,
|
||||
@@ -1505,7 +1505,7 @@
|
||||
},
|
||||
"_contentSize": {
|
||||
"__type__": "cc.Size",
|
||||
"width": 90,
|
||||
"width": 105,
|
||||
"height": 20
|
||||
},
|
||||
"_anchorPoint": {
|
||||
@@ -1649,8 +1649,8 @@
|
||||
},
|
||||
"_lpos": {
|
||||
"__type__": "cc.Vec3",
|
||||
"x": 45,
|
||||
"y": -26.278,
|
||||
"x": 0,
|
||||
"y": -35.14,
|
||||
"z": 0
|
||||
},
|
||||
"_lrot": {
|
||||
@@ -1743,8 +1743,8 @@
|
||||
},
|
||||
"_contentSize": {
|
||||
"__type__": "cc.Size",
|
||||
"width": 90,
|
||||
"height": 20
|
||||
"width": 105,
|
||||
"height": 25
|
||||
},
|
||||
"_anchorPoint": {
|
||||
"__type__": "cc.Vec2",
|
||||
@@ -1821,8 +1821,8 @@
|
||||
"_target": null,
|
||||
"_left": 0,
|
||||
"_right": 0,
|
||||
"_top": 0,
|
||||
"_bottom": 0,
|
||||
"_top": -2.5,
|
||||
"_bottom": -2.5,
|
||||
"_horizontalCenter": 0,
|
||||
"_verticalCenter": 0,
|
||||
"_isAbsLeft": true,
|
||||
@@ -2093,8 +2093,8 @@
|
||||
"_string": "99999",
|
||||
"_horizontalAlign": 1,
|
||||
"_verticalAlign": 1,
|
||||
"_actualFontSize": 18,
|
||||
"_fontSize": 18,
|
||||
"_actualFontSize": 20,
|
||||
"_fontSize": 20,
|
||||
"_fontFamily": "Arial",
|
||||
"_lineHeight": 20,
|
||||
"_overflow": 2,
|
||||
@@ -2163,7 +2163,7 @@
|
||||
},
|
||||
"_contentSize": {
|
||||
"__type__": "cc.Size",
|
||||
"width": 90,
|
||||
"width": 105,
|
||||
"height": 20
|
||||
},
|
||||
"_anchorPoint": {
|
||||
@@ -2310,7 +2310,7 @@
|
||||
},
|
||||
"_lpos": {
|
||||
"__type__": "cc.Vec3",
|
||||
"x": 45,
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"z": 0
|
||||
},
|
||||
@@ -2582,8 +2582,8 @@
|
||||
},
|
||||
"_contentSize": {
|
||||
"__type__": "cc.Size",
|
||||
"width": 180,
|
||||
"height": 180
|
||||
"width": 220,
|
||||
"height": 220
|
||||
},
|
||||
"_anchorPoint": {
|
||||
"__type__": "cc.Vec2",
|
||||
@@ -3241,8 +3241,8 @@
|
||||
},
|
||||
"_contentSize": {
|
||||
"__type__": "cc.Size",
|
||||
"width": 90,
|
||||
"height": 90
|
||||
"width": 110,
|
||||
"height": 110
|
||||
},
|
||||
"_anchorPoint": {
|
||||
"__type__": "cc.Vec2",
|
||||
@@ -5242,8 +5242,8 @@
|
||||
},
|
||||
"_lpos": {
|
||||
"__type__": "cc.Vec3",
|
||||
"x": 45,
|
||||
"y": 40.66599999999994,
|
||||
"x": 0,
|
||||
"y": 46.513,
|
||||
"z": 0
|
||||
},
|
||||
"_lrot": {
|
||||
@@ -5392,12 +5392,12 @@
|
||||
},
|
||||
"_contentSize": {
|
||||
"__type__": "cc.Size",
|
||||
"width": 90,
|
||||
"height": 90
|
||||
"width": 110,
|
||||
"height": 110
|
||||
},
|
||||
"_anchorPoint": {
|
||||
"__type__": "cc.Vec2",
|
||||
"x": 0,
|
||||
"x": 0.5,
|
||||
"y": 0.5
|
||||
},
|
||||
"_id": ""
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -47,10 +47,13 @@
|
||||
},
|
||||
{
|
||||
"__id__": 187
|
||||
},
|
||||
{
|
||||
"__id__": 189
|
||||
}
|
||||
],
|
||||
"_prefab": {
|
||||
"__id__": 189
|
||||
"__id__": 191
|
||||
},
|
||||
"_lpos": {
|
||||
"__type__": "cc.Vec3",
|
||||
@@ -3832,6 +3835,8 @@
|
||||
"__id__": 0
|
||||
},
|
||||
"fileId": "60zyAJG75FD4lr3BUqk8h+",
|
||||
"instance": null,
|
||||
"targetOverrides": null,
|
||||
"nestedPrefabInstanceRoots": null
|
||||
},
|
||||
{
|
||||
@@ -3966,6 +3971,8 @@
|
||||
"__id__": 0
|
||||
},
|
||||
"fileId": "5baCaOgaJJj5xGYYZRPLag",
|
||||
"instance": null,
|
||||
"targetOverrides": null,
|
||||
"nestedPrefabInstanceRoots": null
|
||||
},
|
||||
{
|
||||
@@ -4320,6 +4327,24 @@
|
||||
"__type__": "cc.CompPrefabInfo",
|
||||
"fileId": "a8f3R/dcVJa4WiCkhL/wGK"
|
||||
},
|
||||
{
|
||||
"__type__": "cc.BlockInputEvents",
|
||||
"_name": "",
|
||||
"_objFlags": 0,
|
||||
"__editorExtras__": {},
|
||||
"node": {
|
||||
"__id__": 1
|
||||
},
|
||||
"_enabled": true,
|
||||
"__prefab": {
|
||||
"__id__": 190
|
||||
},
|
||||
"_id": ""
|
||||
},
|
||||
{
|
||||
"__type__": "cc.CompPrefabInfo",
|
||||
"fileId": "06K0yfnYlMPJjdjg9cQ8Rg"
|
||||
},
|
||||
{
|
||||
"__type__": "cc.PrefabInfo",
|
||||
"root": {
|
||||
@@ -4330,6 +4355,7 @@
|
||||
},
|
||||
"fileId": "84hrfbDo1AOq3VROGZvWWt",
|
||||
"instance": null,
|
||||
"targetOverrides": null,
|
||||
"nestedPrefabInstanceRoots": [
|
||||
{
|
||||
"__id__": 151
|
||||
|
||||
@@ -158,34 +158,34 @@ export const HeroInfo: Record<number, heroInfo> = {
|
||||
|
||||
|
||||
// ========== 法师英雄 ==========
|
||||
5101:{uuid:5101,name:t("hero_name_5101"),path:"hm2", fac:FacSet.HERO,cards_lv:1,lv:1,type:HType.Long,hp:50,ap:60,speed:800,revive:{s_uuid:6501,r_num:1,upr:0.5},
|
||||
5101:{uuid:5101,name:t("hero_name_5101"),path:"hm2", fac:FacSet.HERO,cards_lv:1,lv:1,type:HType.Long,hp:150,ap:60,speed:800,revive:{s_uuid:6501,r_num:1,upr:0.5},
|
||||
skills:{6201:{uuid:6007,lv:1,cd:1,ccd:0}},info:t("hero_info_5101")},
|
||||
5102:{uuid:5102,name:t("hero_name_5102"),path:"hm1", fac:FacSet.HERO,cards_lv:2,lv:1,type:HType.Long,hp:30,ap:120,speed:800,
|
||||
5102:{uuid:5102,name:t("hero_name_5102"),path:"hm1", fac:FacSet.HERO,cards_lv:2,lv:1,type:HType.Long,hp:130,ap:120,speed:800,
|
||||
skills:{6203:{uuid:6002,lv:1,cd:1,ccd:0}},info:t("hero_info_5102")},
|
||||
5103:{uuid:5103,name:t("hero_name_5103"),path:"hm9", fac:FacSet.HERO,cards_lv:3,lv:1,type:HType.Long,hp:45,ap:180,speed:800,
|
||||
5103:{uuid:5103,name:t("hero_name_5103"),path:"hm9", fac:FacSet.HERO,cards_lv:3,lv:1,type:HType.Long,hp:145,ap:180,speed:800,
|
||||
skills:{6201:{uuid:6002,lv:1,cd:1,ccd:0}},info:t("hero_info_5103")},
|
||||
5104:{uuid:5104,name:t("hero_name_5104"),path:"hm4", fac:FacSet.HERO,cards_lv:4,lv:1,type:HType.Long,hp:60,ap:240,speed:800,
|
||||
5104:{uuid:5104,name:t("hero_name_5104"),path:"hm4", fac:FacSet.HERO,cards_lv:4,lv:1,type:HType.Long,hp:160,ap:240,speed:800,
|
||||
skills:{6201:{uuid:66002201,lv:1,cd:1,ccd:0}},info:t("hero_info_5104")},
|
||||
5105:{uuid:5105,name:t("hero_name_5105"),path:"hm3", fac:FacSet.HERO,cards_lv:5,lv:1,type:HType.Long,hp:75,ap:300,speed:800,
|
||||
5105:{uuid:5105,name:t("hero_name_5105"),path:"hm3", fac:FacSet.HERO,cards_lv:5,lv:1,type:HType.Long,hp:175,ap:300,speed:800,
|
||||
skills:{6203:{uuid:6002,lv:1,cd:1,ccd:0}},info:t("hero_info_5105") },
|
||||
|
||||
// ========== 远程英雄 ==========
|
||||
5201:{uuid:5201,name:t("hero_name_5201"),path:"ha1", fac:FacSet.HERO,cards_lv:1,lv:1,type:HType.Long,hp:15,ap:60,speed:800,
|
||||
5201:{uuid:5201,name:t("hero_name_5201"),path:"ha1", fac:FacSet.HERO,cards_lv:1,lv:1,type:HType.Long,hp:115,ap:60,speed:800,
|
||||
skills:{6101:{uuid:6005,lv:1,cd:0.9,ccd:0}},info:t("hero_info_5201")},
|
||||
5202:{uuid:5202,name:t("hero_name_5202"),path:"ha2", fac:FacSet.HERO,cards_lv:3,lv:1,type:HType.Long,hp:45,ap:180,speed:800,
|
||||
5202:{uuid:5202,name:t("hero_name_5202"),path:"ha2", fac:FacSet.HERO,cards_lv:3,lv:1,type:HType.Long,hp:145,ap:180,speed:800,
|
||||
skills:{6011:{uuid:6005,lv:1,cd:0.9,ccd:0}},info:t("hero_info_5202")},
|
||||
5203:{uuid:5203,name:t("hero_name_5203"),path:"ha3", fac:FacSet.HERO,cards_lv:3,lv:1,type:HType.Long,hp:45,ap:180,speed:800,
|
||||
5203:{uuid:5203,name:t("hero_name_5203"),path:"ha3", fac:FacSet.HERO,cards_lv:3,lv:1,type:HType.Long,hp:145,ap:180,speed:800,
|
||||
skills:{6011:{uuid:6005,lv:1,cd:0.9,ccd:0}},info:t("hero_info_5203")},
|
||||
|
||||
// ========== 辅助英雄 ==========
|
||||
5301:{uuid:5301,name:t("hero_name_5301"),path:"hh1", fac:FacSet.HERO,cards_lv:1,lv:1,type:HType.Long,hp:15,ap:20,speed:800,atking:[{s_uuid:6302,t_num:2}],
|
||||
5301:{uuid:5301,name:t("hero_name_5301"),path:"hh1", fac:FacSet.HERO,cards_lv:1,lv:1,type:HType.Long,hp:115,ap:50,speed:800,atking:[{s_uuid:6302,t_num:2}],
|
||||
skills:{6202:{uuid:6004,lv:1,cd:1.2,ccd:0}},info:t("hero_info_5301") },
|
||||
5302:{uuid:5302,name:t("hero_name_5302"),path:"hz1", fac:FacSet.HERO,cards_lv:2,lv:1,type:HType.Long,hp:30,ap:40,speed:800,atking:[{s_uuid:6304,t_num:2}],
|
||||
5302:{uuid:5302,name:t("hero_name_5302"),path:"hz1", fac:FacSet.HERO,cards_lv:2,lv:1,type:HType.Long,hp:130,ap:50,speed:800,atking:[{s_uuid:6304,t_num:2}],
|
||||
skills:{6202:{uuid:6004,lv:1,cd:1.2,ccd:0}},info:t("hero_info_5302")},
|
||||
|
||||
5303:{uuid:5303,name:t("hero_name_5303"),path:"hm6", fac:FacSet.HERO,cards_lv:4,lv:1,type:HType.Long,hp:60,ap:80,speed:800,
|
||||
5303:{uuid:5303,name:t("hero_name_5303"),path:"hm6", fac:FacSet.HERO,cards_lv:4,lv:1,type:HType.Long,hp:160,ap:80,speed:800,
|
||||
skills:{6202:{uuid:6004,lv:1,cd:1.2,ccd:0}},info:t("hero_info_5303")},
|
||||
5304:{uuid:5304,name:t("hero_name_5304"),path:"hm7", fac:FacSet.HERO,cards_lv:6,lv:1,type:HType.Long,hp:90,ap:120,speed:800,
|
||||
5304:{uuid:5304,name:t("hero_name_5304"),path:"hm7", fac:FacSet.HERO,cards_lv:6,lv:1,type:HType.Long,hp:190,ap:120,speed:800,
|
||||
skills:{6202:{uuid:6004,lv:1,cd:1.2,ccd:0}},info:t("hero_info_5304")},
|
||||
|
||||
|
||||
|
||||
@@ -157,6 +157,7 @@ export class CardComp extends CCComp {
|
||||
|
||||
/** 组件销毁时解绑所有事件,防止残留回调 */
|
||||
onDestroy() {
|
||||
super.onDestroy();
|
||||
this.unbindEvents();
|
||||
}
|
||||
|
||||
|
||||
@@ -60,6 +60,9 @@ export class HInfoComp extends CCComp {
|
||||
@property(Node)
|
||||
lv_node=null!
|
||||
|
||||
@property(Number)
|
||||
node_index=0
|
||||
|
||||
/** 绑定的英雄 ECS 实体 ID */
|
||||
private eid: number = 0;
|
||||
/** 绑定的英雄属性数据模型引用 */
|
||||
@@ -80,6 +83,7 @@ export class HInfoComp extends CCComp {
|
||||
}
|
||||
|
||||
onDestroy() {
|
||||
super.onDestroy();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -79,6 +79,7 @@ export class IBoxComp extends CCComp {
|
||||
|
||||
/** 解绑点击事件 */
|
||||
onDestroy() {
|
||||
super.onDestroy();
|
||||
if (this.node && this.node.isValid) {
|
||||
this.node.off(NodeEventType.TOUCH_END, this.onTapClose, this);
|
||||
}
|
||||
|
||||
@@ -84,6 +84,7 @@ export class MissSkillsComp extends CCComp {
|
||||
|
||||
/** 移除事件监听 */
|
||||
onDestroy() {
|
||||
super.onDestroy();
|
||||
oops.message.off(GameEvent.UseSkillCard, this.onUseSkillCard, this);
|
||||
oops.message.off(GameEvent.RemoveSkillBox, this.onRemoveSkillBox, this);
|
||||
}
|
||||
|
||||
@@ -150,6 +150,8 @@ export class MissionCardComp extends CCComp {
|
||||
model: HeroAttrsComp,
|
||||
comp: HInfoComp
|
||||
}> = new Map();
|
||||
/** 缓存预先放置的 6 个 HInfoComp */
|
||||
private cachedHInfoComps: Map<number, HInfoComp> = new Map();
|
||||
// ======================== 生命周期 ========================
|
||||
|
||||
/**
|
||||
@@ -161,6 +163,7 @@ export class MissionCardComp extends CCComp {
|
||||
* 5. 触发首次任务开始流程。
|
||||
*/
|
||||
onLoad() {
|
||||
this.cacheHInfoComps();
|
||||
this.bindEvents();
|
||||
this.cacheCardComps();
|
||||
this.layoutCardSlots();
|
||||
@@ -171,9 +174,23 @@ export class MissionCardComp extends CCComp {
|
||||
poolLv: this.poolLv
|
||||
});
|
||||
}
|
||||
|
||||
private cacheHInfoComps() {
|
||||
this.cachedHInfoComps.clear();
|
||||
if (!this.hero_info_node) return;
|
||||
for (let i = 0; i < this.hero_info_node.children.length; i++) {
|
||||
const child = this.hero_info_node.children[i];
|
||||
const comp = (child.getComponent(HInfoComp) || child.getComponent("HInfoComp")) as HInfoComp;
|
||||
if (comp && comp.node_index > 0) {
|
||||
this.cachedHInfoComps.set(comp.node_index, comp);
|
||||
child.active = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** 组件销毁时解绑所有事件并清理英雄信息面板 */
|
||||
onDestroy() {
|
||||
super.onDestroy();
|
||||
if (this.cards_chou && this.cards_chou.isValid) {
|
||||
this.cards_chou.off(NodeEventType.TOUCH_START, this.onDrawTouchStart, this);
|
||||
this.cards_chou.off(NodeEventType.TOUCH_END, this.onDrawTouchEnd, this);
|
||||
@@ -879,68 +896,115 @@ export class MissionCardComp extends CCComp {
|
||||
}
|
||||
|
||||
private ensureHeroInfoPanel(eid: number, model: HeroAttrsComp) {
|
||||
if (!this.hero_info_node || !this.hero_info_prefab) {
|
||||
mLogger.error(this.debugMode, "MissionCardComp", "ensureHeroInfoPanel: missing hero_info_node or hero_info_prefab");
|
||||
if (!this.hero_info_node) {
|
||||
mLogger.error(this.debugMode, "MissionCardComp", "ensureHeroInfoPanel: missing hero_info_node");
|
||||
return;
|
||||
}
|
||||
this.hero_info_node.active = true;
|
||||
|
||||
// MoveComp.ts 里的 assignment:
|
||||
// lanePriority = [1, 0, 2]; // slotIndex 0->中路(1), 1->上路(0), 2->下路(2)
|
||||
// laneIdx = lanePriority[slotIndex % 3]; // priority: 1(中), 0(上), 2(下)
|
||||
// model.lane = laneIdx;
|
||||
//
|
||||
// 所以当:
|
||||
// model.lane = 0 (上路), model.lane_index = 0 -> 对应 node_index = 1
|
||||
// model.lane = 1 (中路), model.lane_index = 0 -> 对应 node_index = 2
|
||||
// model.lane = 2 (下路), model.lane_index = 0 -> 对应 node_index = 3
|
||||
const expectedNodeIndex = model.lane_index * 3 + model.lane + 1;
|
||||
|
||||
mLogger.log(this.debugMode, "MissionCardComp", `ensureHeroInfoPanel calculation: lane=${model.lane}, lane_index=${model.lane_index} -> expectedNodeIndex=${expectedNodeIndex}`);
|
||||
|
||||
const comp = this.cachedHInfoComps.get(expectedNodeIndex);
|
||||
|
||||
if (!comp) {
|
||||
mLogger.error(this.debugMode, "MissionCardComp", `ensureHeroInfoPanel: missing pre-placed HInfoComp for index ${expectedNodeIndex}`);
|
||||
return;
|
||||
}
|
||||
|
||||
const current = this.heroInfoItems.get(eid);
|
||||
if (current) {
|
||||
current.model = model;
|
||||
current.comp.bindData(eid, model);
|
||||
current.comp = comp;
|
||||
current.node = comp.node;
|
||||
comp.node.active = true;
|
||||
comp.bindData(eid, model);
|
||||
this.updateHeroInfoPanel(current);
|
||||
return;
|
||||
}
|
||||
|
||||
mLogger.log(this.debugMode, "MissionCardComp", "ensureHeroInfoPanel: creating new panel for eid", eid);
|
||||
const node = instantiate(this.hero_info_prefab);
|
||||
node.parent = this.hero_info_node;
|
||||
node.active = true;
|
||||
|
||||
// 尝试两种方式获取组件,并输出日志
|
||||
let comp = node.getComponent(HInfoComp) as any;
|
||||
if (!comp) {
|
||||
comp = node.getComponent("HInfoComp") as any;
|
||||
}
|
||||
|
||||
if (!comp) {
|
||||
mLogger.error(this.debugMode, "MissionCardComp", "ensureHeroInfoPanel: Failed to get HInfoComp from prefab!");
|
||||
node.destroy();
|
||||
return;
|
||||
}
|
||||
|
||||
comp.node.active = true;
|
||||
const item = {
|
||||
node,
|
||||
node: comp.node,
|
||||
model,
|
||||
comp
|
||||
};
|
||||
comp.bindData(eid, model);
|
||||
comp.setBattlePhase(this.isBattlePhase);
|
||||
this.heroInfoItems.set(eid, item);
|
||||
this.relayoutHeroInfoPanels();
|
||||
this.updateHeroInfoPanel(item);
|
||||
|
||||
mLogger.log(this.debugMode, "MissionCardComp", `ensureHeroInfoPanel: new panel created for eid ${eid}, final position:`, item.node.position);
|
||||
mLogger.log(this.debugMode, "MissionCardComp", `ensureHeroInfoPanel: updated panel for eid ${eid} at node_index ${expectedNodeIndex}`);
|
||||
}
|
||||
|
||||
private refreshHeroInfoPanels() {
|
||||
const removeKeys: number[] = [];
|
||||
|
||||
// 1. 先将已死亡的英雄移除,释放占用的节点
|
||||
this.heroInfoItems.forEach((item, eid) => {
|
||||
if (!item.node || !item.node.isValid) {
|
||||
removeKeys.push(eid);
|
||||
return;
|
||||
}
|
||||
if (!item.comp.isModelAlive()) {
|
||||
if (item.node.isValid) item.node.destroy();
|
||||
// 使用 model.is_dead 增加判断条件,更加准确
|
||||
if (!item.comp.isModelAlive() || item.model.is_dead) {
|
||||
if (item.node.isValid) item.node.active = false;
|
||||
removeKeys.push(eid);
|
||||
return;
|
||||
}
|
||||
this.updateHeroInfoPanel(item);
|
||||
});
|
||||
for (let i = 0; i < removeKeys.length; i++) {
|
||||
this.heroInfoItems.delete(removeKeys[i]);
|
||||
}
|
||||
this.relayoutHeroInfoPanels();
|
||||
|
||||
// 2. 然后再处理所有存活英雄的位置转移和信息刷新
|
||||
// 如果有多个英雄在同一帧发生位置变动,我们需要统一处理
|
||||
const needTransfer: Array<{eid: number, expectedNodeIndex: number}> = [];
|
||||
|
||||
this.heroInfoItems.forEach((item, eid) => {
|
||||
// 检查英雄是否改变了位置 (lane 或 lane_index 发生了变化)
|
||||
const expectedNodeIndex = item.model.lane_index * 3 + item.model.lane + 1;
|
||||
|
||||
if (item.comp.node_index !== expectedNodeIndex) {
|
||||
// 如果位置变了,需要转移到新的节点上
|
||||
const newComp = this.cachedHInfoComps.get(expectedNodeIndex);
|
||||
if (newComp) {
|
||||
needTransfer.push({eid, expectedNodeIndex});
|
||||
// 将原来的节点释放,以供其他可能换到这个位置的英雄使用
|
||||
item.node.active = false;
|
||||
}
|
||||
} else {
|
||||
this.updateHeroInfoPanel(item);
|
||||
}
|
||||
});
|
||||
|
||||
// 执行位置转移
|
||||
for (const transfer of needTransfer) {
|
||||
const item = this.heroInfoItems.get(transfer.eid);
|
||||
if (!item) continue;
|
||||
|
||||
const newComp = this.cachedHInfoComps.get(transfer.expectedNodeIndex);
|
||||
if (newComp) {
|
||||
// 转移到新节点
|
||||
item.comp = newComp;
|
||||
item.node = newComp.node;
|
||||
item.node.active = true;
|
||||
item.comp.bindData(transfer.eid, item.model);
|
||||
item.comp.setBattlePhase(this.isBattlePhase);
|
||||
|
||||
this.updateHeroInfoPanel(item);
|
||||
}
|
||||
}
|
||||
|
||||
this.updateHeroNumUI(false, false);
|
||||
}
|
||||
|
||||
@@ -953,54 +1017,24 @@ export class MissionCardComp extends CCComp {
|
||||
item.comp.setBattlePhase(this.isBattlePhase);
|
||||
}
|
||||
|
||||
private relayoutHeroInfoPanels() {
|
||||
const sortedItems = [...this.heroInfoItems.values()].sort((a, b) => {
|
||||
const aEnt = (a.model as any)?.ent as ecs.Entity | undefined;
|
||||
const bEnt = (b.model as any)?.ent as ecs.Entity | undefined;
|
||||
const aView = aEnt?.get(HeroViewComp);
|
||||
const bView = bEnt?.get(HeroViewComp);
|
||||
const aMove = aEnt?.get(MoveComp);
|
||||
const bMove = bEnt?.get(MoveComp);
|
||||
// 排序逻辑反转:适应 cc.Layout 的节点渲染顺序(先渲染/index小的在左边)
|
||||
// 1. x 坐标越小(越靠后排)的,index 应该越小
|
||||
const aFrontScore = aView?.node?.position?.x ?? -999999;
|
||||
const bFrontScore = bView?.node?.position?.x ?? -999999;
|
||||
if (aFrontScore !== bFrontScore) return aFrontScore - bFrontScore;
|
||||
|
||||
const aSpawnOrder = aMove?.spawnOrder ?? 0;
|
||||
const bSpawnOrder = bMove?.spawnOrder ?? 0;
|
||||
if (aSpawnOrder !== bSpawnOrder) return aSpawnOrder - bSpawnOrder;
|
||||
|
||||
const aEid = aEnt?.eid ?? 0;
|
||||
const bEid = bEnt?.eid ?? 0;
|
||||
return aEid - bEid;
|
||||
});
|
||||
|
||||
for (let index = 0; index < sortedItems.length; index++) {
|
||||
const item = sortedItems[index];
|
||||
if (!item.node || !item.node.isValid) continue;
|
||||
|
||||
// 既然使用了 cc.Layout 进行自动排版,我们只需设置渲染顺序
|
||||
// Layout 会自动根据 siblingIndex 对所有子节点重新排位
|
||||
item.node.setSiblingIndex(index);
|
||||
}
|
||||
}
|
||||
|
||||
private clearHeroInfoPanels() {
|
||||
if (this.heroInfoItems) {
|
||||
this.heroInfoItems.forEach(item => {
|
||||
if (item && item.node && item.node.isValid) {
|
||||
item.node.destroy();
|
||||
}
|
||||
});
|
||||
this.heroInfoItems.clear();
|
||||
}
|
||||
if (this.hero_info_node && this.hero_info_node.isValid) {
|
||||
for (let i = this.hero_info_node.children.length - 1; i >= 0; i--) {
|
||||
const child = this.hero_info_node.children[i];
|
||||
if (child && child.isValid) child.destroy();
|
||||
}
|
||||
if (this.cachedHInfoComps) {
|
||||
this.cachedHInfoComps.forEach(comp => {
|
||||
if (comp && comp.node && comp.node.isValid) {
|
||||
comp.node.active = false;
|
||||
}
|
||||
});
|
||||
}
|
||||
// 不再销毁子节点,因为它们是预先放置的
|
||||
// if (this.hero_info_node && this.hero_info_node.isValid) {
|
||||
// for (let i = this.hero_info_node.children.length - 1; i >= 0; i--) {
|
||||
// const child = this.hero_info_node.children[i];
|
||||
// if (child && child.isValid) child.destroy();
|
||||
// }
|
||||
// }
|
||||
this.heroInfoSyncTimer = 0;
|
||||
this.syncMissionHeroData(0);
|
||||
this.updateHeroNumUI(false, false);
|
||||
|
||||
@@ -201,6 +201,7 @@ export class MissionComp extends CCComp {
|
||||
}
|
||||
|
||||
onDestroy(){
|
||||
super.onDestroy();
|
||||
if (this.start_btn && this.start_btn.isValid) {
|
||||
this.start_btn.off(NodeEventType.TOUCH_END, this.onStartFightBtnClick, this);
|
||||
}
|
||||
|
||||
@@ -101,6 +101,7 @@ export class MissionHeroCompComp extends CCComp {
|
||||
}
|
||||
|
||||
onDestroy(){
|
||||
super.onDestroy();
|
||||
// 清理全部监听
|
||||
oops.message.off(GameEvent.CallHero,this.call_hero,this)
|
||||
oops.message.off("PhasePrepareStart",this.fight_ready,this)
|
||||
@@ -196,8 +197,8 @@ export class MissionHeroCompComp extends CCComp {
|
||||
|
||||
// 优先中路(1) -> 上路(0) -> 下路(2)
|
||||
const priority = [1, 0, 2];
|
||||
for (const lane of priority) {
|
||||
for (let indexInLane = 0; indexInLane < MissionHeroCompComp.HERO_LANE_CAP; indexInLane++) {
|
||||
for (let indexInLane = 0; indexInLane < MissionHeroCompComp.HERO_LANE_CAP; indexInLane++) {
|
||||
for (const lane of priority) {
|
||||
if (!occupied[lane][indexInLane]) {
|
||||
return { lane, indexInLane };
|
||||
}
|
||||
|
||||
@@ -66,7 +66,7 @@ export class RanksComp extends CCComp {
|
||||
}
|
||||
|
||||
onDestroy() {
|
||||
|
||||
super.onDestroy();
|
||||
}
|
||||
|
||||
/** 关闭排行榜弹窗 */
|
||||
|
||||
@@ -92,6 +92,7 @@ export class SkillBoxComp extends CCComp {
|
||||
|
||||
/** 销毁时移除所有事件监听并通知槽位管理器回收 */
|
||||
onDestroy() {
|
||||
super.onDestroy();
|
||||
oops.message.off(GameEvent.FightStart, this.onFightStart, this);
|
||||
oops.message.off(GameEvent.MissionEnd, this.onMissionEnd, this);
|
||||
if (this.node && this.node.isValid) {
|
||||
|
||||
@@ -113,6 +113,7 @@ export class TalentItemComp extends CCComp {
|
||||
}
|
||||
|
||||
protected onDestroy(): void {
|
||||
super.onDestroy();
|
||||
if (this.btn_upgrade && this.btn_upgrade.node && this.btn_upgrade.node.isValid) {
|
||||
this.btn_upgrade.node.off(Button.EventType.CLICK, this.onUpgradeClicked, this);
|
||||
}
|
||||
|
||||
@@ -254,6 +254,7 @@ export class TalentsComp extends CCComp {
|
||||
}
|
||||
|
||||
protected onDestroy(): void {
|
||||
super.onDestroy();
|
||||
mLogger.log(this.debugMode, 'TalentsComp', "释放界面");
|
||||
if (this.btn_reset && this.btn_reset.node && this.btn_reset.node.isValid) {
|
||||
this.btn_reset.node.off(Button.EventType.CLICK, this.onResetClicked, this);
|
||||
|
||||
@@ -598,6 +598,7 @@ export class VictoryComp extends CCComp {
|
||||
}
|
||||
|
||||
protected onDestroy(): void {
|
||||
super.onDestroy();
|
||||
mLogger.log(this.debugMode, 'VictoryComp', "释放胜利界面");
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user