380 lines
13 KiB
TypeScript
380 lines
13 KiB
TypeScript
|
|
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<Weapon> = []
|
|
|
|
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()
|
|
}
|
|
}
|
|
|
|
|