chore:代码重构
This commit is contained in:
@@ -1,28 +1,55 @@
|
||||
// @structural-rewrite-v1
|
||||
import { _decorator, Component } from 'cc';
|
||||
const { ccclass, property } = _decorator;
|
||||
|
||||
const { ccclass } = _decorator;
|
||||
@ccclass('SingletonBase')
|
||||
export abstract class SingletonBase<T extends Component> extends Component {
|
||||
private static _instance: any = null;
|
||||
|
||||
private static _instance: Component = null;
|
||||
public static getInstance<T extends Component>(this: new () => T): T {
|
||||
if ((this as any)._instance === null) {
|
||||
return null
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: return ((this as unknown) as typeof SingletonBase)["_instance"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown as T;
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
return (this as any)._instance;
|
||||
}
|
||||
|
||||
protected onLoad(): void {
|
||||
if ((this.constructor as any)._instance) {
|
||||
this.node.destroy();
|
||||
return;
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
const singletonType = this["constructor"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown as typeof SingletonBase;
|
||||
if (singletonType["_instance"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown) {
|
||||
void ((this["node"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["destroy"]());
|
||||
return;
|
||||
}
|
||||
void (singletonType["_instance"] = this);
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
(this.constructor as any)._instance = this;
|
||||
}
|
||||
|
||||
protected onDestroy(): void {
|
||||
if ((this.constructor as any)._instance === this) {
|
||||
(this.constructor as any)._instance = null;
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
const singletonType = this["constructor"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown as typeof SingletonBase;
|
||||
if (singletonType["_instance"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown === this)
|
||||
void (singletonType["_instance"] = null);
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
// @structural-rewrite-v1
|
||||
import { easing, Node, tween, Vec3 } from 'cc';
|
||||
export function selectAnimationEasing(preferSineOut: boolean, preferSineIn: boolean): (time: number) => number {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
const candidates: Array<readonly [
|
||||
boolean,
|
||||
(time: number) => number
|
||||
]> = [
|
||||
[preferSineOut, easing["sineOut"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown],
|
||||
[preferSineIn, easing["sineIn"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown],
|
||||
];
|
||||
return candidates["find"](([enabled]) => enabled)?.[1] ?? easing["linear"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown;
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
export function runNodeTransition(node: Node, channel: 'position' | 'scale', start: Vec3, end: Vec3, delay: number, duration: number, applyImmediately: boolean, easingFunction: (time: number) => number): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
const applyStart = channel === 'position' ? () => node["setPosition"](start) : () => node["setScale"](start);
|
||||
if (applyImmediately)
|
||||
void (applyStart());
|
||||
const destination = channel === 'position' ? { "position": end } : { "scale": end };
|
||||
void (tween(node)["delay"](delay)["call"](applyStart)["to"](duration, destination, { "easing": easingFunction })["start"]());
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"ver": "4.0.24",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "a1eb5b59-1ba5-49aa-83dc-32caecc1ca6f",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {}
|
||||
}
|
||||
@@ -1,64 +1,36 @@
|
||||
import { _decorator, Component, easing, Node, tween, Vec2, Vec3 } from 'cc';
|
||||
// @structural-rewrite-v1
|
||||
import { _decorator, Component, Vec3 } from 'cc';
|
||||
import { runNodeTransition, selectAnimationEasing } from './EasingSelector';
|
||||
const { ccclass, property } = _decorator;
|
||||
|
||||
@ccclass('MoveComponent')
|
||||
export class MoveComponent extends Component {
|
||||
|
||||
|
||||
@property
|
||||
startPos: Vec3 = new Vec3(0, 0, 0);
|
||||
|
||||
@property
|
||||
endPos: Vec3 = new Vec3(0, 0, 0);
|
||||
|
||||
@property
|
||||
delay: number = 0;
|
||||
|
||||
|
||||
delay = 0;
|
||||
@property
|
||||
moveTimer: number = 0;
|
||||
|
||||
|
||||
@property({ displayName: "线性" })
|
||||
line: boolean = true;
|
||||
|
||||
@property({ displayName: "先慢后快" })
|
||||
sineIn: boolean = true;
|
||||
|
||||
@property({ displayName: "先快后慢" })
|
||||
sineOut: boolean = true;
|
||||
|
||||
@property({ displayName: "设置为初始值" })
|
||||
setToStart: boolean = false;
|
||||
|
||||
|
||||
moveTimer = 0;
|
||||
@property({ "displayName": '线性' })
|
||||
line = true;
|
||||
@property({ "displayName": '先慢后快' })
|
||||
sineIn = true;
|
||||
@property({ "displayName": '先快后慢' })
|
||||
sineOut = true;
|
||||
@property({ "displayName": '设置为初始值' })
|
||||
setToStart = false;
|
||||
protected onEnable(): void {
|
||||
console.log("触发动画z")
|
||||
let easeFunc = easing.linear;
|
||||
|
||||
if (this.sineIn) {
|
||||
easeFunc = easing.sineIn
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (runNodeTransition(this["node"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, 'position', this["startPos"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, this["endPos"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, this["delay"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, this["moveTimer"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, this["setToStart"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, selectAnimationEasing(this["sineOut"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, this["sineIn"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
|
||||
if (this.sineOut) {
|
||||
easeFunc = easing.sineOut
|
||||
finally {
|
||||
}
|
||||
|
||||
if (this.setToStart) {
|
||||
this.node.setPosition(this.startPos)
|
||||
}
|
||||
|
||||
|
||||
tween(this.node)
|
||||
.delay(this.delay)
|
||||
.call(() => {
|
||||
this.node.setPosition(this.startPos)
|
||||
})
|
||||
.to(this.moveTimer, { position: this.endPos }, { easing: easeFunc })
|
||||
.start()
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,63 +1,36 @@
|
||||
import { _decorator, Component, easing, Node, tween, Vec2, Vec3 } from 'cc';
|
||||
// @structural-rewrite-v1
|
||||
import { _decorator, Component, Vec3 } from 'cc';
|
||||
import { runNodeTransition, selectAnimationEasing } from './EasingSelector';
|
||||
const { ccclass, property } = _decorator;
|
||||
|
||||
@ccclass('ScaleComponent')
|
||||
export class ScaleComponent extends Component {
|
||||
|
||||
@property
|
||||
startPos: Vec3 = new Vec3(0, 0, 0);
|
||||
|
||||
@property
|
||||
endPos: Vec3 = new Vec3(1, 1, 1);
|
||||
|
||||
@property
|
||||
delay: number = 0;
|
||||
|
||||
delay = 0;
|
||||
@property
|
||||
moveTimer: number = 0.1;
|
||||
|
||||
@property({ displayName: "线性" })
|
||||
line: boolean = true;
|
||||
|
||||
@property({ displayName: "先慢后快" })
|
||||
sineIn: boolean = true;
|
||||
|
||||
@property({ displayName: "先快后慢" })
|
||||
sineOut: boolean = true;
|
||||
|
||||
|
||||
@property({ displayName: "设置为初始值" })
|
||||
setToStart: boolean = false;
|
||||
|
||||
|
||||
moveTimer = 0.1;
|
||||
@property({ "displayName": '线性' })
|
||||
line = true;
|
||||
@property({ "displayName": '先慢后快' })
|
||||
sineIn = true;
|
||||
@property({ "displayName": '先快后慢' })
|
||||
sineOut = true;
|
||||
@property({ "displayName": '设置为初始值' })
|
||||
setToStart = false;
|
||||
protected onEnable(): void {
|
||||
|
||||
|
||||
let easeFunc = easing.linear;
|
||||
|
||||
if (this.sineIn) {
|
||||
easeFunc = easing.sineIn
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (runNodeTransition(this["node"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, 'scale', this["startPos"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, this["endPos"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, this["delay"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, this["moveTimer"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, this["setToStart"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, selectAnimationEasing(this["sineOut"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, this["sineIn"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
|
||||
if (this.sineOut) {
|
||||
easeFunc = easing.sineOut
|
||||
finally {
|
||||
}
|
||||
|
||||
if (this.setToStart) {
|
||||
this.node.setScale(this.startPos)
|
||||
}
|
||||
|
||||
|
||||
tween(this.node)
|
||||
.delay(this.delay)
|
||||
.call(() => {
|
||||
this.node.setScale(this.startPos)
|
||||
})
|
||||
.to(this.moveTimer, { scale: this.endPos }, { easing: easeFunc })
|
||||
.start()
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,139 +1,290 @@
|
||||
//AudioMgr.ts
|
||||
import { Node, AudioSource, AudioClip, resources, director } from 'cc';
|
||||
/**
|
||||
* @en
|
||||
* this is a sington class for audio play, can be easily called from anywhere in you project.
|
||||
* @zh
|
||||
* 这是一个用于播放音频的单件类,可以很方便地在项目的任何地方调用。
|
||||
*/
|
||||
// @structural-rewrite-v1
|
||||
import { AudioClip, AudioSource, director, Node, resources } from 'cc';
|
||||
export class AudioMgr {
|
||||
private static _inst: AudioMgr;
|
||||
public static get inst(): AudioMgr {
|
||||
if (this._inst == null) {
|
||||
this._inst = new AudioMgr();
|
||||
}
|
||||
return this._inst;
|
||||
}
|
||||
|
||||
private _soundAudioSource: AudioSource;
|
||||
private _musicAudioSource: AudioSource;
|
||||
// private _soundaudioSource: AudioSource;
|
||||
constructor() {
|
||||
//@en create a node as audioMgr
|
||||
//@zh 创建一个节点作为 audioMgr
|
||||
let audioMgr = new Node();
|
||||
audioMgr.name = '__audioMgr__';
|
||||
|
||||
//@en add to the scene.
|
||||
//@zh 添加节点到场景
|
||||
director.getScene().addChild(audioMgr);
|
||||
|
||||
//@en make it as a persistent node, so it won't be destroied when scene change.
|
||||
//@zh 标记为常驻节点,这样场景切换的时候就不会被销毁了
|
||||
director.addPersistRootNode(audioMgr);
|
||||
|
||||
//@en add AudioSource componrnt to play audios.
|
||||
//@zh 添加 AudioSource 组件,用于播放音频。
|
||||
this._soundAudioSource = audioMgr.addComponent(AudioSource);
|
||||
this._musicAudioSource = audioMgr.addComponent(AudioSource);
|
||||
}
|
||||
|
||||
public get soundAudioSource() {
|
||||
return this._soundAudioSource;
|
||||
}
|
||||
|
||||
public get musicAudioSource() {
|
||||
return this._musicAudioSource;
|
||||
}
|
||||
|
||||
/**
|
||||
* @en
|
||||
* play short audio, such as strikes,explosions
|
||||
* @zh
|
||||
* 播放短音频,比如 打击音效,爆炸音效等
|
||||
* @param sound clip or url for the audio
|
||||
* @param volume
|
||||
*/
|
||||
playOneShot(sound: AudioClip | string, volume: number = 1.0) {
|
||||
if (sound instanceof AudioClip) {
|
||||
this._soundAudioSource.playOneShot(sound, (this.muteSound ? 0 : 1) * volume);
|
||||
muteMusic = false;
|
||||
muteSound = false;
|
||||
public static get inst(): AudioMgr {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
if (!(this["_inst"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown))
|
||||
void (this["_inst"] = new AudioMgr());
|
||||
return this["_inst"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown;
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
else {
|
||||
resources.load(sound, (err, clip: AudioClip) => {
|
||||
if (err) {
|
||||
console.log(err);
|
||||
}
|
||||
else {
|
||||
this._soundAudioSource.playOneShot(clip, (this.muteSound ? 0 : 1) * volume);
|
||||
}
|
||||
});
|
||||
finally {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @en
|
||||
* play long audio, such as the bg music
|
||||
* @zh
|
||||
* 播放长音频,比如 背景音乐
|
||||
* @param sound clip or url for the sound
|
||||
* @param volume
|
||||
*/
|
||||
play(sound: AudioClip, isLoop: boolean = true, volume: number = 1.0) {
|
||||
if (sound instanceof AudioClip) {
|
||||
this.musicAudioSource.stop();
|
||||
this.musicAudioSource.clip = sound;
|
||||
this.musicAudioSource.loop = isLoop
|
||||
this.musicAudioSource.play();
|
||||
this.musicAudioSource.volume = (this.muteMusic ? 0 : 1) * volume;
|
||||
public get soundAudioSource(): AudioSource {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: return this["_soundAudioSource"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown;
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
else {
|
||||
resources.load(sound, (err, clip: AudioClip) => {
|
||||
if (err) {
|
||||
console.log(err);
|
||||
}
|
||||
else {
|
||||
this.musicAudioSource.clip = clip;
|
||||
this.musicAudioSource.play();
|
||||
this.musicAudioSource.volume = (this.muteMusic ? 0 : 1) * volume;
|
||||
}
|
||||
});
|
||||
finally {
|
||||
}
|
||||
}
|
||||
|
||||
muteMusic: boolean = false
|
||||
muteSound: boolean = false
|
||||
|
||||
activeMusic(active: boolean) {
|
||||
this.musicAudioSource.volume = active ? 1 : 0
|
||||
this.muteMusic = !active
|
||||
public get musicAudioSource(): AudioSource {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: return this["_musicAudioSource"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown;
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
|
||||
activeSound(active: boolean) {
|
||||
this.soundAudioSource.volume = active ? 1 : 0
|
||||
this.muteSound = !active
|
||||
private constructor() {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
const audioRoot = new Node('__audioMgr__');
|
||||
void (director["getScene"]()["addChild"](audioRoot));
|
||||
void (director["addPersistRootNode"](audioRoot));
|
||||
void (this["_soundAudioSource"] = audioRoot["addComponent"](AudioSource));
|
||||
void (this["_musicAudioSource"] = audioRoot["addComponent"](AudioSource));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* stop the audio play
|
||||
*/
|
||||
stop() {
|
||||
this._soundAudioSource.stop();
|
||||
this._musicAudioSource.stop();
|
||||
playOneShot(sound: AudioClip | string, volume = 1): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (this["resolveClip"](sound, (clip) => (this["_soundAudioSource"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["playOneShot"](clip, this["getSoundVolume"](volume))));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* pause the audio play
|
||||
*/
|
||||
pause() {
|
||||
this._soundAudioSource.pause();
|
||||
this._musicAudioSource.pause();
|
||||
play(sound: AudioClip | string, isLoop = true, volume = 1): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
if (sound instanceof AudioClip) {
|
||||
void (this["startMusic"](sound, volume, { "stopCurrent": true, "loop": isLoop }));
|
||||
return;
|
||||
}
|
||||
void (this["resolveClip"](sound, (clip) => this["startMusic"](clip, volume)));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* resume the audio play
|
||||
*/
|
||||
resume() {
|
||||
this._soundAudioSource.play();
|
||||
this._musicAudioSource.play();
|
||||
activeMusic(active: boolean): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (this["setChannelActive"]('muteMusic', this["_musicAudioSource"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, active));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
}
|
||||
activeSound(active: boolean): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (this["setChannelActive"]('muteSound', this["_soundAudioSource"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, active));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
stop(): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (this["forEachChannel"]((source) => source["stop"]()));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
pause(): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (this["forEachChannel"]((source) => source["pause"]()));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
resume(): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (this["forEachChannel"]((source) => source["play"]()));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
private resolveClip(sound: AudioClip | string, onLoaded: (clip: AudioClip) => void): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
if (sound instanceof AudioClip) {
|
||||
void (onLoaded(sound));
|
||||
return;
|
||||
}
|
||||
void (resources["load"](sound, (error, clip: AudioClip) => {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
if (error) {
|
||||
void (console["error"](error));
|
||||
return;
|
||||
}
|
||||
void (onLoaded(clip));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
private getSoundVolume(volume: number): number {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: return this["getChannelVolume"](this["muteSound"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, volume);
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
private startMusic(clip: AudioClip, volume: number, options?: {
|
||||
stopCurrent: boolean;
|
||||
loop: boolean;
|
||||
}): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
if (options?.["stopCurrent"])
|
||||
void ((this["_musicAudioSource"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["stop"]());
|
||||
void ((this["_musicAudioSource"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["clip"] = clip);
|
||||
if (options)
|
||||
void ((this["_musicAudioSource"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["loop"] = options["loop"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown);
|
||||
void ((this["_musicAudioSource"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["play"]());
|
||||
void ((this["_musicAudioSource"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["volume"] = this["getMusicVolume"](volume));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
private getMusicVolume(volume: number): number {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: return this["getChannelVolume"](this["muteMusic"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, volume);
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
private setChannelActive(muteProperty: 'muteMusic' | 'muteSound', source: AudioSource, active: boolean): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
void (this[muteProperty] = !active);
|
||||
void (source["volume"] = Number(active));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
private getChannelVolume(isMuted: boolean, volume: number): number {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: return Number(!isMuted) * volume;
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
private forEachChannel(action: (source: AudioSource) => void): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void ([this["_soundAudioSource"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, this["_musicAudioSource"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown]["forEach"](action));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,80 +1,202 @@
|
||||
import { _decorator, Component, js, JsonAsset, Node, resources, TypeScript } from 'cc';
|
||||
import { SingletonBase } from '../SingletonBase';
|
||||
// @structural-rewrite-v1
|
||||
import { _decorator, js, JsonAsset, resources } from 'cc';
|
||||
import { setClassName } from '../../data/ConfigData';
|
||||
|
||||
const { ccclass, property } = _decorator;
|
||||
|
||||
import { SingletonBase } from '../SingletonBase';
|
||||
const { ccclass } = _decorator;
|
||||
interface ConfigRecord {
|
||||
id: number;
|
||||
}
|
||||
type ConfigConstructor<T> = new () => T;
|
||||
@ccclass('DataMgr')
|
||||
export class DataMgr extends SingletonBase<DataMgr> {
|
||||
|
||||
datas: Map<string, any[]> = new Map();
|
||||
protected start(): void {
|
||||
setClassName()
|
||||
this.initAllConfig()
|
||||
}
|
||||
|
||||
datas: Map<string, Array<any>> = new Map();
|
||||
|
||||
|
||||
createInstance(className: string): any {
|
||||
const Constructor = (window as any).ConfigData[className];
|
||||
|
||||
if (typeof Constructor === 'function') {
|
||||
return new Constructor();
|
||||
} else {
|
||||
console.error(`Class ${className} is not a constructor`);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
initAllConfig() {
|
||||
resources.loadDir(`data`, null, null, (err, assets) => {
|
||||
for (let i = 0; i < assets.length; i++) {
|
||||
let jsonAsset = assets[i] as JsonAsset
|
||||
let className = jsonAsset.name
|
||||
let array = new Array<any>()
|
||||
// this.datas.set((window as any)[className].name, array)
|
||||
console.log("是否有类", (window as any).ConfigData, className, (window as any).ConfigData[className])
|
||||
this.datas.set(js.getClassName((window as any).ConfigData[className]), array)
|
||||
|
||||
console.log("设置data", className, js.getClassName((window as any).ConfigData[className]))
|
||||
|
||||
for (let j = 0; j < jsonAsset.json.length; j++) {
|
||||
let myClassInstance = new (window as any).ConfigData[className]();
|
||||
let targetData: Record<string, any> = jsonAsset.json[j]
|
||||
this.initDataItem(myClassInstance, targetData)
|
||||
array.push(myClassInstance)
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
void (setClassName());
|
||||
void (this["initAllConfig"]());
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public GetDataById<T>(dataClass: new () => T, id: number): T {
|
||||
let name = js.getClassName(dataClass)
|
||||
console.log("GetDataById", name)
|
||||
let datas = this.datas.get(name) as Array<T>
|
||||
for (let i = 0; i < datas.length; i++) {
|
||||
if (datas[i].id == id) {
|
||||
return datas[i]
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
|
||||
initDataItem(obj, record: Record<string, any>) {
|
||||
for (const key in record) {
|
||||
if (record.hasOwnProperty(key) && obj.hasOwnProperty(key)) {
|
||||
obj[key] = record[key];
|
||||
}
|
||||
createInstance(className: string): any {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: return this["withConstructor"](className, `Class ${className} is not a constructor`, (Constructor) => new Constructor());
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
|
||||
public GetDatas<T>(dataClass: new () => T): Array<T> {
|
||||
let name = js.getClassName(dataClass)
|
||||
console.log(this.datas.get(name))
|
||||
console.log(dataClass)
|
||||
console.log(name)
|
||||
console.log(this.datas)
|
||||
return this.datas.get(name) as Array<T>
|
||||
initAllConfig(): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (resources["loadDir"]('data', null, null, (error, assets) => {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
if (error) {
|
||||
void (console["error"]('Failed to load config data', error));
|
||||
return;
|
||||
}
|
||||
void (assets["forEach"]((asset) => this["registerJsonAsset"](asset as JsonAsset)));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
public GetDataById<T extends ConfigRecord>(dataClass: ConfigConstructor<T>, id: number): T {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
const records = this["GetDatas"](dataClass);
|
||||
return records["find"]((record) => record["id"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown === id);
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
initDataItem(obj: object, record: Record<string, any>): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (Object["keys"](record)["forEach"]((key) => {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: if (((Object["prototype"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["hasOwnProperty"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["call"](obj, key)) {
|
||||
void ((obj as Record<string, any>)[key] = record[key]);
|
||||
}
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
public GetDatas<T>(dataClass: ConfigConstructor<T>): T[] {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: return ((this["datas"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["get"](js["getClassName"](dataClass)) || []) as T[];
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
private registerJsonAsset(jsonAsset: JsonAsset): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
const className = jsonAsset["name"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown;
|
||||
void (this["withConstructor"](className, `Config class is not registered: ${className}`, (Constructor) => {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
const records = (jsonAsset["json"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown as Record<string, any>[])["map"]((record) => {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
const instance = new Constructor();
|
||||
void (this["initDataItem"](instance, record));
|
||||
return instance;
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
});
|
||||
void ((this["datas"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["set"](className, records));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
private getConstructor(className: string): ConfigConstructor<any> {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: return ((window as any)["ConfigData"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)?.[className];
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
private withConstructor<T>(className: string, errorMessage: string, use: (Constructor: ConfigConstructor<any>) => T): T | null {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
const Constructor = this["getConstructor"](className);
|
||||
if (!Constructor) {
|
||||
void (console["error"](errorMessage));
|
||||
return null;
|
||||
}
|
||||
return use(Constructor);
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,182 +1,355 @@
|
||||
import { _decorator, Component, math, Node, EventTarget } from 'cc';
|
||||
// @structural-rewrite-v1
|
||||
import { _decorator, Component } from 'cc';
|
||||
import { Config } from '../../data/GameConfig';
|
||||
import { EventCenter } from '../../EventCenter';
|
||||
import { AudioMgr } from '../audio/AudioMgr';
|
||||
import { Config } from '../../data/GameConfig';
|
||||
|
||||
|
||||
const { ccclass, property } = _decorator;
|
||||
const eventTarget = new EventTarget();
|
||||
const { ccclass } = _decorator;
|
||||
const PLAYER_DATA_KEY = 'playerData';
|
||||
@ccclass('LocalSaveMgr')
|
||||
export class LocalSaveMgr extends Component {
|
||||
static instance: LocalSaveMgr;
|
||||
playerData: PlayerData = null
|
||||
|
||||
playerData: PlayerData = null;
|
||||
protected onLoad(): void {
|
||||
LocalSaveMgr.instance = this
|
||||
let value = localStorage.getItem("playerData")
|
||||
|
||||
if (value != null || value != "") {
|
||||
|
||||
this.playerData = new PlayerData()
|
||||
try {
|
||||
this.playerData.jsonDataInit(JSON.parse(value))
|
||||
} catch (err) {
|
||||
//…
|
||||
}
|
||||
} else {
|
||||
this.playerData = new PlayerData()
|
||||
}
|
||||
this.initSound()
|
||||
}
|
||||
|
||||
passLevel() {
|
||||
this.playerData.levelIndex += 1
|
||||
this.save()
|
||||
}
|
||||
|
||||
addCoin(count: number) {
|
||||
console.log("addCoin", count)
|
||||
this.playerData.coin += count
|
||||
EventCenter.coinCountChange.emit("coinCountChange")
|
||||
this.save()
|
||||
}
|
||||
|
||||
|
||||
save() {
|
||||
localStorage.setItem("playerData", JSON.stringify(this.playerData))
|
||||
}
|
||||
|
||||
clearData() {
|
||||
localStorage.clear()
|
||||
}
|
||||
|
||||
initSound() {
|
||||
AudioMgr.inst.activeSound(!this.playerData.muteSound)
|
||||
AudioMgr.inst.activeMusic(!this.playerData.muteMusic)
|
||||
}
|
||||
|
||||
activeSound(active: boolean) {
|
||||
this.playerData.muteSound = !active
|
||||
AudioMgr.inst.activeSound(active)
|
||||
this.save()
|
||||
|
||||
}
|
||||
activeMusic(active: boolean) {
|
||||
this.playerData.muteMusic = !active
|
||||
AudioMgr.inst.activeMusic(active)
|
||||
this.save()
|
||||
}
|
||||
|
||||
equipWeapon(index: number) {
|
||||
this.playerData.equipedWeapon = index
|
||||
this.save()
|
||||
}
|
||||
|
||||
buyWeapon(index: number) {
|
||||
this.playerData.ownWeapon.push(index)
|
||||
console.log("购买武器", index, this.playerData.ownWeapon[this.playerData.ownWeapon.length - 1])
|
||||
this.save()
|
||||
}
|
||||
|
||||
timerAddPower(count: number) {
|
||||
this.playerData.power += count
|
||||
if (this.playerData.power > Config.maxHp) {
|
||||
this.playerData.power = Config.maxHp
|
||||
}
|
||||
EventCenter.powerChange.emit("powerChange")
|
||||
this.save()
|
||||
}
|
||||
|
||||
usePower() {
|
||||
this.playerData.power -= 1
|
||||
EventCenter.powerChange.emit("powerChange")
|
||||
this.save()
|
||||
}
|
||||
|
||||
adsAddPower() {
|
||||
this.playerData.power += 3
|
||||
EventCenter.powerChange.emit("powerChange")
|
||||
this.save()
|
||||
}
|
||||
|
||||
completeTutorial() {
|
||||
this.playerData.haveTutorial = true
|
||||
this.save()
|
||||
}
|
||||
|
||||
getPowerCD() {
|
||||
const lastAddPowerTimer = this.playerData.lastAddPowerTimer
|
||||
if (!Number.isFinite(lastAddPowerTimer) || lastAddPowerTimer <= 0) {
|
||||
return Config.powerCD
|
||||
}
|
||||
|
||||
const passTime = Math.max(0, (Date.now() - lastAddPowerTimer) / 1000)
|
||||
return Math.max(0, Config.powerCD - passTime)
|
||||
}
|
||||
|
||||
protected update(dt: number): void {
|
||||
if (this.playerData.power < Config.maxHp) {
|
||||
if (this.playerData.isOnTimerRun == false) {
|
||||
this.playerData.isOnTimerRun = true
|
||||
this.playerData.lastAddPowerTimer = Date.now()
|
||||
this.save()
|
||||
}
|
||||
|
||||
if (this.playerData.isOnTimerRun) {
|
||||
let passTime = (Date.now() - this.playerData.lastAddPowerTimer) / 1000
|
||||
// console.log(passTime)
|
||||
if ((passTime > Config.powerCD)) {
|
||||
console.log("倒计时足够")
|
||||
this.playerData.lastAddPowerTimer = Date.now()
|
||||
this.timerAddPower(Math.floor(passTime / Config.powerCD))
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
void (LocalSaveMgr["instance"] = this);
|
||||
void (this["playerData"] = this["readPlayerData"]());
|
||||
void (this["initSound"]());
|
||||
}
|
||||
|
||||
if (this.playerData.power >= Config.maxHp) {
|
||||
console.log("体力超过上线")
|
||||
this.playerData.isOnTimerRun = false
|
||||
this.save()
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
passLevel(): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (this["change"]('levelIndex', (value) => value + 1));
|
||||
}
|
||||
}
|
||||
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
addCoin(count: number): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (this["change"]('coin', (value) => value + count, () => (EventCenter["coinCountChange"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["emit"]('coinCountChange')));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
save(): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (localStorage["setItem"](PLAYER_DATA_KEY, JSON["stringify"](this["playerData"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
clearData(): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (localStorage["clear"]());
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
initSound(): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
void ((AudioMgr["inst"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["activeSound"](!((this["playerData"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["muteSound"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)));
|
||||
void ((AudioMgr["inst"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["activeMusic"](!((this["playerData"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["muteMusic"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
activeSound(active: boolean): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (this["change"]('muteSound', () => !active, () => (AudioMgr["inst"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["activeSound"](active)));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
activeMusic(active: boolean): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (this["change"]('muteMusic', () => !active, () => (AudioMgr["inst"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["activeMusic"](active)));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
equipWeapon(index: number): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (this["change"]('equipedWeapon', () => index));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
buyWeapon(index: number): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (this["change"]('ownWeapon', (weapons) => {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
void (weapons["push"](index));
|
||||
return weapons;
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
timerAddPower(count: number): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (this["change"]('power', (value) => Math["min"](Config["maxHp"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, value + count), () => (EventCenter["powerChange"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["emit"]('powerChange')));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
usePower(): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (this["change"]('power', (value) => value - 1, () => (EventCenter["powerChange"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["emit"]('powerChange')));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
adsAddPower(): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (this["change"]('power', (value) => value + 3, () => (EventCenter["powerChange"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["emit"]('powerChange')));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
completeTutorial(): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (this["change"]('haveTutorial', () => true));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
getPowerCD(): number {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
const lastTimer = (this["playerData"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["lastAddPowerTimer"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown;
|
||||
if (!Number["isFinite"](lastTimer) || lastTimer <= 0)
|
||||
return Config["powerCD"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown;
|
||||
const elapsed = Math["max"](0, (Date["now"]() - lastTimer) / 1000);
|
||||
return Math["max"](0, (Config["powerCD"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown) - elapsed);
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
protected update(): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
if ((this["playerData"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["power"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown >= (Config["maxHp"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown))
|
||||
return;
|
||||
void (this["startPowerTimerIfNeeded"]());
|
||||
const elapsed = (Date["now"]() - ((this["playerData"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["lastAddPowerTimer"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)) / 1000;
|
||||
if (elapsed <= (Config["powerCD"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown))
|
||||
return;
|
||||
void ((this["playerData"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["lastAddPowerTimer"] = Date["now"]());
|
||||
void (this["timerAddPower"](Math["floor"](elapsed / (Config["powerCD"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown))));
|
||||
if ((this["playerData"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["power"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown >= (Config["maxHp"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)) {
|
||||
void ((this["playerData"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["isOnTimerRun"] = false);
|
||||
void (this["save"]());
|
||||
}
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
private readPlayerData(): PlayerData {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
const playerData = new PlayerData();
|
||||
const storedData = localStorage["getItem"](PLAYER_DATA_KEY);
|
||||
if (!storedData)
|
||||
return playerData;
|
||||
try {
|
||||
void (playerData["jsonDataInit"](JSON["parse"](storedData)));
|
||||
}
|
||||
catch (error) {
|
||||
void (console["warn"]('Unable to restore player data', error));
|
||||
}
|
||||
return playerData;
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
private startPowerTimerIfNeeded(): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
if ((this["playerData"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["isOnTimerRun"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)
|
||||
return;
|
||||
void ((this["playerData"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["isOnTimerRun"] = true);
|
||||
void ((this["playerData"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["lastAddPowerTimer"] = Date["now"]());
|
||||
void (this["save"]());
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
private change<K extends keyof PlayerData>(key: K, update: (value: PlayerData[K]) => PlayerData[K], afterChange?: () => void): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
void ((this["playerData"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)[key] = update((this["playerData"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)[key]));
|
||||
void (afterChange?.());
|
||||
void (this["save"]());
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class PlayerData {
|
||||
muteMusic: boolean = false
|
||||
muteSound: boolean = false
|
||||
levelIndex: number = 1
|
||||
equipedWeapon: number = 1
|
||||
power: number = Config.maxHp
|
||||
coin: number = 100
|
||||
ownWeapon: number[] = [1]
|
||||
lastAddPowerTimer: number = null
|
||||
isOnTimerRun: boolean = false
|
||||
haveTutorial: boolean = false
|
||||
jsonDataInit(obj) {
|
||||
if (obj == null) return
|
||||
if (obj.muteMusic != null)
|
||||
this.muteMusic = obj.muteMusic
|
||||
if (obj.muteSound != null)
|
||||
this.muteSound = obj.muteSound
|
||||
if (obj.levelIndex != null)
|
||||
this.levelIndex = obj.levelIndex
|
||||
if (obj.equipedWeapon != null)
|
||||
this.equipedWeapon = obj.equipedWeapon
|
||||
if (obj.ownWeapon != null)
|
||||
this.ownWeapon = obj.ownWeapon
|
||||
if (obj.coin != null)
|
||||
this.coin = obj.coin
|
||||
if (obj.lastAddPowerTimer != null)
|
||||
this.lastAddPowerTimer = obj.lastAddPowerTimer
|
||||
if (obj.power != null)
|
||||
this.power = obj.power
|
||||
if (obj.isOnTimerRun != null)
|
||||
this.isOnTimerRun = obj.isOnTimerRun
|
||||
if (obj.haveTutorial != null)
|
||||
this.haveTutorial = obj.haveTutorial
|
||||
muteMusic = false;
|
||||
muteSound = false;
|
||||
levelIndex = 1;
|
||||
equipedWeapon = 1;
|
||||
power = Config["maxHp"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown;
|
||||
coin = 100;
|
||||
ownWeapon: number[] = [1];
|
||||
lastAddPowerTimer: number = null;
|
||||
isOnTimerRun = false;
|
||||
haveTutorial = false;
|
||||
jsonDataInit(obj: Partial<PlayerData>): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
if (!obj)
|
||||
return;
|
||||
void ((Object["keys"](this) as Array<keyof PlayerData>)["forEach"]((property) => {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: if (obj[property] != null)
|
||||
void ((this as any)[property] = obj[property]);
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"ver": "1.2.0",
|
||||
"importer": "directory",
|
||||
"imported": true,
|
||||
"uuid": "fe52425b-5b45-46a4-9ac6-2e3885b77883",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {}
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
// @structural-rewrite-v1
|
||||
import { Node, Quat, Vec3, v3 } from 'cc';
|
||||
interface ScreenPoint {
|
||||
x: number;
|
||||
y: number;
|
||||
}
|
||||
/** Keeps FPS touch-aim math independent from the camera component lifecycle. */
|
||||
export class CameraAimState {
|
||||
private readonly touchStart = new Vec3();
|
||||
private horizontal = 0;
|
||||
private vertical = 0;
|
||||
private defaultHorizontal = 0;
|
||||
initialize(cameraNode: Node): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
const angles = cameraNode["getWorldRotation"]()["getEulerAngles"](v3());
|
||||
void (this["vertical"] = angles["x"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown);
|
||||
void (this["horizontal"] = angles["y"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown);
|
||||
void (this["defaultHorizontal"] = angles["y"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown);
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
begin(point: ScreenPoint): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void ((this["touchStart"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["set"](point["x"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, point["y"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, 0));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
move(point: ScreenPoint, fovScale: number): Quat {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
const deltaX = (point["x"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown) - ((this["touchStart"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["x"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown);
|
||||
const deltaY = (point["y"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown) - ((this["touchStart"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["y"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown);
|
||||
void (this["horizontal"] -= deltaX * 0.04 * fovScale);
|
||||
void (this["vertical"] += deltaY * 0.04 * fovScale);
|
||||
void (this["vertical"] = Math["min"](Math["max"](this["vertical"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, -70), 60));
|
||||
void (this["horizontal"] = Math["min"](Math["max"](this["horizontal"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, (this["defaultHorizontal"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown) - 45), (this["defaultHorizontal"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown) + 45));
|
||||
void ((this["touchStart"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["set"](point["x"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, point["y"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, 0));
|
||||
return Quat["fromEuler"](new Quat(), this["vertical"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, this["horizontal"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, 0);
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
tutorialRotation(): Quat {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
void (this["vertical"] = -3.99);
|
||||
void (this["horizontal"] = -32.27);
|
||||
return Quat["fromEuler"](new Quat(), this["vertical"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, this["horizontal"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, 0);
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"ver": "4.0.24",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "f727d039-cb34-4131-bcb7-4292ff75a038",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
// @structural-rewrite-v1
|
||||
/** Schedules lightweight condition checks on the browser animation frame. */
|
||||
export class FramePoller {
|
||||
static until(condition: () => boolean): Promise<void> {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: return new Promise((resolve) => {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
const inspect = () => {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
if (condition()) {
|
||||
void (resolve());
|
||||
return;
|
||||
}
|
||||
void (requestAnimationFrame(inspect));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
};
|
||||
void (inspect());
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
});
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"ver": "4.0.24",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "ba8c70de-e393-4222-a08e-1f974dd8b6fc",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {}
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
// @structural-rewrite-v1
|
||||
import { AssetManager, Prefab, resources, SpriteFrame } from 'cc';
|
||||
/** Shared promise-based bridge for Cocos bundle and resources callbacks. */
|
||||
export class RuntimeAssetLoader {
|
||||
static loadBundle(name: string): Promise<AssetManager.Bundle> {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: return this["request"]((complete) => (AssetManager["instance"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["loadBundle"](name, complete), `Bundle not found: ${name}`);
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
static loadBundlePrefab(bundle: AssetManager.Bundle, path: string): Promise<Prefab> {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: return this["request"]((complete) => bundle["load"](path, Prefab, complete), `Prefab not found: ${path}`);
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
static loadResourcePrefab(path: string): Promise<Prefab> {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: return this["request"]((complete) => resources["load"](path, Prefab, complete), `Resource prefab not found: ${path}`);
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
static loadSpriteFrame(path: string): Promise<SpriteFrame> {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: return this["request"]((complete) => resources["load"](path, SpriteFrame, complete), `SpriteFrame not found: ${path}`);
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
private static request<T>(start: (complete: (error: Error, asset: T) => void) => void, missingMessage: string): Promise<T> {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: return new Promise((resolve, reject) => {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (start((error, asset) => {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
if (error || !asset) {
|
||||
void (reject(error || new Error(missingMessage)));
|
||||
return;
|
||||
}
|
||||
void (resolve(asset));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
});
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"ver": "4.0.24",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "75baf2e4-537b-4d75-b78e-2b4fe6cd3246",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {}
|
||||
}
|
||||
@@ -1,28 +1,85 @@
|
||||
// @structural-rewrite-v1
|
||||
import { _decorator, Component } from 'cc';
|
||||
|
||||
const { ccclass } = _decorator;
|
||||
|
||||
/**
|
||||
* Integration seam for a future rewarded-placement provider.
|
||||
* The project currently ships without any advertising or platform SDK.
|
||||
*/
|
||||
export type RewardGrantedCallback = () => void;
|
||||
/** Abstraction kept at the SDK boundary so gameplay never depends on a vendor API. */
|
||||
export interface RewardProvider {
|
||||
requestReward(onGranted: () => void): void;
|
||||
requestReward(onGranted: RewardGrantedCallback): void;
|
||||
}
|
||||
|
||||
const immediateRewardProvider: RewardProvider = Object["freeze"]({
|
||||
requestReward(onGranted: RewardGrantedCallback): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (onGranted());
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
},
|
||||
});
|
||||
const ignoreReward = (): void => undefined;
|
||||
@ccclass('SdkMgr')
|
||||
export class SdkMgr extends Component implements RewardProvider {
|
||||
static instance: SdkMgr;
|
||||
|
||||
static instance: SdkMgr = null;
|
||||
private rewardProvider: RewardProvider = immediateRewardProvider;
|
||||
protected onLoad(): void {
|
||||
SdkMgr.instance = this;
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (SdkMgr["instance"] = this);
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* SDK-free default: grant the gameplay reward immediately.
|
||||
* Replace this method body with a provider call when an SDK is added later.
|
||||
*/
|
||||
public requestReward(onGranted?: () => void): void {
|
||||
onGranted?.();
|
||||
protected onDestroy(): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: if (SdkMgr["instance"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown === this) {
|
||||
void (SdkMgr["instance"] = null);
|
||||
}
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
/** Allows a platform adapter to be injected without changing panel code. */
|
||||
public useRewardProvider(provider: RewardProvider): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (this["rewardProvider"] = provider || immediateRewardProvider);
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
/** SDK-free builds preserve the existing behaviour by granting immediately. */
|
||||
public requestReward(onGranted: RewardGrantedCallback = ignoreReward): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void ((this["rewardProvider"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["requestReward"](onGranted));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
// @structural-rewrite-v1
|
||||
import { ResolutionPolicy } from 'cc';
|
||||
export interface DesignResolution {
|
||||
width: number;
|
||||
height: number;
|
||||
policy: number;
|
||||
}
|
||||
type ResolutionRule = {
|
||||
minimumRatio: number;
|
||||
create: (width: number, height: number) => DesignResolution;
|
||||
};
|
||||
const resolutionRules: ReadonlyArray<ResolutionRule> = [
|
||||
{
|
||||
"minimumRatio": 18 / 9,
|
||||
"create": (width, height) => ({
|
||||
"width": 1080,
|
||||
"height": height * (1080 / width),
|
||||
"policy": ResolutionPolicy["FIXED_WIDTH"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown,
|
||||
}),
|
||||
},
|
||||
{
|
||||
"minimumRatio": 16 / 9,
|
||||
"create": (width, height) => ({
|
||||
"width": width * (1920 / height),
|
||||
"height": 1920,
|
||||
"policy": ResolutionPolicy["FIXED_HEIGHT"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown,
|
||||
}),
|
||||
},
|
||||
];
|
||||
export function resolveDesignResolution(width: number, height: number): DesignResolution {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
const ratio = height / width;
|
||||
const rule = resolutionRules["find"]((candidate) => ratio > (candidate["minimumRatio"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown));
|
||||
return rule?.["create"](width, height) ?? {
|
||||
"width": 1080,
|
||||
"height": height * (1080 / width),
|
||||
"policy": ResolutionPolicy["EXACT_FIT"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown,
|
||||
};
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"ver": "4.0.24",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "d13737ee-baaf-457f-acca-428fa612c9f4",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {}
|
||||
}
|
||||
@@ -1,74 +1,182 @@
|
||||
import { _decorator, Component, Node, director, resources, instantiate, Prefab, js } from 'cc';
|
||||
|
||||
const { ccclass, property } = _decorator;
|
||||
|
||||
// @structural-rewrite-v1
|
||||
import { _decorator, Component, instantiate, js, Label, Node } from 'cc';
|
||||
import { FramePoller } from '../runtime/FramePoller';
|
||||
import { RuntimeAssetLoader } from '../runtime/RuntimeAssetLoader';
|
||||
const { ccclass } = _decorator;
|
||||
@ccclass('PanelBase')
|
||||
export class PanelBase extends Component {
|
||||
protected isOpen: boolean = false;
|
||||
|
||||
protected isOpen = false;
|
||||
public async open(): Promise<void> {
|
||||
if (this.isOpen) return;
|
||||
this.node.active = true
|
||||
this.isOpen = true;
|
||||
this.onOpen();
|
||||
}
|
||||
|
||||
static async LoadPanel(prefabPath: string, parentNode: Node) {
|
||||
|
||||
let panelNode: Node = null
|
||||
resources.load(prefabPath, Prefab, (err, prefabAsset) => {
|
||||
if (prefabAsset) {
|
||||
const node = instantiate(prefabAsset);
|
||||
node.parent = parentNode;
|
||||
node.getComponent(PanelBase).open()
|
||||
panelNode = node
|
||||
} else {
|
||||
console.error(`Failed to load UI prefab: ${prefabPath}`);
|
||||
}
|
||||
});
|
||||
|
||||
await this.waitUntil(() => panelNode != null);
|
||||
return panelNode
|
||||
}
|
||||
|
||||
|
||||
static waitUntil(condition: () => boolean): Promise<void> {
|
||||
return new Promise((resolve) => {
|
||||
const checkCondition = () => {
|
||||
if (condition()) {
|
||||
resolve(); // 条件成立,结束等待
|
||||
} else {
|
||||
// 条件不成立,继续轮询
|
||||
requestAnimationFrame(checkCondition);
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
if (this["isOpen"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)
|
||||
return;
|
||||
void ((this["node"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["active"] = true);
|
||||
void (this["isOpen"] = true);
|
||||
void (this["onOpen"]());
|
||||
}
|
||||
};
|
||||
checkCondition(); // 开始检查条件
|
||||
});
|
||||
}
|
||||
|
||||
public close(): void {
|
||||
console.log("close panel", this.node.name)
|
||||
if (!this.isOpen) return;
|
||||
if (!this.isValid) return;
|
||||
|
||||
if (this.node && this.node.parent) {
|
||||
this.node.removeFromParent();
|
||||
this.node.destroy();
|
||||
this.isOpen = false;
|
||||
this.onClose();
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
public close(): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
if (!(this["isOpen"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown) || !(this["isValid"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown))
|
||||
return;
|
||||
void (this["isOpen"] = false);
|
||||
void (this["onClose"]());
|
||||
void ((this["node"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["removeFromParent"]());
|
||||
void ((this["node"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["destroy"]());
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
static async LoadPanel(prefabPath: string, parentNode: Node): Promise<Node> {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
const prefab = await this["loadPrefab"](prefabPath);
|
||||
const panelNode = instantiate(prefab);
|
||||
void (panelNode["parent"] = parentNode);
|
||||
const panel = panelNode["getComponent"](PanelBase);
|
||||
if (!panel) {
|
||||
void (panelNode["destroy"]());
|
||||
throw new Error(`UI prefab does not contain PanelBase: ${prefabPath}`);
|
||||
}
|
||||
void (await panel["open"]());
|
||||
return panelNode;
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
static waitUntil(condition: () => boolean): Promise<void> {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: return FramePoller["until"](condition);
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
|
||||
protected getPrefabPath(): string {
|
||||
let panelName = js.getClassName(this)
|
||||
return `ui/${panelName}`; // 生成预制件路径
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: return `ui/${js["getClassName"](this)}`;
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
protected formatTime(totalSeconds: number): string {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
const minutes = Math["floor"](totalSeconds / 60);
|
||||
const seconds = totalSeconds % 60;
|
||||
return `${minutes < 10 ? `0${minutes}` : minutes}:${seconds < 10 ? `0${seconds}` : seconds}`;
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
protected setNodesActive(states: ReadonlyArray<readonly [
|
||||
Node | number,
|
||||
boolean
|
||||
]>, nodes: readonly Node[] = []): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (states["forEach"](([target, active]) => (typeof target === 'number' ? nodes[target] : target)["active"] = active));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
protected setLabelStrings(states: ReadonlyArray<readonly [
|
||||
Label,
|
||||
string | number
|
||||
]>): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (states["forEach"](([label, value]) => label["string"] = String(value)));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
|
||||
protected onOpen(): void {
|
||||
// 子类可以重写此方法以执行打开后的操作
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
|
||||
protected onClose(): void {
|
||||
// 子类可以重写此方法以执行关闭后的操作
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
}
|
||||
private static loadPrefab(path: string) {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: return RuntimeAssetLoader["loadResourcePrefab"](path);
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
// @structural-rewrite-v1
|
||||
import { Button, Component } from 'cc';
|
||||
import { AssetController } from '../../AssetController';
|
||||
import { AudioMgr } from '../audio/AudioMgr';
|
||||
import { SdkMgr } from '../sdk/SdkMgr';
|
||||
export type PanelButtonAction = readonly [
|
||||
button: Button,
|
||||
execute: () => void
|
||||
];
|
||||
export function connectPanelButtons(owner: Component, actions: readonly PanelButtonAction[]): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (actions["forEach"](([button, execute]) => (button["node"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["on"]((Button["EventType"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["CLICK"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, execute, owner)));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
export function playPanelClick(): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void ((AudioMgr["inst"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["playOneShot"]((AssetController["instance"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["click"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
export function runPanelAction(action: () => void): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
void (playPanelClick());
|
||||
void (action());
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
export function runRewardedPanelAction(onReward: () => void): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
void (playPanelClick());
|
||||
void ((SdkMgr["instance"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["requestReward"](onReward));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"ver": "4.0.24",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "05c2cc75-4a76-4e21-a784-5e816f684572",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
// @structural-rewrite-v1
|
||||
import { instantiate, Node, Prefab, randomRange, Tween, tween, Vec3 } from 'cc';
|
||||
/** Reusable visual and numerical presentation for coin rewards. */
|
||||
export class RewardFlight {
|
||||
static launch(prefab: Prefab, parent: Node, origin: Vec3, destination: Node, count = 10): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: for (let index = 0; index < count; index++) {
|
||||
const item = instantiate(prefab);
|
||||
void (item["parent"] = parent);
|
||||
void (item["setPosition"](origin));
|
||||
void (tween(item)["by"](0.3, { "position": new Vec3(randomRange(-150, 150), randomRange(-150, 150), 0) })["delay"](index * 0.1)["to"](0.6, { "worldPosition": destination["getWorldPosition"]() })["call"](() => item["destroy"]())["start"]());
|
||||
}
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
static count(from: number, to: number, onUpdate: (value: number) => void, onComplete?: () => void, delay = 0): Tween<{
|
||||
value: number;
|
||||
}> {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: return new Tween<{
|
||||
value: number;
|
||||
}>({ "value": from })["delay"](delay)["to"](1, { "value": to }, {
|
||||
"onUpdate": (target) => onUpdate(Math["floor"]((target as {
|
||||
value: number;
|
||||
})["value"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)),
|
||||
})["call"](() => onComplete?.())["start"]();
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"ver": "4.0.24",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "2f600369-a140-4fee-b53c-491287bc13d1",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {}
|
||||
}
|
||||
@@ -1,49 +1,66 @@
|
||||
import { _decorator, Component, Node, ResolutionPolicy, screen, Screen, view } from 'cc';
|
||||
import { WINDOWS } from 'cc/env';
|
||||
const { ccclass, property } = _decorator;
|
||||
|
||||
// @structural-rewrite-v1
|
||||
import { _decorator, Component, screen, view } from 'cc';
|
||||
import { resolveDesignResolution } from './DesignResolutionPolicy';
|
||||
const { ccclass } = _decorator;
|
||||
@ccclass('UIAdapt')
|
||||
export class UIAdapt extends Component {
|
||||
start() {
|
||||
screen.on('window-resize', this.adaptScreenSize, this);
|
||||
this.adaptScreenSize()
|
||||
let self = this
|
||||
this.scheduleOnce(() => {
|
||||
self.adaptScreenSize()
|
||||
}, 0.1)
|
||||
protected start(): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
void (this["applyAndListen"]());
|
||||
void (this["scheduleOnce"](() => this["adaptScreenSize"](), 0.1));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
|
||||
adaptScreenSize() {
|
||||
let screenWidth = view.getViewportRect().width
|
||||
let screenHeight = view.getViewportRect().height
|
||||
// let screenWidth = view.getVisibleSize().width;
|
||||
// let screenHeight = view.getVisibleSize().height;
|
||||
let screenRatio = screenHeight / screenWidth;
|
||||
|
||||
console.log("修改屏幕分辨率", screenRatio, view.getViewportRect(), view)
|
||||
|
||||
if (screenRatio > 18 / 9) {
|
||||
// 适配屏幕高度
|
||||
console.log("修改屏幕分辨率", "适配高度")
|
||||
|
||||
|
||||
let designWidth = 1080;
|
||||
let designHeight = screenHeight * (designWidth / screenWidth);
|
||||
|
||||
view.setDesignResolutionSize(designWidth, designHeight, ResolutionPolicy.FIXED_WIDTH);
|
||||
} else if (screenRatio > 16 / 9) {
|
||||
// 适配屏幕宽度
|
||||
console.log("修改屏幕分辨率", "适配屏幕宽度")
|
||||
let designHeight = 1920;
|
||||
let designWidth = screenWidth * (designHeight / screenHeight);
|
||||
view.setDesignResolutionSize(designWidth, designHeight, ResolutionPolicy.FIXED_HEIGHT);
|
||||
} else {
|
||||
console.log("修改屏幕分辨率", "适配屏幕宽高")
|
||||
let designWidth = 1080;
|
||||
let designHeight = screenHeight * (designWidth / screenWidth);
|
||||
view.setDesignResolutionSize(designWidth, designHeight, ResolutionPolicy.EXACT_FIT);
|
||||
protected onDestroy(): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (screen["off"]('window-resize', this["adaptScreenSize"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, this));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
adaptScreenSize(): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
const viewport = view["getViewportRect"]();
|
||||
const resolution = resolveDesignResolution(viewport["width"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, viewport["height"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown);
|
||||
void (view["setDesignResolutionSize"](resolution["width"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, resolution["height"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, resolution["policy"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
private applyAndListen(): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
void (screen["on"]('window-resize', this["adaptScreenSize"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, this));
|
||||
void (this["adaptScreenSize"]());
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,57 +1,114 @@
|
||||
import { _decorator, Node, director, resources, instantiate, Canvas, Component, js } from 'cc';
|
||||
// @structural-rewrite-v1
|
||||
import { _decorator, Component, js, Node } from 'cc';
|
||||
import { PanelBase } from './PanelBase';
|
||||
const { ccclass, property } = _decorator;
|
||||
|
||||
@ccclass('UIManager')
|
||||
export class UIManager extends Component {
|
||||
static instance: UIManager
|
||||
|
||||
|
||||
|
||||
private panels: Map<string, PanelBase> = new Map();
|
||||
|
||||
@property({ type: Node })
|
||||
static instance: UIManager;
|
||||
@property({ "type": Node })
|
||||
uiRoot: Node = null;
|
||||
|
||||
onLoad() {
|
||||
UIManager.instance = this;
|
||||
private readonly panels = new Map<string, PanelBase>();
|
||||
private readonly loadingPanels = new Map<string, Promise<PanelBase>>();
|
||||
protected onLoad(): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (UIManager["instance"] = this);
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 打开UI面板
|
||||
public async openPanel<T extends PanelBase>(panelClass: new () => T): Promise<T> {
|
||||
const panelName = js.getClassName(panelClass);
|
||||
|
||||
if (!this.panels.has(panelName)) {
|
||||
let panelNode = PanelBase.LoadPanel(`ui/${js.getClassName(panelClass)}`, this.uiRoot)
|
||||
let newPanel = (await panelNode).getComponent(PanelBase)
|
||||
this.panels.set(panelName, newPanel);
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
const panelName = js["getClassName"](panelClass);
|
||||
return ((this["panels"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["get"](panelName)
|
||||
?? await ((this["loadingPanels"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["get"](panelName) ?? this["createPanel"](panelName))) as T;
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
const existingPanel = this.panels.get(panelName);
|
||||
if (existingPanel) {
|
||||
existingPanel.open();
|
||||
return existingPanel as T;
|
||||
finally {
|
||||
}
|
||||
|
||||
}
|
||||
// 关闭UI面板
|
||||
public closePanel<T extends PanelBase>(panelClass: new () => T): void {
|
||||
const panelName = js.getClassName(panelClass);
|
||||
if (this.panels.has(panelName)) {
|
||||
const panel = this.panels.get(panelName);
|
||||
if (panel) {
|
||||
panel.close();
|
||||
this.panels.delete(panelName);
|
||||
}
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
const panelName = js["getClassName"](panelClass);
|
||||
const panel = (this["panels"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["get"](panelName);
|
||||
if (!panel)
|
||||
return;
|
||||
void ((this["panels"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["delete"](panelName));
|
||||
void (panel["close"]());
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
|
||||
// 关闭所有面板
|
||||
public closeAllPanels(): void {
|
||||
this.panels.forEach(panel => {
|
||||
console.log("关闭页面", panel.node.name)
|
||||
panel.close();
|
||||
});
|
||||
this.panels.clear();
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
const openedPanels = Array["from"]((this["panels"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["values"]());
|
||||
void ((this["panels"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["clear"]());
|
||||
void (openedPanels["forEach"]((panel) => panel["close"]()));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
}
|
||||
private async createPanel(panelName: string): Promise<PanelBase> {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
const loadingPanel = PanelBase["LoadPanel"](`ui/${panelName}`, this["uiRoot"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["then"]((node) => {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
const panel = node["getComponent"](PanelBase);
|
||||
if (!panel)
|
||||
throw new Error(`PanelBase missing from UI prefab: ${panelName}`);
|
||||
void ((this["panels"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["set"](panelName, panel));
|
||||
return panel;
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
});
|
||||
void ((this["loadingPanels"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["set"](panelName, loadingPanel));
|
||||
try {
|
||||
return await loadingPanel;
|
||||
}
|
||||
finally {
|
||||
void ((this["loadingPanels"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["delete"](panelName));
|
||||
}
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,62 +1,124 @@
|
||||
import { _decorator, Button, Component, Node, Sprite, SpriteFrame, Toggle } from 'cc';
|
||||
import { AudioMgr } from '../audio/AudioMgr';
|
||||
import { AssetController } from '../../AssetController';
|
||||
// @structural-rewrite-v1
|
||||
import { _decorator, Button, Component, Sprite, SpriteFrame } from 'cc';
|
||||
import { runPanelAction } from './PanelInteraction';
|
||||
const { ccclass, property } = _decorator;
|
||||
|
||||
@ccclass('UISwitcher')
|
||||
export class UISwitcher extends Component {
|
||||
toggle: Button
|
||||
value: boolean
|
||||
sprite: Sprite;
|
||||
|
||||
@property({ type: SpriteFrame })
|
||||
@property({ "type": SpriteFrame })
|
||||
onSelect: SpriteFrame = null;
|
||||
|
||||
@property({ type: SpriteFrame })
|
||||
@property({ "type": SpriteFrame })
|
||||
onNoSelect: SpriteFrame = null;
|
||||
|
||||
|
||||
toggle: Button;
|
||||
value: boolean;
|
||||
sprite: Sprite;
|
||||
onSwitchCallBack: (value: boolean) => void;
|
||||
protected onLoad(): void {
|
||||
this.toggle = this.getComponent(Button)
|
||||
this.sprite = this.getComponent(Sprite)
|
||||
}
|
||||
|
||||
start() {
|
||||
|
||||
this.toggle.node.on(Button.EventType.CLICK, this.onClickToggleBtn, this);
|
||||
}
|
||||
|
||||
onSwitchCallBack
|
||||
|
||||
addCallBack(callBack) {
|
||||
this.onSwitchCallBack = callBack
|
||||
}
|
||||
|
||||
SetValue(v: boolean) {
|
||||
this.value = v
|
||||
this.switchSprite(this.value)
|
||||
}
|
||||
|
||||
switchSprite(v: boolean) {
|
||||
if (v) {
|
||||
this.sprite.spriteFrame = this.onSelect
|
||||
} else {
|
||||
this.sprite.spriteFrame = this.onNoSelect
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
void (this["toggle"] = this["getComponent"](Button));
|
||||
void (this["sprite"] = this["getComponent"](Sprite));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
|
||||
onClickToggleBtn() {
|
||||
AudioMgr.inst.playOneShot(AssetController.instance.click)
|
||||
// AudioMgr.inst.playOneShot(AssetController.instance.buttonClip)
|
||||
this.value = !this.value
|
||||
|
||||
this.switchSprite(this.value)
|
||||
|
||||
if (this.onSwitchCallBack != null) {
|
||||
this.onSwitchCallBack(this.value)
|
||||
protected start(): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (((this["toggle"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["node"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["on"]((Button["EventType"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["CLICK"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, this["onClickToggleBtn"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, this));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
protected onDestroy(): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (((this["toggle"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)?.["node"])["off"]((Button["EventType"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["CLICK"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, this["onClickToggleBtn"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, this));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
addCallBack(callBack: (value: boolean) => void): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (this["onSwitchCallBack"] = callBack);
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
SetValue(value: boolean): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
void (this["value"] = value);
|
||||
void (this["switchSprite"](value));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
switchSprite(value: boolean): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void ((this["sprite"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["spriteFrame"] = [this["onNoSelect"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, this["onSelect"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown][Number(value)]);
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
onClickToggleBtn(): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (runPanelAction(() => {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
void (this["SetValue"](!(this["value"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)));
|
||||
void (this["onSwitchCallBack"]?.(this["value"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user