import { _decorator, Asset, Button, Component, debug, instantiate, Label, Node, Prefab, randomRange, Sprite, sys, Tween, tween, Vec3 } from 'cc'; import { LocalSaveMgr } from '../framework/data/LocalSaveMgr'; import { UIManager } from '../framework/ui/UIManager'; import { UISwitcher } from '../framework/ui/UISwitcher'; import { AudioMgr } from '../framework/audio/AudioMgr'; import { PanelBase } from '../framework/ui/PanelBase'; import { AssetController } from '../AssetController'; import { GameController } from '../GameController'; import { DataMgr } from '../framework/data/DataMgr'; import { Weapon } from '../data/ConfigData'; import { AddHeartPanel } from './AddHeartPanel'; import { SdkMgr } from '../framework/sdk/SdkMgr'; import { EventCenter } from '../EventCenter'; import { SideTipPanel } from './SideTipPanel'; import { SharePanel } from './SharePanel'; const { ccclass, property } = _decorator; @ccclass('MainPanel') export class MainPanel extends PanelBase { static instance: MainPanel; @property({ type: Button }) startBtn: Button = null; @property({ type: Button }) leftBtn: Button = null; @property({ type: Button }) right: Button = null; @property({ type: Button }) equip: Button = null; @property({ type: Button }) clear: Button = null; @property({ type: Button }) addMoneyBtn: Button = null; @property({ type: Button }) buy: Button = null; @property({ type: Node }) equiped: Node = null; @property({ type: Label }) weaponName: Label = null; @property({ type: Label }) gunPrice: Label = null; @property({ type: Label }) heart: Label = null; @property({ type: Label }) heartTimer: Label = null; @property({ type: Label }) coin: Label = null; @property({ type: Button }) addHeartBtn: Button = null; @property({ type: Button }) shareBtn: Button = null; @property({ type: Prefab }) weaponSelectPrefab: Prefab = null; @property(Prefab) flyMoneyPrefab: Prefab = null; @property(Node) flyMoneyContent: Node = null; @property(Node) fingerNode: Node = null; @property({ type: Button }) sideTipBtn: Button = null; weaponDatas: Array = [] private weaponOffset: number = 1000 private curSelectIndex: number = 0 @property({ type: Node }) weaponContent: Node = null; protected onOpen(): void { MainPanel.instance.refresh() } refresh() { var weapons = DataMgr.getInstance().GetDatas(Weapon) this.weaponDatas = weapons let equipedIndex: number = 0 for (let index = 0; index < weapons.length; index++) { let data = weapons[index] var item = instantiate(this.weaponSelectPrefab) item.setParent(this.weaponContent) let sprite = item.getChildByPath("Sprite").getComponent(Sprite) AssetController.instance.loadSetSprite(`weaponSprite/${data.spriteName}`, sprite); item.getChildByPath("Label").getComponent(Label).string = data.gunName if (data.id == LocalSaveMgr.instance.playerData.equipedWeapon) { equipedIndex = index } } if (sys.platform == sys.Platform.WECHAT_GAME) { this.sideTipBtn.node.active = false const date: Date = new Date(); const dayOfMonth: number = date.getDate(); if (LocalSaveMgr.instance.playerData.day != dayOfMonth) { this.shareBtn.node.active = true } } else if (sys.platform == sys.Platform.BYTEDANCE_MINI_GAME) { this.sideTipBtn.node.active = true this.shareBtn.node.active = false } this.fingerNode.active = !LocalSaveMgr.instance.playerData.haveTutorial this.heart.string = LocalSaveMgr.instance.playerData.power.toString() this.coin.string = LocalSaveMgr.instance.playerData.coin.toString() this.setToIndex(equipedIndex, false) } protected update(dt: number): void { if (LocalSaveMgr.instance.playerData.isOnTimerRun) { let totalSeconds = Math.ceil(LocalSaveMgr.instance.getPowerCD()) totalSeconds = Math.ceil(totalSeconds); let minutes = Math.floor(totalSeconds / 60); let seconds = totalSeconds % 60; // 将分钟和秒格式化为两位数 let formattedMinutes = minutes < 10 ? `0${minutes}` : `${minutes}`; let formattedSeconds = seconds < 10 ? `0${seconds}` : `${seconds}`; // 组合成 00:00 的格式 let formattedTime = `${formattedMinutes}:${formattedSeconds}`; this.heartTimer.string = formattedTime } else { this.heartTimer.string = "已满" } this.heart.string = LocalSaveMgr.instance.playerData.power.toString() } setToIndex(index: number, widthAim: boolean) { this.curSelectIndex = index if (!widthAim) { this.weaponContent.setPosition(-this.weaponOffset * index, 0, 0) } else { let newPos = new Vec3(-this.weaponOffset * index, 0, 0) tween(this.weaponContent) .to(0.3, { position: newPos }) .start() } this.refreshToIndex() } refreshToIndex() { let ownedWeapons = LocalSaveMgr.instance.playerData.ownWeapon let owned: boolean = false for (let index = 0; index < ownedWeapons.length; index++) { let element = ownedWeapons[index]; console.log("刷新", this.weaponDatas[this.curSelectIndex].id, element, ownedWeapons.length, index) if (element == this.weaponDatas[this.curSelectIndex].id) { owned = true break } } let equiped: boolean = LocalSaveMgr.instance.playerData.equipedWeapon == this.weaponDatas[this.curSelectIndex].id // this.weaponName.string = this.weaponDatas[this.curSelectIndex].gunName this.gunPrice.string = this.weaponDatas[this.curSelectIndex].coin.toString() this.equiped.active = false this.buy.node.active = false this.equip.node.active = false if (equiped) { this.equiped.active = true } else if (owned) { this.equip.node.active = true } else { this.buy.node.active = true if (LocalSaveMgr.instance.playerData.coin >= this.weaponDatas[this.curSelectIndex].coin) { this.buy.interactable = true; this.buy.getComponent(Sprite).grayscale = false } else { this.buy.interactable = false; this.buy.getComponent(Sprite).grayscale = true } } if (this.curSelectIndex == 0) { this.leftBtn.node.active = false } else { this.leftBtn.node.active = true } if (this.curSelectIndex == this.weaponDatas.length - 1) { this.right.node.active = false } else { this.right.node.active = true } } clickLeft() { AudioMgr.inst.playOneShot(AssetController.instance.click) if (this.curSelectIndex > 0) { this.setToIndex(this.curSelectIndex - 1, true) } } clickRight() { AudioMgr.inst.playOneShot(AssetController.instance.click) if (this.curSelectIndex < this.weaponDatas.length - 1) { this.setToIndex(this.curSelectIndex + 1, true) } } clickEquipBtn() { AudioMgr.inst.playOneShot(AssetController.instance.click) LocalSaveMgr.instance.equipWeapon(this.weaponDatas[this.curSelectIndex].id) this.refreshToIndex() } clickBuyBtn() { LocalSaveMgr.instance.addCoin(-this.weaponDatas[this.curSelectIndex].coin) AudioMgr.inst.playOneShot(AssetController.instance.click) LocalSaveMgr.instance.buyWeapon(this.weaponDatas[this.curSelectIndex].id) this.refreshToIndex() } clickClear() { AudioMgr.inst.playOneShot(AssetController.instance.click) LocalSaveMgr.instance.clearData() } clickAddHeartBtn() { AudioMgr.inst.playOneShot(AssetController.instance.click) UIManager.instance.openPanel(AddHeartPanel) } clickAddMoneyBtn() { AudioMgr.inst.playOneShot(AssetController.instance.click) SdkMgr.instance.playerRewardAds(() => { let addPoint = 200 let fromeMoney = LocalSaveMgr.instance.playerData.coin LocalSaveMgr.instance.addCoin(addPoint) let endMoney = LocalSaveMgr.instance.playerData.coin this.flyMoney(fromeMoney, endMoney) }) } flyShareMoney(fromMoney: number, endMoney: number) { AudioMgr.inst.playOneShot(AssetController.instance.getCoin) for (let index = 0; index < 10; index++) { let item = instantiate(this.flyMoneyPrefab) item.setParent(this.flyMoneyContent) item.setPosition(new Vec3(0, 0, 0)) let delay = index * 0.1 tween(item) .by(0.3, { position: new Vec3(randomRange(-150, 150), randomRange(-150, 150), 0) }) .delay(delay) .to(0.6, { worldPosition: this.coin.node.getWorldPosition() }) .call(() => { item.destroy() }) .start() } new Tween({ value: fromMoney }) .delay(0.9) .to(1, { value: endMoney }, { onUpdate: (target, ratio) => { // 在每一帧更新时调用 let currentValue = Math.floor(target.value); if (this.coin != null) this.coin.string = currentValue.toString(); } }).call(() => { if (this.addMoneyBtn != null) this.addMoneyBtn.interactable = true }) .start(); } flyMoney(fromMoney: number, endMoney: number) { this.addMoneyBtn.interactable = false AudioMgr.inst.playOneShot(AssetController.instance.getCoin) for (let index = 0; index < 10; index++) { let item = instantiate(this.flyMoneyPrefab) item.setParent(this.flyMoneyContent) item.setPosition(this.addMoneyBtn.node.getPosition()) let delay = index * 0.1 tween(item) .by(0.3, { position: new Vec3(randomRange(-150, 150), randomRange(-150, 150), 0) }) .delay(delay) .to(0.6, { worldPosition: this.coin.node.getWorldPosition() }) .call(() => { item.destroy() }) .start() } new Tween({ value: fromMoney }) .delay(0.9) .to(1, { value: endMoney }, { onUpdate: (target, ratio) => { // 在每一帧更新时调用 let currentValue = Math.floor(target.value); if (this.coin != null) this.coin.string = currentValue.toString(); } }).call(() => { if (this.addMoneyBtn != null) this.addMoneyBtn.interactable = true }) .start(); } onCoinCountChange() { MainPanel.instance.coin.string = LocalSaveMgr.instance.playerData.coin.toString() MainPanel.instance.refreshToIndex() } clickSideTipBtn() { AudioMgr.inst.playOneShot(AssetController.instance.click) console.log("openPanel SideTipPanel") UIManager.instance.openPanel(SideTipPanel) } protected onDestroy(): void { EventCenter.coinCountChange.off("coinCountChange", this.onCoinCountChange) } clickShareBtn() { UIManager.instance.openPanel(SharePanel) } onLoad() { MainPanel.instance = this; this.startBtn.node.on(Button.EventType.CLICK, this.startBtnCallBack, this); this.leftBtn.node.on(Button.EventType.CLICK, this.clickLeft, this); this.right.node.on(Button.EventType.CLICK, this.clickRight, this); this.equip.node.on(Button.EventType.CLICK, this.clickEquipBtn, this); this.buy.node.on(Button.EventType.CLICK, this.clickBuyBtn, this); this.sideTipBtn.node.on(Button.EventType.CLICK, this.clickSideTipBtn, this); this.shareBtn.node.on(Button.EventType.CLICK, this.clickShareBtn, this); this.clear.node.on(Button.EventType.CLICK, this.clickClear, this); this.addHeartBtn.node.on(Button.EventType.CLICK, this.clickAddHeartBtn, this); this.addMoneyBtn.node.on(Button.EventType.CLICK, this.clickAddMoneyBtn, this); EventCenter.coinCountChange.on("coinCountChange", this.onCoinCountChange).bind(this) } startBtnCallBack() { GameController.getInstance().gameStart() } }