- 在多个组件的onDestroy方法中添加节点有效性检查,防止无效节点上解绑事件 - 修复MissionComp中任务启动逻辑,改为通过UI打开方式触发MissionStart事件 - 添加新的任务界面(UIID.Mission)及相关配置 - 修复MissionCardComp中Map未初始化导致的空引用问题 - 优化按钮事件绑定和解绑逻辑,增加空值检查
135 lines
4.0 KiB
TypeScript
135 lines
4.0 KiB
TypeScript
/**
|
||
* @file MissionHomeComp.ts
|
||
* @description 任务主页组件(UI 视图层)
|
||
*
|
||
* 职责:
|
||
* 1. 作为玩家进入游戏后第一个看到的界面(主菜单/大厅)。
|
||
* 2. 提供"开始任务"按钮,触发 GameEvent.MissionStart 进入战斗。
|
||
* 3. 提供"排行榜"按钮,打开 RanksComp 弹窗。
|
||
* 4. 监听 MissionEnd 事件,任务结束后自动切回主页。
|
||
*
|
||
* 关键设计:
|
||
* - start_mission() 分发 MissionStart 事件并隐藏自身节点。
|
||
* - mission_end() 响应后重新显示主页。
|
||
* - isWxClient() 检测是否运行在微信小游戏环境。
|
||
*
|
||
* 依赖:
|
||
* - GameEvent.MissionStart / MissionEnd —— 游戏生命周期事件
|
||
* - UIID.Ranks —— 排行榜弹窗 ID
|
||
*/
|
||
import { _decorator, instantiate, Prefab, resources, Sprite, SpriteAtlas, UITransform ,Node} from "cc";
|
||
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
|
||
import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/module/common/CCComp";
|
||
import { oops } from "../../../../extensions/oops-plugin-framework/assets/core/Oops";
|
||
import { smc } from "../common/SingletonModuleComp";
|
||
import { GameEvent } from "../common/config/GameEvent";
|
||
import { Timer } from "db://oops-framework/core/common/timer/Timer";
|
||
import { mLogger } from "../common/Logger";
|
||
import { UIID } from "../common/config/GameUIConfig";
|
||
|
||
const { ccclass, property } = _decorator;
|
||
|
||
/**
|
||
* MissionHomeComp —— 任务主页视图组件
|
||
*
|
||
* 游戏大厅界面,提供开始战斗和查看排行的入口。
|
||
*/
|
||
@ccclass('MissionHomeComp')
|
||
@ecs.register('MissionHome', false)
|
||
export class MissionHomeComp extends CCComp {
|
||
/** 调试日志开关 */
|
||
debugMode: boolean = false;
|
||
|
||
/** 主页按钮节点(预留) */
|
||
@property(Node)
|
||
home_btn=null!
|
||
/** 英雄图鉴按钮节点(预留) */
|
||
@property(Node)
|
||
hero_btn=null!
|
||
/** 排行榜按钮节点 */
|
||
@property(Node)
|
||
rank_btn=null!
|
||
|
||
/** 注册任务结束事件 */
|
||
protected onLoad(): void {
|
||
this.on(GameEvent.MissionEnd,this.mission_end,this)
|
||
}
|
||
|
||
/** 启动时显示主页 */
|
||
start() {
|
||
this.home_active()
|
||
}
|
||
|
||
onEnable(){
|
||
}
|
||
|
||
update(dt:number){
|
||
|
||
}
|
||
|
||
/**
|
||
* 开始任务:
|
||
* 1. 打印日志。
|
||
* 2. 分发 MissionStart 事件,驱动 MissionComp / MissionCardComp 初始化战斗。
|
||
* 3. 隐藏主页节点。
|
||
* 4. 隐藏 mapLayer 下的 main 节点。
|
||
*/
|
||
start_mission() {
|
||
mLogger.log(this.debugMode, 'MissionHomeComp', "start_mission")
|
||
oops.gui.open(UIID.Mission)
|
||
this.node.active=false;
|
||
|
||
// 隐藏 mapLayer 下的 main 节点
|
||
let mainNode = smc.map.MapView.scene.mapLayer?.node.getChildByName("main");
|
||
if (mainNode) {
|
||
mainNode.active = false;
|
||
}
|
||
}
|
||
|
||
/** 打开排行榜弹窗 */
|
||
openRanks(){
|
||
oops.gui.open(UIID.Ranks)
|
||
}
|
||
openHero(){
|
||
oops.gui.open(UIID.Heros)
|
||
}
|
||
openTalents(){
|
||
oops.gui.open(UIID.Talents)
|
||
}
|
||
/** 任务结束回调:重新显示主页 */
|
||
mission_end(){
|
||
mLogger.log(this.debugMode, 'MissionHomeComp', "[MissionHomeComp]=>mission_end")
|
||
this.home_active()
|
||
}
|
||
|
||
/** 激活主页显示:刷新数据并显示节点 */
|
||
home_active(){
|
||
this.uodate_data()
|
||
this.node.active=true
|
||
|
||
// 重新显示 mapLayer 下的 main 节点
|
||
let mainNode = smc.map.MapView.scene.mapLayer?.node.getChildByName("main");
|
||
if (mainNode) {
|
||
mainNode.active = true;
|
||
}
|
||
}
|
||
|
||
/** 更新主页显示数据(预留) */
|
||
uodate_data(){
|
||
|
||
}
|
||
|
||
/**
|
||
* 判断是否运行在微信小游戏环境。
|
||
* @returns true = 微信小游戏环境
|
||
*/
|
||
isWxClient(){
|
||
return typeof wx !== 'undefined' && typeof (wx as any).getSystemInfoSync === 'function';
|
||
}
|
||
|
||
|
||
/** ECS 组件移除时销毁节点 */
|
||
reset() {
|
||
this.node.destroy();
|
||
}
|
||
} |