feat: game time scale
parent
0d4aa0b801
commit
239aa5b411
|
@ -1562,6 +1562,7 @@
|
||||||
"__type__": "6bb6fbw5PNPYq7zksYK1kHJ",
|
"__type__": "6bb6fbw5PNPYq7zksYK1kHJ",
|
||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
|
"__editorExtras__": {},
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 33
|
"__id__": 33
|
||||||
},
|
},
|
||||||
|
@ -1883,6 +1884,7 @@
|
||||||
"__type__": "6bb6fbw5PNPYq7zksYK1kHJ",
|
"__type__": "6bb6fbw5PNPYq7zksYK1kHJ",
|
||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
|
"__editorExtras__": {},
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 41
|
"__id__": 41
|
||||||
},
|
},
|
||||||
|
@ -2466,6 +2468,7 @@
|
||||||
"__type__": "6bb6fbw5PNPYq7zksYK1kHJ",
|
"__type__": "6bb6fbw5PNPYq7zksYK1kHJ",
|
||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
|
"__editorExtras__": {},
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 49
|
"__id__": 49
|
||||||
},
|
},
|
||||||
|
@ -3021,6 +3024,7 @@
|
||||||
"__type__": "6bb6fbw5PNPYq7zksYK1kHJ",
|
"__type__": "6bb6fbw5PNPYq7zksYK1kHJ",
|
||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
|
"__editorExtras__": {},
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 63
|
"__id__": 63
|
||||||
},
|
},
|
||||||
|
@ -3370,6 +3374,7 @@
|
||||||
"__type__": "6bb6fbw5PNPYq7zksYK1kHJ",
|
"__type__": "6bb6fbw5PNPYq7zksYK1kHJ",
|
||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
|
"__editorExtras__": {},
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 77
|
"__id__": 77
|
||||||
},
|
},
|
||||||
|
@ -3719,6 +3724,7 @@
|
||||||
"__type__": "6bb6fbw5PNPYq7zksYK1kHJ",
|
"__type__": "6bb6fbw5PNPYq7zksYK1kHJ",
|
||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
|
"__editorExtras__": {},
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 86
|
"__id__": 86
|
||||||
},
|
},
|
||||||
|
@ -7124,6 +7130,7 @@
|
||||||
"__type__": "ce7b7e0d6BHlaRFoKBZN0h/",
|
"__type__": "ce7b7e0d6BHlaRFoKBZN0h/",
|
||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
|
"__editorExtras__": {},
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 135
|
"__id__": 135
|
||||||
},
|
},
|
||||||
|
@ -7794,6 +7801,7 @@
|
||||||
"__type__": "e3b5fa7tUtAbK3rQJ/G2Rox",
|
"__type__": "e3b5fa7tUtAbK3rQJ/G2Rox",
|
||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
|
"__editorExtras__": {},
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 212
|
"__id__": 212
|
||||||
},
|
},
|
||||||
|
@ -8260,6 +8268,7 @@
|
||||||
"__type__": "671bfEgTTVFgLo1v+x/wd06",
|
"__type__": "671bfEgTTVFgLo1v+x/wd06",
|
||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
|
"__editorExtras__": {},
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 221
|
"__id__": 221
|
||||||
},
|
},
|
||||||
|
@ -11829,6 +11838,7 @@
|
||||||
"__type__": "58a5aCWE8VEqJK+0wznWL24",
|
"__type__": "58a5aCWE8VEqJK+0wznWL24",
|
||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
|
"__editorExtras__": {},
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 311
|
"__id__": 311
|
||||||
},
|
},
|
||||||
|
@ -14643,6 +14653,7 @@
|
||||||
"__type__": "c5e2dm0qXVOuKP1ju7uyMtJ",
|
"__type__": "c5e2dm0qXVOuKP1ju7uyMtJ",
|
||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
|
"__editorExtras__": {},
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 458
|
"__id__": 458
|
||||||
},
|
},
|
||||||
|
@ -15877,6 +15888,7 @@
|
||||||
"__type__": "ecf07La1rNA8YjY0h97yfWf",
|
"__type__": "ecf07La1rNA8YjY0h97yfWf",
|
||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
|
"__editorExtras__": {},
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 237
|
"__id__": 237
|
||||||
},
|
},
|
||||||
|
@ -17260,6 +17272,7 @@
|
||||||
"__type__": "204c1A707JPjYYnhqfMvkXj",
|
"__type__": "204c1A707JPjYYnhqfMvkXj",
|
||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
|
"__editorExtras__": {},
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 586
|
"__id__": 586
|
||||||
},
|
},
|
||||||
|
@ -17726,6 +17739,7 @@
|
||||||
"__type__": "fe619HtEX1OQq7oeACKrANd",
|
"__type__": "fe619HtEX1OQq7oeACKrANd",
|
||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
|
"__editorExtras__": {},
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 608
|
"__id__": 608
|
||||||
},
|
},
|
||||||
|
@ -18380,6 +18394,7 @@
|
||||||
"__type__": "02a884WNWtExrO21yAjQDWZ",
|
"__type__": "02a884WNWtExrO21yAjQDWZ",
|
||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
|
"__editorExtras__": {},
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 221
|
"__id__": 221
|
||||||
},
|
},
|
||||||
|
@ -19025,6 +19040,7 @@
|
||||||
"__type__": "bed15fuvPJLIp1O3BWg43ad",
|
"__type__": "bed15fuvPJLIp1O3BWg43ad",
|
||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
|
"__editorExtras__": {},
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 647
|
"__id__": 647
|
||||||
},
|
},
|
||||||
|
@ -19668,6 +19684,7 @@
|
||||||
"__type__": "bed15fuvPJLIp1O3BWg43ad",
|
"__type__": "bed15fuvPJLIp1O3BWg43ad",
|
||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
|
"__editorExtras__": {},
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 663
|
"__id__": 663
|
||||||
},
|
},
|
||||||
|
@ -20311,6 +20328,7 @@
|
||||||
"__type__": "bed15fuvPJLIp1O3BWg43ad",
|
"__type__": "bed15fuvPJLIp1O3BWg43ad",
|
||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
|
"__editorExtras__": {},
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 682
|
"__id__": 682
|
||||||
},
|
},
|
||||||
|
@ -20954,6 +20972,7 @@
|
||||||
"__type__": "bed15fuvPJLIp1O3BWg43ad",
|
"__type__": "bed15fuvPJLIp1O3BWg43ad",
|
||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
|
"__editorExtras__": {},
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 701
|
"__id__": 701
|
||||||
},
|
},
|
||||||
|
@ -21633,6 +21652,7 @@
|
||||||
"__type__": "85a1du42gFMrIHUG6qev0l/",
|
"__type__": "85a1du42gFMrIHUG6qev0l/",
|
||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
|
"__editorExtras__": {},
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 722
|
"__id__": 722
|
||||||
},
|
},
|
||||||
|
@ -22219,6 +22239,7 @@
|
||||||
"__type__": "85a1du42gFMrIHUG6qev0l/",
|
"__type__": "85a1du42gFMrIHUG6qev0l/",
|
||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
|
"__editorExtras__": {},
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 737
|
"__id__": 737
|
||||||
},
|
},
|
||||||
|
@ -22805,6 +22826,7 @@
|
||||||
"__type__": "85a1du42gFMrIHUG6qev0l/",
|
"__type__": "85a1du42gFMrIHUG6qev0l/",
|
||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
|
"__editorExtras__": {},
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 752
|
"__id__": 752
|
||||||
},
|
},
|
||||||
|
@ -23376,6 +23398,7 @@
|
||||||
"__type__": "85a1du42gFMrIHUG6qev0l/",
|
"__type__": "85a1du42gFMrIHUG6qev0l/",
|
||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
|
"__editorExtras__": {},
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 767
|
"__id__": 767
|
||||||
},
|
},
|
||||||
|
@ -23549,6 +23572,7 @@
|
||||||
"__type__": "ca8a0x4KJRGNJFfMRlEhSED",
|
"__type__": "ca8a0x4KJRGNJFfMRlEhSED",
|
||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
|
"__editorExtras__": {},
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 783
|
"__id__": 783
|
||||||
},
|
},
|
||||||
|
@ -31054,6 +31078,7 @@
|
||||||
"__type__": "402d0NRh/pCFotZG+o5aE8p",
|
"__type__": "402d0NRh/pCFotZG+o5aE8p",
|
||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
|
"__editorExtras__": {},
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 788
|
"__id__": 788
|
||||||
},
|
},
|
||||||
|
@ -33513,6 +33538,7 @@
|
||||||
"__type__": "1f970S32ylOnofatPpSgI1Z",
|
"__type__": "1f970S32ylOnofatPpSgI1Z",
|
||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
|
"__editorExtras__": {},
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 998
|
"__id__": 998
|
||||||
},
|
},
|
||||||
|
@ -35530,6 +35556,7 @@
|
||||||
"__type__": "1f970S32ylOnofatPpSgI1Z",
|
"__type__": "1f970S32ylOnofatPpSgI1Z",
|
||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
|
"__editorExtras__": {},
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 1133
|
"__id__": 1133
|
||||||
},
|
},
|
||||||
|
@ -36013,6 +36040,7 @@
|
||||||
"__type__": "85b9aaRsZBAn5sUxS5RQ3EF",
|
"__type__": "85b9aaRsZBAn5sUxS5RQ3EF",
|
||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
|
"__editorExtras__": {},
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 9
|
"__id__": 9
|
||||||
},
|
},
|
||||||
|
@ -36039,7 +36067,7 @@
|
||||||
"y": -1200,
|
"y": -1200,
|
||||||
"z": 0
|
"z": 0
|
||||||
},
|
},
|
||||||
"_timePlay": 10,
|
"_timePlay": 120,
|
||||||
"_clockIcon": {
|
"_clockIcon": {
|
||||||
"__uuid__": "f7bd5166-9d5f-4d43-a3d3-58ae9a4957fc@f9941",
|
"__uuid__": "f7bd5166-9d5f-4d43-a3d3-58ae9a4957fc@f9941",
|
||||||
"__expectedType__": "cc.SpriteFrame"
|
"__expectedType__": "cc.SpriteFrame"
|
||||||
|
|
|
@ -1,12 +1,17 @@
|
||||||
import {
|
import {
|
||||||
|
AudioSource,
|
||||||
Component,
|
Component,
|
||||||
|
Event,
|
||||||
|
Game,
|
||||||
IVec2Like,
|
IVec2Like,
|
||||||
IVec3Like,
|
IVec3Like,
|
||||||
Label,
|
Label,
|
||||||
Node,
|
Node,
|
||||||
NodeSpace,
|
NodeSpace,
|
||||||
|
Sprite,
|
||||||
Vec2,
|
Vec2,
|
||||||
Vec3,
|
Vec3,
|
||||||
|
game,
|
||||||
randomRangeInt,
|
randomRangeInt,
|
||||||
toDegree,
|
toDegree,
|
||||||
toRadian,
|
toRadian,
|
||||||
|
@ -14,8 +19,14 @@ import {
|
||||||
import ObjectPool from '../Pool/ObjectPool';
|
import ObjectPool from '../Pool/ObjectPool';
|
||||||
|
|
||||||
declare module 'cc' {
|
declare module 'cc' {
|
||||||
|
interface Game {
|
||||||
|
timeScale: number;
|
||||||
|
}
|
||||||
|
|
||||||
interface Component {
|
interface Component {
|
||||||
setNodeActive(isActive: boolean): void;
|
setNodeActive(isActive: boolean): void;
|
||||||
|
setNodeActive(event: Event, customEventData?: string): void;
|
||||||
|
setNodeActive(a: boolean | Event, b?: string): void;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Node {
|
interface Node {
|
||||||
|
@ -32,7 +43,7 @@ declare module 'cc' {
|
||||||
setScaleX(x: number): void;
|
setScaleX(x: number): void;
|
||||||
setScaleY(y: number): void;
|
setScaleY(y: number): void;
|
||||||
setScaleZ(z: number): void;
|
setScaleZ(z: number): void;
|
||||||
releaseToPool(): void;
|
releaseToPool(): boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Vec2 {
|
interface Vec2 {
|
||||||
|
@ -48,7 +59,22 @@ declare module 'cc' {
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Label {
|
interface Label {
|
||||||
setString(value: string | number);
|
setString(value: string | number): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Sprite {
|
||||||
|
setFillRange(value: number): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface AudioSource {
|
||||||
|
getPlaybackRate(): number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set playbackRate of this audio source
|
||||||
|
*
|
||||||
|
* Note: playbackRate control may be ineffective on some platforms.
|
||||||
|
*/
|
||||||
|
setPlaybackRate(value: number): void;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,10 +90,35 @@ declare global {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//#region GAME
|
||||||
|
|
||||||
|
Game.prototype.timeScale = 1;
|
||||||
|
// @ts-ignore
|
||||||
|
game._calculateDT = function (useFixedDeltaTime: number) {
|
||||||
|
this._useFixedDeltaTime = useFixedDeltaTime;
|
||||||
|
if (useFixedDeltaTime) {
|
||||||
|
this._startTime = performance.now();
|
||||||
|
return this.frameTime / 1000;
|
||||||
|
}
|
||||||
|
const now = performance.now();
|
||||||
|
this._deltaTime = now > this._startTime ? (now - this._startTime) / 1000 : 0;
|
||||||
|
if (this._deltaTime > Game.DEBUG_DT_THRESHOLD) {
|
||||||
|
this._deltaTime = this.frameTime / 1000;
|
||||||
|
}
|
||||||
|
this._startTime = now;
|
||||||
|
return this._deltaTime * this.timeScale;
|
||||||
|
};
|
||||||
|
|
||||||
|
//#endregion
|
||||||
|
|
||||||
//#region COMPONENT
|
//#region COMPONENT
|
||||||
|
|
||||||
Component.prototype.setNodeActive = function (isActive: boolean) {
|
Component.prototype.setNodeActive = function (a: boolean | Event, b?: string) {
|
||||||
this.node.setActive(isActive);
|
if (a instanceof Event) {
|
||||||
|
this.node.active = b?.toLowerCase() === 'true';
|
||||||
|
} else {
|
||||||
|
this.node.active = a;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
//#endregion
|
//#endregion
|
||||||
|
@ -127,7 +178,7 @@ Node.prototype.setScaleZ = function (z: number): void {
|
||||||
};
|
};
|
||||||
|
|
||||||
Node.prototype.releaseToPool = function () {
|
Node.prototype.releaseToPool = function () {
|
||||||
ObjectPool.release(this);
|
return ObjectPool.release(this);
|
||||||
};
|
};
|
||||||
|
|
||||||
//#endregion
|
//#endregion
|
||||||
|
@ -190,6 +241,14 @@ Label.prototype.setString = function (value: string | number) {
|
||||||
|
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
|
//#region SPRITE
|
||||||
|
|
||||||
|
Sprite.prototype.setFillRange = function (value: number) {
|
||||||
|
this.fillRange = value;
|
||||||
|
};
|
||||||
|
|
||||||
|
//#endregion
|
||||||
|
|
||||||
//#region STRING
|
//#region STRING
|
||||||
|
|
||||||
String.prototype.jsonParse = function () {
|
String.prototype.jsonParse = function () {
|
||||||
|
@ -222,3 +281,54 @@ Array.prototype.getRandom = function (weights?: number[]) {
|
||||||
};
|
};
|
||||||
|
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
|
//#region AUDIO SOURCE
|
||||||
|
|
||||||
|
//support audio playbackRate
|
||||||
|
//@ts-ignore
|
||||||
|
AudioSource.prototype._playbackRate = 1;
|
||||||
|
//@ts-ignores
|
||||||
|
AudioSource.prototype._syncStates = function () {
|
||||||
|
if (this._player) {
|
||||||
|
this._player.loop = this._loop;
|
||||||
|
this._player.volume = this._volume;
|
||||||
|
// this._player._sourceNode.playbackRate = this._playbackRate;
|
||||||
|
|
||||||
|
this._operationsBeforeLoading.forEach((opInfo): void => {
|
||||||
|
if (opInfo.op === 'SEEK') {
|
||||||
|
this._cachedCurrentTime = (opInfo.params && opInfo.params[0]) as number;
|
||||||
|
if (this._player) {
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
||||||
|
this._player.seek(this._cachedCurrentTime).catch((e): void => {});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this[opInfo.op]?.();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
try {
|
||||||
|
this._player._player._sourceNode.playbackRate.value = this._playbackRate;
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e);
|
||||||
|
}
|
||||||
|
this._operationsBeforeLoading.length = 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
AudioSource.prototype.getPlaybackRate = function () {
|
||||||
|
return this._playbackRate;
|
||||||
|
};
|
||||||
|
|
||||||
|
AudioSource.prototype.setPlaybackRate = function (value: number) {
|
||||||
|
if (this._player) {
|
||||||
|
try {
|
||||||
|
this._player._player._sourceNode.playbackRate.value = value;
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e);
|
||||||
|
}
|
||||||
|
this._playbackRate = this._player.playbackRate;
|
||||||
|
} else {
|
||||||
|
this._playbackRate = value;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
//#endregion
|
||||||
|
|
|
@ -1,7 +1,12 @@
|
||||||
import { _decorator, AudioClip, AudioSource, sys } from 'cc';
|
import { _decorator, AudioClip, AudioSource } from 'cc';
|
||||||
import 'howler';
|
|
||||||
|
|
||||||
export class SfxSource {
|
interface ISoundOptions {
|
||||||
|
volume?: number;
|
||||||
|
loop?: boolean;
|
||||||
|
playbackRate?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class SoundSource {
|
||||||
private _source: AudioSource;
|
private _source: AudioSource;
|
||||||
|
|
||||||
public get playing() {
|
public get playing() {
|
||||||
|
@ -41,6 +46,22 @@ export class SfxSource {
|
||||||
this._mute = value;
|
this._mute = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public get clip() {
|
||||||
|
return this._source.clip;
|
||||||
|
}
|
||||||
|
|
||||||
|
public set clip(value: AudioClip) {
|
||||||
|
this._source.clip = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get playbackRate() {
|
||||||
|
return this._source.getPlaybackRate();
|
||||||
|
}
|
||||||
|
|
||||||
|
public set playbackRate(value: number) {
|
||||||
|
this._source.setPlaybackRate(value);
|
||||||
|
}
|
||||||
|
|
||||||
constructor(audioClip: AudioClip) {
|
constructor(audioClip: AudioClip) {
|
||||||
this._source = new AudioSource();
|
this._source = new AudioSource();
|
||||||
this._source.playOnAwake = false;
|
this._source.playOnAwake = false;
|
||||||
|
@ -65,8 +86,9 @@ export class SfxSource {
|
||||||
}
|
}
|
||||||
|
|
||||||
export default class AudioManager {
|
export default class AudioManager {
|
||||||
private static _audioSourcesSfx: Map<AudioClip, SfxSource> = new Map();
|
private static readonly storageKey = 'gad-game-galaxy-seeker-mute';
|
||||||
private static _audioSourceBgm: Howl;
|
private static _audioSourcesSfx: Map<AudioClip, SoundSource> = new Map();
|
||||||
|
private static _audioSourceBgm: SoundSource;
|
||||||
private static _isMute: boolean = false;
|
private static _isMute: boolean = false;
|
||||||
|
|
||||||
public static get mute() {
|
public static get mute() {
|
||||||
|
@ -80,33 +102,44 @@ export default class AudioManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static setMute(mute: boolean) {
|
public static setMute(mute: boolean) {
|
||||||
this._isMute = mute;
|
this._audioSourceBgm.mute = mute;
|
||||||
this._audioSourceBgm.mute(this._isMute);
|
|
||||||
this._audioSourcesSfx.forEach((source) => {
|
this._audioSourcesSfx.forEach((source) => {
|
||||||
source.mute = this._isMute;
|
source.mute = mute;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this._isMute = mute;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static playBGM(audio: AudioClip, opts?: { volume?: number; loop?: boolean; rate?: number }) {
|
public static playBGM(audio: AudioClip, opts?: ISoundOptions) {
|
||||||
this._audioSourceBgm?.stop();
|
const config: ISoundOptions = {
|
||||||
this._audioSourceBgm = new Howl({
|
volume: 1,
|
||||||
src: audio.nativeUrl,
|
|
||||||
loop: true,
|
loop: true,
|
||||||
mute: this._isMute,
|
playbackRate: 1,
|
||||||
...opts,
|
...opts,
|
||||||
});
|
};
|
||||||
|
if (this._audioSourceBgm) {
|
||||||
|
this._audioSourceBgm.stop();
|
||||||
|
this._audioSourceBgm.clip = audio;
|
||||||
|
} else {
|
||||||
|
this._audioSourceBgm = new SoundSource(audio);
|
||||||
|
}
|
||||||
|
this._audioSourceBgm.loop = config.loop;
|
||||||
|
this._audioSourceBgm.volume = config.volume;
|
||||||
|
this._audioSourceBgm.playbackRate = config.playbackRate;
|
||||||
|
this._audioSourceBgm.mute = this._isMute;
|
||||||
this._audioSourceBgm.play();
|
this._audioSourceBgm.play();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static setPlayRateBGM(rate: number) {
|
public static setPlayRateBGM(rate: number) {
|
||||||
this._audioSourceBgm.rate(rate);
|
this._audioSourceBgm.playbackRate = rate;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static playSfx(audioClip: AudioClip, opts?: { volume?: number; loop?: boolean }) {
|
public static playSfx(audioClip: AudioClip, opts?: ISoundOptions) {
|
||||||
let soundSource = this._audioSourcesSfx.get(audioClip);
|
let soundSource = this._audioSourcesSfx.get(audioClip);
|
||||||
const config = {
|
const config: ISoundOptions = {
|
||||||
volume: 1,
|
volume: 1,
|
||||||
loop: false,
|
loop: false,
|
||||||
|
playbackRate: 1,
|
||||||
...opts,
|
...opts,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -118,7 +151,7 @@ export default class AudioManager {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
soundSource = new SfxSource(audioClip);
|
soundSource = new SoundSource(audioClip);
|
||||||
soundSource.loop = config.loop;
|
soundSource.loop = config.loop;
|
||||||
soundSource.volume = config.volume;
|
soundSource.volume = config.volume;
|
||||||
soundSource.mute = this._isMute;
|
soundSource.mute = this._isMute;
|
||||||
|
@ -138,7 +171,7 @@ export default class AudioManager {
|
||||||
this._audioSourcesSfx.forEach((sfx) => sfx.stop());
|
this._audioSourcesSfx.forEach((sfx) => sfx.stop());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static findAudioSourcesSfx(audioClip: AudioClip): SfxSource {
|
public static findAudioSourcesSfx(audioClip: AudioClip): SoundSource {
|
||||||
return this._audioSourcesSfx.get(audioClip);
|
return this._audioSourcesSfx.get(audioClip);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Component, Node, Prefab, director, instantiate } from 'cc';
|
import { _decorator, Component, director, instantiate, Node, Prefab } from 'cc';
|
||||||
import IPoolable from './IPoolable';
|
import IPoolable from './IPoolable';
|
||||||
|
|
||||||
export default class ObjectPool {
|
export default class ObjectPool {
|
||||||
|
@ -6,13 +6,13 @@ export default class ObjectPool {
|
||||||
private _actives: Node[] = [];
|
private _actives: Node[] = [];
|
||||||
private _prefab: Prefab;
|
private _prefab: Prefab;
|
||||||
private _expandable;
|
private _expandable;
|
||||||
private _poolHandlerComp: new () => any;
|
private _poolHandlerComp: (new () => any) | string;
|
||||||
|
|
||||||
public get actives() {
|
public get listActive() {
|
||||||
return [...this._actives];
|
return [...this._actives];
|
||||||
}
|
}
|
||||||
|
|
||||||
public get inActives() {
|
public get listInactive() {
|
||||||
return [...this._inactive];
|
return [...this._inactive];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,7 +32,12 @@ export default class ObjectPool {
|
||||||
return this.countInactive + this.countActive;
|
return this.countInactive + this.countActive;
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(prefab: Prefab, size: number, expandable = true, poolHandlerComp?: new () => any | string) {
|
constructor(
|
||||||
|
prefab?: Prefab,
|
||||||
|
size?: number,
|
||||||
|
expandable: boolean = true,
|
||||||
|
poolHandlerComp?: (new () => any) | string,
|
||||||
|
) {
|
||||||
if (!!!prefab) {
|
if (!!!prefab) {
|
||||||
console.error('prefab cant be null or undefine');
|
console.error('prefab cant be null or undefine');
|
||||||
return;
|
return;
|
||||||
|
@ -45,14 +50,14 @@ export default class ObjectPool {
|
||||||
let obj = instantiate(this._prefab); // create node instance
|
let obj = instantiate(this._prefab); // create node instance
|
||||||
obj.removeFromParent();
|
obj.removeFromParent();
|
||||||
this._inactive.push(obj);
|
this._inactive.push(obj);
|
||||||
ObjectPool._poolLookUp[obj.uuid] = this;
|
ObjectPool._poolLookUp.set(obj, this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//#region Static
|
//#region Static
|
||||||
private static _poolLookUp: { [key: string]: ObjectPool } = {};
|
private static _poolLookUp: Map<Node, ObjectPool> = new Map();
|
||||||
public static release(obj: Node) {
|
public static release(obj: Node): boolean {
|
||||||
ObjectPool._poolLookUp[obj.uuid].release(obj);
|
return ObjectPool._poolLookUp.get(obj)?.release(obj);
|
||||||
}
|
}
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
|
@ -81,7 +86,7 @@ export default class ObjectPool {
|
||||||
} else if (this._expandable) {
|
} else if (this._expandable) {
|
||||||
// if not enough node in the pool, we call cc.instantiate to create node
|
// if not enough node in the pool, we call cc.instantiate to create node
|
||||||
obj = instantiate(this._prefab);
|
obj = instantiate(this._prefab);
|
||||||
ObjectPool._poolLookUp[obj.uuid] = this;
|
ObjectPool._poolLookUp.set(obj, this);
|
||||||
} else {
|
} else {
|
||||||
obj = this._actives.shift();
|
obj = this._actives.shift();
|
||||||
obj.removeFromParent();
|
obj.removeFromParent();
|
||||||
|
@ -90,45 +95,52 @@ export default class ObjectPool {
|
||||||
obj.setParent(parent);
|
obj.setParent(parent);
|
||||||
this._actives.push(obj);
|
this._actives.push(obj);
|
||||||
// Invoke pool handler
|
// Invoke pool handler
|
||||||
const handler = this._poolHandlerComp ? obj.getComponent(this._poolHandlerComp) : null;
|
let handler: Component = null;
|
||||||
|
if (typeof this._poolHandlerComp == 'string') {
|
||||||
|
handler = this._poolHandlerComp ? obj.getComponent(this._poolHandlerComp) : null;
|
||||||
|
} else {
|
||||||
|
handler = this._poolHandlerComp ? obj.getComponent(this._poolHandlerComp) : null;
|
||||||
|
}
|
||||||
if (handler) {
|
if (handler) {
|
||||||
(handler as unknown as IPoolable)?.onGet();
|
(handler as unknown as IPoolable)?.onGet();
|
||||||
}
|
}
|
||||||
if (classConstructor) {
|
if (classConstructor) {
|
||||||
return handler == classConstructor ? handler : obj.getComponent(classConstructor);
|
return obj.getComponent(classConstructor);
|
||||||
}
|
}
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
public release(obj: Node): void;
|
public release(obj: Node): boolean;
|
||||||
public release<T extends Component>(obj: T): void;
|
public release<T extends Component>(obj: T): boolean;
|
||||||
public release<T extends Component>(obj: T | Node): void {
|
public release<T extends Component>(obj: T | Node): boolean {
|
||||||
let node = obj instanceof Node ? obj : obj.node;
|
let node = obj instanceof Node ? obj : obj.node;
|
||||||
const index = this._actives.indexOf(node);
|
const index = this._actives.indexOf(node);
|
||||||
|
|
||||||
//check obj is belongs to pool
|
//check obj is belongs to pool
|
||||||
if (index === -1) return;
|
if (index === -1) return false;
|
||||||
this._actives.splice(index, 1);
|
this._actives.splice(index, 1);
|
||||||
this._inactive.push(node);
|
this._inactive.push(node);
|
||||||
// Invoke pool handler
|
// Invoke pool handler
|
||||||
|
|
||||||
const handler = this._poolHandlerComp ? node.getComponent(this._poolHandlerComp) : null;
|
let handler: Component = null;
|
||||||
|
if (typeof this._poolHandlerComp == 'string') {
|
||||||
|
handler = this._poolHandlerComp ? node.getComponent(this._poolHandlerComp) : null;
|
||||||
|
} else {
|
||||||
|
handler = this._poolHandlerComp ? node.getComponent(this._poolHandlerComp) : null;
|
||||||
|
}
|
||||||
if (handler) {
|
if (handler) {
|
||||||
(handler as unknown as IPoolable)?.onRelease();
|
(handler as unknown as IPoolable)?.onRelease();
|
||||||
}
|
}
|
||||||
// Remove from parent, but don't cleanup
|
// Remove from parent, but don't cleanup
|
||||||
node.removeFromParent();
|
node.removeFromParent();
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public clear() {
|
public clear() {
|
||||||
this.all.forEach((obj) => obj.destroy());
|
this.all.forEach((obj) => obj.destroy());
|
||||||
this._inactive = [];
|
this._inactive = [];
|
||||||
this._actives = [];
|
this._actives = [];
|
||||||
Object.keys(ObjectPool._poolLookUp).forEach((key) => {
|
ObjectPool._poolLookUp.clear();
|
||||||
if (ObjectPool._poolLookUp[key] === this) {
|
|
||||||
delete ObjectPool._poolLookUp[key];
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public releaseAll() {
|
public releaseAll() {
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<link rel="icon" href="./favicon.ico" />
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<title>
|
||||||
|
<%=title%>
|
||||||
|
</title>
|
||||||
|
<meta name="viewport"
|
||||||
|
content="width=device-width,user-scalable=no,initial-scale=1,minimum-scale=1,maximum-scale=1,minimal-ui=true" />
|
||||||
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||||
|
<meta name="full-screen" content="yes" />
|
||||||
|
<meta name="screen-orientation" content="portrait" />
|
||||||
|
<meta name="x5-fullscreen" content="true" />
|
||||||
|
<meta name="360-fullscreen" content="true" />
|
||||||
|
<meta name="renderer" content="webkit" />
|
||||||
|
<meta name="force-rendering" content="webkit" />
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
|
||||||
|
|
||||||
|
<link rel="stylesheet" type="text/css" href="./index.css" />
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body style="overflow: hidden;">
|
||||||
|
<%- include(cocosToolBar, {config: config}) %>
|
||||||
|
<div id="content" class="content" style="overflow: hidden;">
|
||||||
|
<div class="contentWrap">
|
||||||
|
<div id="GameDiv" class="wrapper">
|
||||||
|
<div id="Cocos3dGameContainer">
|
||||||
|
<canvas id="GameCanvas" tabindex="-1" style="background-color: '';"></canvas>
|
||||||
|
</div>
|
||||||
|
<div id="splash">
|
||||||
|
<div class="progress-bar stripes"><span></span></div>
|
||||||
|
</div>
|
||||||
|
<div id="bulletin">
|
||||||
|
<div id="sceneIsEmpty" class="inner">
|
||||||
|
<%=tip_sceneIsEmpty%>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- <div class="error" id="error">
|
||||||
|
<div class="title">Error <i>(Please open the console to see detailed errors)</i></div>
|
||||||
|
<div class="error-main"></div>
|
||||||
|
<div class="error-stack"></div>
|
||||||
|
</div> -->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<%- include(cocosTemplate, {}) %>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
Loading…
Reference in New Issue