You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
512 lines
18 KiB
512 lines
18 KiB
// // MainScene.ts - 转换后的 Cocos Creator TypeScript 版本
|
|
// import { cclegacy, _decorator, Node, UITransform, Button, Toggle, Component, RichText, tween, Vec3, v3, Label, instantiate, Tween } from 'cc';
|
|
// import { IScene } from './IScene';
|
|
// import { View, Action, InjectClick, OnClick } from './Decorator';
|
|
// import MathUtil from './MathUtil';
|
|
// import NodeUtil from './NodeUtil';
|
|
// import ViewAction from './ViewAction';
|
|
// import { ViewID } from './ViewID';
|
|
// import { JiangHuController } from './JiangHuController';
|
|
// import { TopSpace } from './TopSpace';
|
|
// import { QUALITY, ITEM_TYPE, MOUDLE_UNLOCK, MOUDLE_TYPE } from './Types';
|
|
// import AudioNames from './AudioNames';
|
|
|
|
// const { ccclass, property } = _decorator;
|
|
|
|
// // 面板ID枚举
|
|
// export enum PanelID {
|
|
// WuGong = "WuGong",
|
|
// Invest = "Invest",
|
|
// Fight = "Fight",
|
|
// Shop = "Shop",
|
|
// Bag = "Bag"
|
|
// }
|
|
|
|
// @ccclass("MainScene")
|
|
// @View(ViewID.MAIN)
|
|
// export class MainScene extends IScene {
|
|
// @property({ type: Node, tooltip: "画布节点" })
|
|
// canvas: Node | null = null;
|
|
|
|
// @property({ type: Node, tooltip: "面板层" })
|
|
// panelLayer: Node | null = null;
|
|
|
|
// @property({ type: Node, tooltip: "切换按钮组" })
|
|
// toggles: Node | null = null;
|
|
|
|
// @property({ type: Node, tooltip: "底部UI" })
|
|
// bottom: Node | null = null;
|
|
|
|
// @property({ type: Node, tooltip: "顶部UI" })
|
|
// top: Node | null = null;
|
|
|
|
// @property({ type: Node, tooltip: "公告节点" })
|
|
// notice: Node | null = null;
|
|
|
|
// @property({ type: Button, tooltip: "属性按钮" })
|
|
// buttonProp: Button | null = null;
|
|
|
|
// // 私有属性
|
|
// private toggleTweens: { [key: string]: Tween<Node> } = {};
|
|
// private currentPanel: string | null = null;
|
|
// private panels: { [key: string]: Node } = {};
|
|
// private isInitialized: boolean = false;
|
|
|
|
// constructor(...args: any[]) {
|
|
// super(...args);
|
|
// this.toggleTweens = {};
|
|
// this.currentPanel = null;
|
|
// this.panels = {};
|
|
// this.isInitialized = false;
|
|
// }
|
|
|
|
// /**
|
|
// * 场景启动生命周期方法
|
|
// */
|
|
// start(): void {
|
|
// this.onRefreshModules();
|
|
// this.onRefreshFighting();
|
|
// this.onEnterPanel({ id: PanelID.Fight });
|
|
|
|
// // 初始化切换按钮事件
|
|
// if (this.toggles) {
|
|
// const toggleComponents = this.toggles.getComponentsInChildren(Toggle);
|
|
// for (const toggle of toggleComponents) {
|
|
// const eventHandler = new Component.EventHandler();
|
|
// eventHandler.target = this.node;
|
|
// eventHandler.component = "MainScene";
|
|
// eventHandler.handler = "onToggle";
|
|
// toggle.checkEvents.push(eventHandler);
|
|
// }
|
|
// }
|
|
|
|
// // 调整顶部空间
|
|
// if (this.top) {
|
|
// const transform = this.top.getComponent(UITransform);
|
|
// if (transform) {
|
|
// transform.height += TopSpace.TOP_SPACE;
|
|
// }
|
|
// }
|
|
|
|
// this.onRefreshTags();
|
|
|
|
// // 定时刷新标签
|
|
// this.schedule(() => {
|
|
// this.onRefreshTags();
|
|
// }, 1);
|
|
|
|
// // 加载机器人配置并设置公告
|
|
// this.setupNoticeSystem();
|
|
|
|
// this.isInitialized = true;
|
|
// }
|
|
|
|
// /**
|
|
// * 设置公告系统
|
|
// */
|
|
// private setupNoticeSystem(): void {
|
|
// app.service.config.loadJson("robot").then((robotConfig: any) => {
|
|
// const robotKeys = Object.keys(robotConfig);
|
|
// const levelKeys = Object.keys(app.service.config.data.level);
|
|
// const lastLevelKey = levelKeys[levelKeys.length - 1];
|
|
// const bossName = app.service.config.data.enemy[app.service.config.data.level[lastLevelKey].boss].name;
|
|
// const items = app.service.config.data.items;
|
|
|
|
// const wugongItems: string[] = [];
|
|
// const equipmentItems: string[] = [];
|
|
|
|
// // 筛选高品质物品
|
|
// for (const itemId in items) {
|
|
// const item = items[itemId];
|
|
// if (item.quality > QUALITY.PURPLE) {
|
|
// switch (item.type) {
|
|
// case ITEM_TYPE.WUGONG:
|
|
// wugongItems.push(item.name);
|
|
// break;
|
|
// case ITEM_TYPE.GLOVE:
|
|
// case ITEM_TYPE.SWORD:
|
|
// case ITEM_TYPE.KNIFE:
|
|
// case ITEM_TYPE.ARMOR:
|
|
// equipmentItems.push(item.name);
|
|
// break;
|
|
// }
|
|
// }
|
|
// }
|
|
|
|
// // 定时显示公告
|
|
// this.schedule(() => {
|
|
// if (this.currentPanel !== PanelID.Bag && this.currentPanel !== PanelID.WuGong) {
|
|
// const randomRobot = robotConfig[robotKeys[MathUtil.getRandomInt(robotKeys.length - 1)]];
|
|
// const nickname = randomRobot.nickname;
|
|
// const richText = this.notice?.getComponentInChildren(RichText);
|
|
|
|
// if (!richText) return;
|
|
|
|
// const randomType = MathUtil.getRandomInt(2);
|
|
// let message = "";
|
|
|
|
// switch (randomType) {
|
|
// case 1:
|
|
// message = `【天道机缘】 吉星高照!玩家<color=#F3431A>「${nickname}」</color>偶得旷世奇珍<color=#F3431A>【${equipmentItems[MathUtil.getRandomInt(equipmentItems.length - 1)]}】</color>!此等神器出世,武林又将掀起波澜!`;
|
|
// break;
|
|
// case 2:
|
|
// message = `【天道机缘】 鸿运当头!玩家<color=#F3431A>「${nickname}」</color>领悟失传绝学 <color=#F3431A>【${wugongItems[MathUtil.getRandomInt(wugongItems.length - 1)]}】</color>!此秘籍乃百年前宗师所留,习得者可撼山岳!`;
|
|
// break;
|
|
// default:
|
|
// message = `【江湖捷报】玩家<color=#F3431A>「${nickname}」</color>成功斩杀终极BOSS<color=#F3431A>【${bossName}】</color>!烈焰散尽,英雄凯旋!`;
|
|
// }
|
|
|
|
// richText.string = message;
|
|
// this.showNotice(richText);
|
|
// }
|
|
// }, 30);
|
|
// }).catch((error) => {
|
|
// console.error("加载机器人配置失败:", error);
|
|
// });
|
|
// }
|
|
|
|
// /**
|
|
// * 显示公告
|
|
// */
|
|
// private showNotice(richText: RichText): void {
|
|
// if (!this.notice) return;
|
|
|
|
// this.notice.active = true;
|
|
// this.notice.setScale(0, 0);
|
|
|
|
// tween(this.notice)
|
|
// .to(0.2, { scale: Vec3.ONE })
|
|
// .call(() => {
|
|
// if (!this.notice) return;
|
|
|
|
// const noticeTransform = this.notice.getComponent(UITransform);
|
|
// const richTextTransform = richText.node.getComponent(UITransform);
|
|
|
|
// if (!noticeTransform || !richTextTransform) return;
|
|
|
|
// const noticeWidth = noticeTransform.width;
|
|
// const richTextWidth = richTextTransform.width;
|
|
|
|
// richText.node.setPosition(0.5 * noticeWidth, richText.node.position.y);
|
|
|
|
// tween(richText.node)
|
|
// .to(8, {
|
|
// position: v3(0.5 * noticeWidth - richTextWidth - 100, richText.node.position.y)
|
|
// })
|
|
// .delay(1)
|
|
// .call(() => {
|
|
// if (this.notice) {
|
|
// this.notice.active = false;
|
|
// }
|
|
// })
|
|
// .start();
|
|
// })
|
|
// .start();
|
|
// }
|
|
|
|
// /**
|
|
// * 切换按钮点击事件
|
|
// */
|
|
// @OnClick
|
|
// onToggle(toggle: Toggle): void {
|
|
// if (toggle.isChecked) {
|
|
// // 移除指引手指
|
|
// const finger = toggle.node.getChildByName("finger");
|
|
// if (finger) {
|
|
// finger.destroy();
|
|
// }
|
|
|
|
// app.manager.audio.playOnce(AudioNames.CLICK);
|
|
// this.onEnterPanel({ id: toggle.node.name as PanelID });
|
|
// }
|
|
// }
|
|
|
|
// /**
|
|
// * 属性按钮点击事件
|
|
// */
|
|
// @OnClick
|
|
// onButtonProp(): void {
|
|
// app.manager.popup.popNode("PopupAbility");
|
|
// }
|
|
|
|
// /**
|
|
// * 刷新标签状态
|
|
// */
|
|
// @Action(ViewAction.REFRESH_TAGS)
|
|
// onRefreshTags(): void {
|
|
// const coinAmount = app.service.item.getCurrencyValue("Coin");
|
|
// const gameModel = app.service.game.model;
|
|
|
|
// for (let i = 0; i < 5; i++) {
|
|
// this.updateTagForModule(i as MOUDLE_TYPE, coinAmount, gameModel);
|
|
// }
|
|
// }
|
|
|
|
// /**
|
|
// * 更新特定模块的标签状态
|
|
// */
|
|
// private updateTagForModule(moduleType: MOUDLE_TYPE, coinAmount: number, gameModel: any): void {
|
|
// let shouldShowTag = false;
|
|
// const bag = gameModel.bag;
|
|
|
|
// switch (moduleType) {
|
|
// case MOUDLE_TYPE.INVEST:
|
|
// const buildings = gameModel.invest.buildings;
|
|
// for (const buildingId in buildings) {
|
|
// shouldShowTag = true;
|
|
// const building = buildings[buildingId];
|
|
|
|
// for (const material of building.materials) {
|
|
// if (bag.getItemValue(material.id) < material.value) {
|
|
// shouldShowTag = false;
|
|
// break;
|
|
// }
|
|
// }
|
|
// if (shouldShowTag) break;
|
|
// }
|
|
// break;
|
|
|
|
// case MOUDLE_TYPE.SHOP:
|
|
// shouldShowTag = app.service.item.checkCurrency("Coin", gameModel.shop.cost, false);
|
|
// break;
|
|
|
|
// case MOUDLE_TYPE.BAG:
|
|
// // 检查新标签或可合并物品
|
|
// for (const item of bag.items) {
|
|
// if (item.mergeable || bag.newTags[item.uuid]) {
|
|
// shouldShowTag = true;
|
|
// break;
|
|
// }
|
|
// }
|
|
|
|
// if (!shouldShowTag) {
|
|
// shouldShowTag = coinAmount >= bag.cost && bag.checkMaterials(bag.materials);
|
|
// }
|
|
// break;
|
|
|
|
// case MOUDLE_TYPE.FIGHT:
|
|
// shouldShowTag = gameModel.task.config && gameModel.task.complete;
|
|
// break;
|
|
|
|
// case MOUDLE_TYPE.WUGONG:
|
|
// const wuxue = gameModel.role.wuxue;
|
|
// const wugongs = gameModel.role.wugongs;
|
|
|
|
// for (const wugongType in wugongs) {
|
|
// for (const wugong of wugongs[wugongType]) {
|
|
// if (wuxue >= wugong.levelUp_condition && coinAmount >= wugong.levelUp_exp) {
|
|
// shouldShowTag = true;
|
|
// break;
|
|
// }
|
|
// }
|
|
// if (shouldShowTag) break;
|
|
// }
|
|
// break;
|
|
// }
|
|
|
|
// this.updateToggleVisual(moduleType, shouldShowTag, gameModel);
|
|
// }
|
|
|
|
// /**
|
|
// * 更新切换按钮视觉效果
|
|
// */
|
|
// private updateToggleVisual(moduleType: MOUDLE_TYPE, showTag: boolean, gameModel: any): void {
|
|
// if (!this.toggles) return;
|
|
|
|
// const toggleNode = this.toggles.children[moduleType];
|
|
// if (!toggleNode) return;
|
|
|
|
// if (gameModel.moduleTags[moduleType]) {
|
|
// if (!this.toggleTweens[moduleType]) {
|
|
// this.toggleTweens[moduleType] = NodeUtil.breathEffect(toggleNode, 1, 1.1);
|
|
// }
|
|
// } else {
|
|
// if (this.toggleTweens[moduleType]) {
|
|
// toggleNode.setScale(Vec3.ONE);
|
|
// this.toggleTweens[moduleType].stop();
|
|
// delete this.toggleTweens[moduleType];
|
|
// }
|
|
// }
|
|
|
|
// NodeUtil.showRedTag(toggleNode, showTag);
|
|
// }
|
|
|
|
// /**
|
|
// * 手指指引事件
|
|
// */
|
|
// @Action(ViewAction.FINGER_GUIDE)
|
|
// onFingerGuide(type: string): void {
|
|
// if (!this.toggles) return;
|
|
|
|
// switch (type) {
|
|
// case "wugong":
|
|
// NodeUtil.showFinger(this.toggles.children[0], true, { ignore: true });
|
|
// break;
|
|
// case "bag":
|
|
// NodeUtil.showFinger(this.toggles.children[4], true, { ignore: true });
|
|
// break;
|
|
// }
|
|
// }
|
|
|
|
// /**
|
|
// * 刷新模块显示状态
|
|
// */
|
|
// @Action(ViewAction.REFRESH_MODULES)
|
|
// onRefreshModules(): void {
|
|
// if (!this.toggles) return;
|
|
|
|
// const taskId = app.service.game.model.task.id;
|
|
// if (!taskId) return;
|
|
|
|
// const taskNumber = Number(taskId);
|
|
// const toggleMap = {
|
|
// [MOUDLE_TYPE.WUGONG]: this.toggles.children[0],
|
|
// [MOUDLE_TYPE.BAG]: this.toggles.children[4],
|
|
// [MOUDLE_TYPE.SHOP]: this.toggles.children[3],
|
|
// [MOUDLE_TYPE.INVEST]: this.toggles.children[1]
|
|
// };
|
|
|
|
// for (const moduleType in MOUDLE_UNLOCK) {
|
|
// const unlockThreshold = MOUDLE_UNLOCK[moduleType as keyof typeof MOUDLE_UNLOCK];
|
|
// const toggleNode = toggleMap[moduleType as keyof typeof toggleMap];
|
|
|
|
// if (toggleNode) {
|
|
// toggleNode.active = taskNumber > unlockThreshold;
|
|
// }
|
|
// }
|
|
// }
|
|
|
|
// /**
|
|
// * 刷新战斗力显示
|
|
// */
|
|
// @Action(ViewAction.REFRESH_FIGHTING)
|
|
// onRefreshFighting(): void {
|
|
// if (!this.buttonProp) return;
|
|
|
|
// const fightingLabel = this.buttonProp.node.getChildByName("Fighting");
|
|
// if (fightingLabel) {
|
|
// const labelComponent = fightingLabel.getComponent(Label);
|
|
// if (labelComponent) {
|
|
// const fightingValue = Math.floor(app.service.game.model.role.fighting);
|
|
// labelComponent.string = fightingValue.toString();
|
|
// }
|
|
// }
|
|
// }
|
|
|
|
// /**
|
|
// * 刷新战斗状态
|
|
// */
|
|
// @Action(ViewAction.REFRESH_FIGHT)
|
|
// onRefreshFight(): void {
|
|
// if (this.bottom) {
|
|
// this.bottom.active = app.service.game.model.level.monster.fighting;
|
|
// }
|
|
// }
|
|
|
|
// /**
|
|
// * 进入面板
|
|
// */
|
|
// @Action(ViewAction.ENTER_PANEL)
|
|
// onEnterPanel(params: { id: PanelID }): void {
|
|
// if (this.panels[params.id]) {
|
|
// // 显示已存在的面板
|
|
// this.panels[params.id].active = true;
|
|
// } else {
|
|
// // 加载新面板
|
|
// this.loadPanel(params.id);
|
|
// }
|
|
// }
|
|
|
|
// /**
|
|
// * 加载面板
|
|
// */
|
|
// private async loadPanel(panelId: PanelID): Promise<void> {
|
|
// try {
|
|
// app.loading = true;
|
|
// const prefab = await app.service.res.getPrefab(`Panel${panelId}`);
|
|
|
|
// // 退出当前面板
|
|
// if (this.currentPanel) {
|
|
// this.onExitPanel({ id: this.currentPanel });
|
|
// }
|
|
|
|
// const panelInstance = instantiate(prefab);
|
|
// this.panels[panelId] = panelInstance;
|
|
|
|
// if (this.canvas) {
|
|
// panelInstance.parent = this.canvas;
|
|
|
|
// // 设置层级
|
|
// if (this.panelLayer) {
|
|
// const panelLayerIndex = this.panelLayer.getSiblingIndex();
|
|
// panelInstance.setSiblingIndex(panelLayerIndex);
|
|
// }
|
|
// }
|
|
|
|
// this.currentPanel = panelId;
|
|
// app.loading = false;
|
|
|
|
// // 特殊处理:进入背包或武学面板时隐藏公告
|
|
// if (panelId === PanelID.Bag || panelId === PanelID.WuGong) {
|
|
// if (this.notice) {
|
|
// this.notice.active = false;
|
|
// Tween.stopAllByTarget(this.notice);
|
|
// }
|
|
// }
|
|
|
|
// } catch (error) {
|
|
// console.error(`加载面板 ${panelId} 失败:`, error);
|
|
// app.manager.toast.show("页面加载失败,请稍后重试~");
|
|
// app.loading = false;
|
|
// }
|
|
// }
|
|
|
|
// /**
|
|
// * 退出面板
|
|
// */
|
|
// @Action(ViewAction.EXIT_PANEL)
|
|
// onExitPanel(params: { id: string }): void {
|
|
// if (this.panels[params.id]) {
|
|
// this.panels[params.id].destroy();
|
|
// delete this.panels[params.id];
|
|
// }
|
|
// }
|
|
|
|
// /**
|
|
// * 获取当前面板ID
|
|
// */
|
|
// getCurrentPanel(): string | null {
|
|
// return this.currentPanel;
|
|
// }
|
|
|
|
// /**
|
|
// * 检查是否已初始化
|
|
// */
|
|
// isSceneInitialized(): boolean {
|
|
// return this.isInitialized;
|
|
// }
|
|
|
|
// /**
|
|
// * 清理资源
|
|
// */
|
|
// onDestroy(): void {
|
|
// // 停止所有缓动动画
|
|
// for (const tweenId in this.toggleTweens) {
|
|
// this.toggleTweens[tweenId].stop();
|
|
// }
|
|
// this.toggleTweens = {};
|
|
|
|
// // 清理所有面板
|
|
// for (const panelId in this.panels) {
|
|
// this.panels[panelId].destroy();
|
|
// }
|
|
// this.panels = {};
|
|
|
|
// // 取消所有调度
|
|
// this.unscheduleAllCallbacks();
|
|
|
|
// super.onDestroy();
|
|
// }
|
|
// }
|
|
|
|
// export default MainScene;
|