init git
This commit is contained in:
12
assets/FishSingle/script/engine/config.meta
Normal file
12
assets/FishSingle/script/engine/config.meta
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"ver": "1.2.0",
|
||||
"importer": "directory",
|
||||
"imported": true,
|
||||
"uuid": "79470a7f-2ce8-48ce-86d3-e2662124378f",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"compressionType": {},
|
||||
"isRemoteBundle": {}
|
||||
}
|
||||
}
|
||||
11
assets/FishSingle/script/engine/config/CommonEvent.ts
Normal file
11
assets/FishSingle/script/engine/config/CommonEvent.ts
Normal file
@@ -0,0 +1,11 @@
|
||||
import { _decorator } from 'cc'
|
||||
const { ccclass, property } = _decorator
|
||||
|
||||
@ccclass('CommonEvent')
|
||||
export default class CommonEvent {
|
||||
public static Event_FrameUpdate: string = 'Event_FrameUpdate'
|
||||
public static Event_ConnectTimeOut: string = 'Event_ConnectTimeOut'
|
||||
public static Event_ResourceLoader: string = 'Event_ResourceLoader'
|
||||
public static Event_CheckUpdate: string = 'Event_CheckUpdate'
|
||||
public static Event_Scene_Switch: string = 'Event_Scene_Switch'
|
||||
}
|
||||
11
assets/FishSingle/script/engine/config/CommonEvent.ts.meta
Normal file
11
assets/FishSingle/script/engine/config/CommonEvent.ts.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "76f96525-e455-4a24-9d2b-27a0cb2fdfd2",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"simulateGlobals": []
|
||||
}
|
||||
}
|
||||
38
assets/FishSingle/script/engine/config/ManifestConfig.ts
Normal file
38
assets/FishSingle/script/engine/config/ManifestConfig.ts
Normal file
@@ -0,0 +1,38 @@
|
||||
import { _decorator } from 'cc'
|
||||
import DateUtil from '../utils/DateUtil'
|
||||
import NetConfig from './NetConfig'
|
||||
|
||||
export default class ManifestConfig {
|
||||
public static packageUrl: string = ''
|
||||
public static remoteManifestUrl: string = ''
|
||||
public static remoteVersionUrl: string = ''
|
||||
public static version: string = '1.0.0' //更新包要更新这里
|
||||
public static assets: object = {}
|
||||
public static searchPaths: Array<any> = []
|
||||
public static getManifestStr(key: string) {
|
||||
let obj: Object = {}
|
||||
obj['packageUrl'] = `${NetConfig.hotupdateUrl}/hotupdate/${key}/`
|
||||
obj['remoteManifestUrl'] =
|
||||
NetConfig.hotupdateUrl +
|
||||
'/hotupdate/' +
|
||||
key +
|
||||
'/project.manifest?t=' +
|
||||
DateUtil.now()
|
||||
obj['remoteManifestUrl'] = `${
|
||||
NetConfig.hotupdateUrl
|
||||
}/hotupdate/${key}/project.manifest?t=${DateUtil.now()}`
|
||||
obj['remoteVersionUrl'] =
|
||||
NetConfig.hotupdateUrl +
|
||||
'/hotupdate/' +
|
||||
key +
|
||||
'/version.manifest?t=' +
|
||||
DateUtil.now()
|
||||
obj['remoteVersionUrl'] = `${
|
||||
NetConfig.hotupdateUrl
|
||||
}/hotupdate/${key}/version.manifest?t=${DateUtil.now()}`
|
||||
obj['version'] = ManifestConfig.version
|
||||
obj['assets'] = {}
|
||||
obj['searchPaths'] = []
|
||||
return JSON.stringify(obj)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "711d7240-649f-4cb4-9d0d-06e13979eb98",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"simulateGlobals": []
|
||||
}
|
||||
}
|
||||
64
assets/FishSingle/script/engine/config/MusicConfig.ts
Normal file
64
assets/FishSingle/script/engine/config/MusicConfig.ts
Normal file
@@ -0,0 +1,64 @@
|
||||
import { _decorator, AudioClip } from 'cc'
|
||||
import { GameConfig } from '../../game/config/GameConfig'
|
||||
|
||||
export default class MusicConfig {
|
||||
public static musicKey2Path: Map<string, string> = new Map<string, string>() //资源预加载路径
|
||||
|
||||
public static musicKey2Cache: Map<string, AudioClip> = new Map<
|
||||
string,
|
||||
AudioClip
|
||||
>() //资源加载后cache路径
|
||||
|
||||
public static init() {
|
||||
if (
|
||||
typeof GameConfig.GameName === 'undefined' ||
|
||||
GameConfig.GameName === null
|
||||
) {
|
||||
console.error('GameConfig.GameName 未配置!')
|
||||
return
|
||||
}
|
||||
|
||||
const musicConfig = {
|
||||
background_1: 'music/background_1',
|
||||
background_2: 'music/background_2',
|
||||
background_3: 'music/background_3',
|
||||
deadfish_1: 'music/deadfish_1',
|
||||
deadfish_2: 'music/deadfish_2',
|
||||
deadfish_3: 'music/deadfish_3',
|
||||
deadfish_4: 'music/deadfish_4',
|
||||
deadfish_5: 'music/deadfish_5',
|
||||
deadfish_6: 'music/deadfish_6',
|
||||
deadfish_7: 'music/deadfish_7',
|
||||
deadfish_8: 'music/deadfish_8',
|
||||
deadfish_9: 'music/deadfish_9',
|
||||
deadfish_10: 'music/deadfish_10',
|
||||
deadfish_11: 'music/deadfish_11',
|
||||
deadfish_12: 'music/deadfish_12',
|
||||
deadfish_13: 'music/deadfish_13',
|
||||
deadfish_14: 'music/deadfish_14',
|
||||
deadfish_15: 'music/deadfish_15',
|
||||
deadfish_16: 'music/deadfish_16',
|
||||
deadfish_17: 'music/deadfish_17',
|
||||
deadfish_18: 'music/deadfish_18',
|
||||
deadfish_19: 'music/deadfish_19',
|
||||
deadfish_20: 'music/deadfish_20',
|
||||
deadfish_21: 'music/deadfish_21',
|
||||
deadfish_22: 'music/deadfish_22',
|
||||
deadfish_23: 'music/deadfish_23',
|
||||
deadfish_24: 'music/deadfish_24',
|
||||
deadfish_25: 'music/deadfish_25',
|
||||
deadfish_26: 'music/deadfish_26',
|
||||
deadfish_27: 'music/deadfish_27',
|
||||
deadfish_28: 'music/deadfish_28',
|
||||
deadfish_29: 'music/deadfish_29',
|
||||
fire: 'music/fire',
|
||||
}
|
||||
// 音乐要预加载的配置
|
||||
for (const key in musicConfig) {
|
||||
if (musicConfig.hasOwnProperty(key)) {
|
||||
const path = `${GameConfig.GameName}/${musicConfig[key]}`
|
||||
MusicConfig.musicKey2Path.set(key, path)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
11
assets/FishSingle/script/engine/config/MusicConfig.ts.meta
Normal file
11
assets/FishSingle/script/engine/config/MusicConfig.ts.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "92bd7fa0-c97e-4b6f-b518-d1d4d73c03f5",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"simulateGlobals": []
|
||||
}
|
||||
}
|
||||
4
assets/FishSingle/script/engine/config/NetConfig.ts
Normal file
4
assets/FishSingle/script/engine/config/NetConfig.ts
Normal file
@@ -0,0 +1,4 @@
|
||||
import { _decorator } from 'cc'
|
||||
export default class NetConfig {
|
||||
public static hotupdateUrl: string = 'http://localhost:33/hotupdate'
|
||||
}
|
||||
11
assets/FishSingle/script/engine/config/NetConfig.ts.meta
Normal file
11
assets/FishSingle/script/engine/config/NetConfig.ts.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "4e758c3c-41e2-4fe7-a0ea-43fe6be9b381",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"simulateGlobals": []
|
||||
}
|
||||
}
|
||||
12
assets/FishSingle/script/engine/uicomponent.meta
Normal file
12
assets/FishSingle/script/engine/uicomponent.meta
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"ver": "1.2.0",
|
||||
"importer": "directory",
|
||||
"imported": true,
|
||||
"uuid": "9c2b477c-5efb-432e-8d18-08cc17a2e103",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"compressionType": {},
|
||||
"isRemoteBundle": {}
|
||||
}
|
||||
}
|
||||
58
assets/FishSingle/script/engine/uicomponent/CommonTips.ts
Normal file
58
assets/FishSingle/script/engine/uicomponent/CommonTips.ts
Normal file
@@ -0,0 +1,58 @@
|
||||
import {
|
||||
_decorator,
|
||||
Component,
|
||||
Label,
|
||||
Node,
|
||||
tween,
|
||||
Vec3,
|
||||
instantiate,
|
||||
} from 'cc'
|
||||
const { ccclass, property } = _decorator
|
||||
|
||||
import PrefabLoader from '../utils/PrefabLoader'
|
||||
import { GameConfig } from '../../game/config/GameConfig'
|
||||
import DialogBase from './DialogBase'
|
||||
|
||||
@ccclass('CommonTips')
|
||||
export default class CommonTips extends Component {
|
||||
public static TipsZorderIndex: number = 999
|
||||
@property({ type: Label })
|
||||
txtContent: Label | null = null
|
||||
private tips: string = ''
|
||||
private static showingNameList: Array<string> = []
|
||||
onLoad() {}
|
||||
|
||||
start() {
|
||||
tween(this.node)
|
||||
.by(1.5, { position: new Vec3(0, 100, 0) })
|
||||
.to(0.2, { /* opacity: 0*/ scale: Vec3.ZERO })
|
||||
.call(() => {
|
||||
this.node.destroy()
|
||||
})
|
||||
.start()
|
||||
}
|
||||
|
||||
onDestroy() {
|
||||
let index: number = CommonTips.showingNameList.indexOf(this.tips)
|
||||
CommonTips.showingNameList.splice(index, 1)
|
||||
this.unscheduleAllCallbacks()
|
||||
}
|
||||
|
||||
public static showMsg(msg: string, parentNode: Node = null) {
|
||||
PrefabLoader.loadPrefab(
|
||||
`${GameConfig.GameName}/share/uicomponent/CommonTips`,
|
||||
(loadedResource) => {
|
||||
parentNode = parentNode || DialogBase.GetRootCanvas()
|
||||
if (CommonTips.showingNameList.indexOf(msg) === -1) {
|
||||
CommonTips.showingNameList.push(msg)
|
||||
}
|
||||
let dialogNode = instantiate(loadedResource)
|
||||
dialogNode.setPosition(0, 0)
|
||||
let dialogScript: CommonTips = dialogNode.getComponent(CommonTips)
|
||||
dialogScript.tips = msg
|
||||
dialogScript.txtContent.string = msg
|
||||
parentNode.insertChild(dialogNode, CommonTips.TipsZorderIndex)
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "4524f0ef-319a-4f20-9d62-fe359bbcbc71",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"simulateGlobals": []
|
||||
}
|
||||
}
|
||||
30
assets/FishSingle/script/engine/uicomponent/DarkLayer.ts
Normal file
30
assets/FishSingle/script/engine/uicomponent/DarkLayer.ts
Normal file
@@ -0,0 +1,30 @@
|
||||
import { _decorator, Component, Prefab, Widget, instantiate, Node } from 'cc'
|
||||
const { ccclass, property } = _decorator
|
||||
|
||||
import PrefabLoader from '../utils/PrefabLoader'
|
||||
import { GameConfig } from '../../game/config/GameConfig'
|
||||
import DialogBase from './DialogBase'
|
||||
|
||||
@ccclass('DarkLayer')
|
||||
export default class DarkLayer extends Component {
|
||||
private static prefab: Prefab
|
||||
onLoad() {
|
||||
this.getComponent(Widget).target = DialogBase.GetRootCanvas()
|
||||
}
|
||||
start() {}
|
||||
public static preLoad(): Promise<void> {
|
||||
return new Promise((resolve, reject) => {
|
||||
PrefabLoader.loadPrefab(
|
||||
`${GameConfig.GameName}/share/uicomponent/DarkLayer`,
|
||||
(loadedResource) => {
|
||||
DarkLayer.prefab = loadedResource
|
||||
resolve()
|
||||
}
|
||||
)
|
||||
})
|
||||
}
|
||||
public static getDarkLayer() {
|
||||
let dialogNode: Node = instantiate(DarkLayer.prefab)
|
||||
return dialogNode
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "4fa811bd-9cd5-4ac6-ad87-d68f4a41dcdf",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"simulateGlobals": []
|
||||
}
|
||||
}
|
||||
65
assets/FishSingle/script/engine/uicomponent/DialogBase.ts
Normal file
65
assets/FishSingle/script/engine/uicomponent/DialogBase.ts
Normal file
@@ -0,0 +1,65 @@
|
||||
import { _decorator, Component, Node, Widget, director } from 'cc'
|
||||
const { ccclass } = _decorator
|
||||
|
||||
import DarkLayer from './DarkLayer'
|
||||
import { UIRoot } from '../../game/utils/UIRoot'
|
||||
|
||||
@ccclass('DialogBase')
|
||||
export default class DialogBase extends Component {
|
||||
private static LocalZOrder: number = 5
|
||||
private darkLayer: Node | null = null
|
||||
|
||||
//private static _canvas: Node;
|
||||
public static GetRootCanvas(): Node {
|
||||
//if(DialogBase._canvas == null)
|
||||
// DialogBase._canvas = director.getScene().getChildByName('Canvas');
|
||||
//return DialogBase._canvas;
|
||||
return UIRoot.Instance.node
|
||||
}
|
||||
onLoad() {
|
||||
DialogBase.LocalZOrder += 1
|
||||
let closeLayer: Node = this.node.getChildByName('closeLayer')
|
||||
if (closeLayer) {
|
||||
let closeLayerWidget: Widget = closeLayer.getComponent(Widget)
|
||||
if (closeLayerWidget) {
|
||||
closeLayerWidget.target = DialogBase.GetRootCanvas()
|
||||
closeLayerWidget.left = 0
|
||||
closeLayerWidget.right = 0
|
||||
closeLayerWidget.top = 0
|
||||
closeLayerWidget.bottom = 0
|
||||
}
|
||||
}
|
||||
this.onLoadMe()
|
||||
}
|
||||
|
||||
onLoadMe() {}
|
||||
|
||||
start(isPlayMv: boolean = false) {
|
||||
this.darkLayer = DarkLayer.getDarkLayer()
|
||||
this.node.insertChild(this.darkLayer, 0) //this.node.addChild(this.darkLayer, -1);
|
||||
if (isPlayMv) {
|
||||
this.node.setScale(0, 0)
|
||||
} else {
|
||||
this.onStartMe()
|
||||
}
|
||||
}
|
||||
|
||||
onStartMe() {}
|
||||
|
||||
onClickClose() {
|
||||
this.node.destroy()
|
||||
}
|
||||
|
||||
update(dt) {
|
||||
this.onUpdateMe(dt)
|
||||
}
|
||||
|
||||
onUpdateMe(dt) {}
|
||||
|
||||
onDestroy() {
|
||||
DialogBase.LocalZOrder -= 1
|
||||
this.onDestroyMe()
|
||||
}
|
||||
|
||||
onDestroyMe() {}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "1fc7cf08-75c2-4ec4-b4c0-6f27eb483210",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"simulateGlobals": []
|
||||
}
|
||||
}
|
||||
87
assets/FishSingle/script/engine/uicomponent/LoadingPrefab.ts
Normal file
87
assets/FishSingle/script/engine/uicomponent/LoadingPrefab.ts
Normal file
@@ -0,0 +1,87 @@
|
||||
import {
|
||||
_decorator,
|
||||
Component,
|
||||
Node,
|
||||
Prefab,
|
||||
instantiate,
|
||||
math,
|
||||
Quat,
|
||||
Vec3,
|
||||
} from 'cc'
|
||||
const { ccclass, property } = _decorator
|
||||
|
||||
import PrefabLoader from '../utils/PrefabLoader'
|
||||
import { GameConfig } from '../../game/config/GameConfig'
|
||||
import DialogBase from './DialogBase'
|
||||
|
||||
@ccclass('LoadingPrefab')
|
||||
export default class LoadingPrefab extends Component {
|
||||
public static instance: Node
|
||||
private static prefab: Prefab
|
||||
public static LoadingZorderIndex: number = 99
|
||||
@property({ type: Node })
|
||||
loadingSp: Node | null = null
|
||||
|
||||
private _quatCache: Quat
|
||||
private _vec3Cache: Vec3
|
||||
onLoad() {
|
||||
this._quatCache = new Quat()
|
||||
this._vec3Cache = new Vec3()
|
||||
}
|
||||
|
||||
start() {}
|
||||
|
||||
public static close() {
|
||||
if (!LoadingPrefab.instance) {
|
||||
return
|
||||
}
|
||||
LoadingPrefab.instance.removeFromParent()
|
||||
LoadingPrefab.instance.destroy()
|
||||
LoadingPrefab.instance = null
|
||||
}
|
||||
|
||||
public static preLoad(): Promise<void> {
|
||||
return new Promise((resolve, reject) => {
|
||||
PrefabLoader.loadPrefab(
|
||||
GameConfig.GameName + '/' + 'share/uicomponent/LoadingPrefab',
|
||||
(loadedResource) => {
|
||||
LoadingPrefab.prefab = loadedResource
|
||||
resolve()
|
||||
}
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
private static createLoadingPrefab(parentNode: Node = null) {
|
||||
let dialogNode: Node = instantiate(LoadingPrefab.prefab)
|
||||
LoadingPrefab.instance = dialogNode
|
||||
if (!parentNode) {
|
||||
parentNode = DialogBase.GetRootCanvas()
|
||||
}
|
||||
parentNode.insertChild(dialogNode, LoadingPrefab.LoadingZorderIndex)
|
||||
dialogNode.setPosition(0, 0)
|
||||
}
|
||||
|
||||
public static async show(parentNode: Node = null) {
|
||||
if (LoadingPrefab.instance) return
|
||||
if (!LoadingPrefab.prefab) {
|
||||
await LoadingPrefab.preLoad()
|
||||
}
|
||||
this.createLoadingPrefab(parentNode)
|
||||
}
|
||||
|
||||
update(dt) {
|
||||
this.loadingSp.getRotation(this._quatCache)
|
||||
Quat.toEuler(this._vec3Cache, this._quatCache)
|
||||
this._vec3Cache.z += 10
|
||||
this.loadingSp.setRotationFromEuler(this._vec3Cache)
|
||||
if (this._vec3Cache.z >= 360) {
|
||||
this.loadingSp.getRotation(Quat.IDENTITY)
|
||||
}
|
||||
}
|
||||
|
||||
public static clear() {
|
||||
LoadingPrefab.instance = null
|
||||
LoadingPrefab.prefab = null
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "172559f4-6da9-4c5d-a0b4-af9f5116f021",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"simulateGlobals": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
import { _decorator, Component, Node, Prefab, instantiate } from 'cc'
|
||||
const { ccclass, property } = _decorator
|
||||
|
||||
import PrefabLoader from '../utils/PrefabLoader'
|
||||
import Progress from './Progress'
|
||||
import { GameConfig } from '../../game/config/GameConfig'
|
||||
import DialogBase from './DialogBase'
|
||||
|
||||
@ccclass('LoadingScenePrefab')
|
||||
export default class LoadingScenePrefab extends Component {
|
||||
public static instance: Node
|
||||
private static prefab: Prefab
|
||||
public static LoadingZorderIndex: number = 99
|
||||
@property({ type: Node })
|
||||
private progressNode: Node | null = null
|
||||
onLoad() {}
|
||||
|
||||
start() {}
|
||||
|
||||
public updateProgress(
|
||||
completedCount: number,
|
||||
totalCount: number,
|
||||
item: any = null
|
||||
) {
|
||||
this.progressNode
|
||||
.getComponent(Progress)
|
||||
.updateProgress(
|
||||
completedCount,
|
||||
totalCount,
|
||||
'消耗流量,预下载所有"鱼"类中,请耐心等待...'
|
||||
)
|
||||
}
|
||||
|
||||
public static updateLoading(
|
||||
completedCount: number,
|
||||
totalCount: number,
|
||||
item: any = null
|
||||
) {
|
||||
if (LoadingScenePrefab.instance) {
|
||||
let nodeTs: LoadingScenePrefab =
|
||||
LoadingScenePrefab.instance.getComponent(LoadingScenePrefab)
|
||||
if (nodeTs) {
|
||||
nodeTs.updateProgress(completedCount, totalCount, item)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static createPrefab(parentNode: Node = null) {
|
||||
let dialogNode: Node = instantiate(LoadingScenePrefab.prefab)
|
||||
LoadingScenePrefab.instance = dialogNode
|
||||
if (!parentNode) {
|
||||
parentNode = DialogBase.GetRootCanvas()
|
||||
}
|
||||
parentNode.insertChild(dialogNode, LoadingScenePrefab.LoadingZorderIndex)
|
||||
dialogNode.setPosition(0, 0)
|
||||
}
|
||||
|
||||
public static preLoad(): Promise<void> {
|
||||
return new Promise((resolve, reject) => {
|
||||
PrefabLoader.loadPrefab(
|
||||
GameConfig.GameName + '/' + 'share/uicomponent/LoadingScenePrefab',
|
||||
(loadedResource: Prefab) => {
|
||||
LoadingScenePrefab.prefab = loadedResource
|
||||
resolve()
|
||||
}
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
public static close() {
|
||||
if (!LoadingScenePrefab.instance) {
|
||||
return
|
||||
}
|
||||
LoadingScenePrefab.instance.destroy()
|
||||
LoadingScenePrefab.instance = null
|
||||
}
|
||||
|
||||
public static async show(parentNode: Node = null) {
|
||||
if (LoadingScenePrefab.instance) return
|
||||
if (!LoadingScenePrefab.prefab) {
|
||||
await LoadingScenePrefab.preLoad()
|
||||
}
|
||||
this.createPrefab(parentNode)
|
||||
}
|
||||
|
||||
public static clear() {
|
||||
LoadingScenePrefab.instance = null
|
||||
LoadingScenePrefab.prefab = null
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "e2e744b0-b723-4151-8de6-a2c222b8fe29",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"simulateGlobals": []
|
||||
}
|
||||
}
|
||||
90
assets/FishSingle/script/engine/uicomponent/MusicPrefab.ts
Normal file
90
assets/FishSingle/script/engine/uicomponent/MusicPrefab.ts
Normal file
@@ -0,0 +1,90 @@
|
||||
import {
|
||||
_decorator,
|
||||
Component,
|
||||
AssetManager,
|
||||
AudioClip,
|
||||
AudioSource,
|
||||
instantiate,
|
||||
Prefab,
|
||||
} from 'cc'
|
||||
const { ccclass, property } = _decorator
|
||||
|
||||
import { Logger } from '../utils/Logger'
|
||||
import PrefabLoader from '../utils/PrefabLoader'
|
||||
import LocalStorage from '../utils/LocalStorage'
|
||||
import MusicConfig from '../config/MusicConfig'
|
||||
import { GameConfig } from '../../game/config/GameConfig'
|
||||
/**
|
||||
* 背景音乐
|
||||
*/
|
||||
|
||||
@ccclass('MusicPrefab')
|
||||
export default class MusicPrefab extends Component {
|
||||
private static instance: MusicPrefab
|
||||
private static MUSIC_VOLUMN_KEY: string = 'musicVolumn'
|
||||
public static musicVolumn: number = 1
|
||||
public static play(key: string) {
|
||||
let url: string = MusicConfig.musicKey2Path.get(key)
|
||||
if (url) {
|
||||
AssetManager.instance.resources.load(
|
||||
url,
|
||||
AudioClip,
|
||||
(error: Error, clip: AudioClip) => {
|
||||
if (error) {
|
||||
Logger.warn(this, 'load music error===', error.message)
|
||||
} else {
|
||||
if (clip) {
|
||||
this.instance.node.getComponent(AudioSource).clip = clip
|
||||
this.instance.node.getComponent(AudioSource).volume =
|
||||
this.musicVolumn
|
||||
this.instance.node.getComponent(AudioSource).play()
|
||||
this.instance.node.getComponent(AudioSource).loop = true
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
} else {
|
||||
Logger.warn(this, '播放不存在的music=', key)
|
||||
}
|
||||
}
|
||||
|
||||
public static changeVolumn(nowVolumn: number) {
|
||||
this.musicVolumn = nowVolumn
|
||||
this.instance.node.getComponent(AudioSource).volume = nowVolumn
|
||||
LocalStorage.setItem(
|
||||
MusicPrefab.MUSIC_VOLUMN_KEY,
|
||||
this.musicVolumn.toString()
|
||||
)
|
||||
}
|
||||
|
||||
private static preInit() {
|
||||
this.musicVolumn = parseFloat(
|
||||
LocalStorage.getItem(MusicPrefab.MUSIC_VOLUMN_KEY)
|
||||
)
|
||||
if (isNaN(this.musicVolumn)) {
|
||||
this.musicVolumn = 1
|
||||
}
|
||||
}
|
||||
|
||||
public static preLoad(): Promise<void> {
|
||||
return new Promise((resolve, reject) => {
|
||||
PrefabLoader.loadPrefab(
|
||||
GameConfig.GameName + '/' + 'share/uicomponent/MusicPrefab',
|
||||
(loadedResource: Prefab) => {
|
||||
MusicPrefab.instance =
|
||||
instantiate(loadedResource).getComponent(MusicPrefab)
|
||||
this.preInit()
|
||||
resolve()
|
||||
}
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
public static destory() {
|
||||
if (MusicPrefab.instance) {
|
||||
MusicPrefab.instance.getComponent(AudioSource).stop()
|
||||
MusicPrefab.instance.destroy()
|
||||
}
|
||||
MusicPrefab.instance = null
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "e947ef07-b958-4471-b5a5-f0acd7e299d2",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"simulateGlobals": []
|
||||
}
|
||||
}
|
||||
57
assets/FishSingle/script/engine/uicomponent/Progress.ts
Normal file
57
assets/FishSingle/script/engine/uicomponent/Progress.ts
Normal file
@@ -0,0 +1,57 @@
|
||||
import { _decorator, Component, Label, ProgressBar } from 'cc'
|
||||
const { ccclass, property } = _decorator
|
||||
|
||||
import { Logger } from '../utils/Logger'
|
||||
|
||||
@ccclass('Progress')
|
||||
export default class Progress extends Component {
|
||||
@property(Label)
|
||||
public percentLable: Label
|
||||
|
||||
@property(ProgressBar)
|
||||
public bar: ProgressBar
|
||||
|
||||
onLoad() {
|
||||
this.bar.node.active = false
|
||||
this.bar.progress = 0
|
||||
}
|
||||
|
||||
start() {}
|
||||
|
||||
updatePercent(current, filePercent) {
|
||||
//this.percentLable.string = filePercent.toFixed(2);
|
||||
}
|
||||
|
||||
updatefileTotal(current, filePercent) {
|
||||
if (!this.bar.node.active) this.bar.node.active = true
|
||||
var nowPercent = Math.round((current / filePercent) * 100)
|
||||
var curMB = this.getMB(current)
|
||||
var totalMB = this.getMB(filePercent)
|
||||
// this.percentLable.string = "正在更新 " + nowPercent + "%" + " ( " + curMB + " / "+totalMB +" MB)";
|
||||
nowPercent = Math.min(nowPercent, 100)
|
||||
this.percentLable.string = '正在更新 ' + nowPercent + '%'
|
||||
var percent = current / filePercent
|
||||
this.bar.progress = percent
|
||||
}
|
||||
|
||||
public updateProgress(
|
||||
current,
|
||||
total,
|
||||
msg: string = '正在加载资源,此过程不消耗流量...'
|
||||
) {
|
||||
this.bar.node.active = true
|
||||
// this.setMsg(msg+ current + "/" + total);
|
||||
this.setMsg(msg)
|
||||
this.bar.progress = current / total
|
||||
}
|
||||
|
||||
getMB(bytes) {
|
||||
bytes /= 1024
|
||||
bytes /= 1024
|
||||
return bytes.toFixed(2)
|
||||
}
|
||||
|
||||
public setMsg(msg: string = '游戏加载中,请稍后...') {
|
||||
this.percentLable.string = msg
|
||||
}
|
||||
}
|
||||
11
assets/FishSingle/script/engine/uicomponent/Progress.ts.meta
Normal file
11
assets/FishSingle/script/engine/uicomponent/Progress.ts.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "ba38c648-abb9-41f8-a06b-830bb5aea91d",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"simulateGlobals": []
|
||||
}
|
||||
}
|
||||
144
assets/FishSingle/script/engine/uicomponent/SoundPrefab.ts
Normal file
144
assets/FishSingle/script/engine/uicomponent/SoundPrefab.ts
Normal file
@@ -0,0 +1,144 @@
|
||||
import {
|
||||
_decorator,
|
||||
Component,
|
||||
Prefab,
|
||||
NodePool,
|
||||
Node,
|
||||
instantiate,
|
||||
AssetManager,
|
||||
AudioClip,
|
||||
AudioSource,
|
||||
} from 'cc'
|
||||
const { ccclass, property } = _decorator
|
||||
|
||||
import { Logger } from '../utils/Logger'
|
||||
import PrefabLoader from '../utils/PrefabLoader'
|
||||
import LocalStorage from '../utils/LocalStorage'
|
||||
import EventManager from '../utils/EventManager'
|
||||
import CommonEvent from '../config/CommonEvent'
|
||||
import MusicConfig from '../config/MusicConfig'
|
||||
import { GameConfig } from '../../game/config/GameConfig'
|
||||
// /**
|
||||
// * 音效
|
||||
// * Ios暂时有bug,弃用
|
||||
// */
|
||||
|
||||
@ccclass('SoundPrefab')
|
||||
export default class SoundPrefab extends Component {
|
||||
private static prefab: Prefab | null = null
|
||||
private static SOUND_VOLUMN_KEY: string = 'soundVolumn'
|
||||
public static soundVolumn: number = 1
|
||||
private static Pool_Init_Num: number = 30
|
||||
private static pool: NodePool = new NodePool()
|
||||
private static nowAudioNodeList: Array<Node> = []
|
||||
private audioName: string = ''
|
||||
private audioUrl: string = ''
|
||||
private static getAudioNode() {
|
||||
let node: Node = null
|
||||
// if (this.pool.size() > 0) {
|
||||
|
||||
// node = this.pool.get();
|
||||
// } else {
|
||||
node = instantiate(this.prefab)
|
||||
// }
|
||||
return node
|
||||
}
|
||||
|
||||
public static play(key: string) {
|
||||
let url: string = MusicConfig.musicKey2Path.get(key)
|
||||
if (url) {
|
||||
AssetManager.instance.resources.load(url, AudioClip, (error: Error, clip: AudioClip) => {
|
||||
if (error) {
|
||||
Logger.warn(this, 'load sound error===', error.message)
|
||||
} else {
|
||||
if (clip) {
|
||||
let audioNode: Node = this.getAudioNode()
|
||||
if (audioNode) {
|
||||
audioNode.getComponent(AudioSource).clip = clip
|
||||
audioNode.getComponent(AudioSource).volume =
|
||||
SoundPrefab.soundVolumn
|
||||
audioNode.getComponent(AudioSource).loop = false
|
||||
audioNode.getComponent(AudioSource).currentTime = 0 //rewind();
|
||||
audioNode.getComponent(AudioSource).play()
|
||||
audioNode.getComponent(SoundPrefab).audioName = key
|
||||
audioNode.getComponent(SoundPrefab).audioUrl = url
|
||||
this.nowAudioNodeList.push(audioNode)
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
} else {
|
||||
Logger.warn(this, '播放不存在的music=', key)
|
||||
}
|
||||
}
|
||||
|
||||
public static changeVolumn(nowVolumn: number) {
|
||||
this.soundVolumn = nowVolumn
|
||||
for (let i = 0; i < this.nowAudioNodeList.length; i++) {
|
||||
let audioNode: Node = this.nowAudioNodeList[i]
|
||||
let audioSource: AudioSource = audioNode.getComponent(AudioSource)
|
||||
if (audioSource.playing) {
|
||||
audioSource.volume = nowVolumn
|
||||
}
|
||||
}
|
||||
LocalStorage.setItem(
|
||||
SoundPrefab.SOUND_VOLUMN_KEY,
|
||||
SoundPrefab.soundVolumn.toString()
|
||||
)
|
||||
}
|
||||
|
||||
private static preInit() {
|
||||
EventManager.instance.addListener(
|
||||
CommonEvent.Event_FrameUpdate,
|
||||
this.updateFrame,
|
||||
this
|
||||
)
|
||||
SoundPrefab.soundVolumn = parseFloat(
|
||||
LocalStorage.getItem(SoundPrefab.SOUND_VOLUMN_KEY)
|
||||
)
|
||||
if (isNaN(SoundPrefab.soundVolumn)) {
|
||||
SoundPrefab.soundVolumn = 1
|
||||
}
|
||||
}
|
||||
|
||||
private static updateFrame() {
|
||||
for (let i = 0; i < this.nowAudioNodeList.length; i++) {
|
||||
let audioNode: Node = this.nowAudioNodeList[i]
|
||||
let audioSource: AudioSource = audioNode.getComponent(AudioSource)
|
||||
if (!audioSource.playing) {
|
||||
SoundPrefab.nowAudioNodeList.splice(i, 1)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static preLoad(): Promise<void> {
|
||||
return new Promise((resolve, reject) => {
|
||||
PrefabLoader.loadPrefab(
|
||||
GameConfig.GameName + '/' + 'share/uicomponent/SoundPrefab',
|
||||
(loadedResource: Prefab) => {
|
||||
SoundPrefab.prefab = loadedResource
|
||||
this.preInit()
|
||||
// for (let i = 0; i < this.Pool_Init_Num; i++) {
|
||||
// let tempNode: cc.Node = cc.instantiate(loadedResource);
|
||||
// this.pool.put(tempNode);
|
||||
// }
|
||||
resolve()
|
||||
}
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
public static destory() {
|
||||
EventManager.instance.removeListener(
|
||||
CommonEvent.Event_FrameUpdate,
|
||||
this.updateFrame
|
||||
)
|
||||
for (let i = 0; i < this.nowAudioNodeList.length; i++) {
|
||||
let audioNode: Node = this.nowAudioNodeList[i]
|
||||
audioNode.getComponent(AudioSource).stop()
|
||||
audioNode.getComponent(AudioSource).destroy()
|
||||
}
|
||||
this.nowAudioNodeList = []
|
||||
this.pool.clear()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "d262f2b2-8af6-4db9-b1e4-0c08493efa10",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"simulateGlobals": []
|
||||
}
|
||||
}
|
||||
20
assets/FishSingle/script/engine/uicomponent/TextureMgr.ts
Normal file
20
assets/FishSingle/script/engine/uicomponent/TextureMgr.ts
Normal file
@@ -0,0 +1,20 @@
|
||||
import { _decorator, Component, SpriteFrame } from 'cc'
|
||||
const { ccclass, property } = _decorator
|
||||
|
||||
@ccclass('TextureMgr')
|
||||
export default class TextureMgr extends Component {
|
||||
@property({ type: [SpriteFrame] })
|
||||
public Spriteset: SpriteFrame[] = []
|
||||
@property({ type: [SpriteFrame] })
|
||||
public Spriteset1: SpriteFrame[] = []
|
||||
@property({ type: [SpriteFrame] })
|
||||
public Spriteset2: SpriteFrame[] = []
|
||||
@property({ type: [SpriteFrame] })
|
||||
public Spriteset3: SpriteFrame[] = []
|
||||
@property({ type: [SpriteFrame] })
|
||||
public Spriteset4: SpriteFrame[] = []
|
||||
|
||||
onLoad() {
|
||||
// // init logic
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "1147cca4-2fe9-4d82-8850-0d97cb3318d5",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"simulateGlobals": []
|
||||
}
|
||||
}
|
||||
12
assets/FishSingle/script/engine/utils.meta
Normal file
12
assets/FishSingle/script/engine/utils.meta
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"ver": "1.2.0",
|
||||
"importer": "directory",
|
||||
"imported": true,
|
||||
"uuid": "a8097de0-2f13-4b1b-be6b-4635b5d8281d",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"compressionType": {},
|
||||
"isRemoteBundle": {}
|
||||
}
|
||||
}
|
||||
38
assets/FishSingle/script/engine/utils/AdapterHelper.ts
Normal file
38
assets/FishSingle/script/engine/utils/AdapterHelper.ts
Normal file
@@ -0,0 +1,38 @@
|
||||
import { Canvas, error, log, ResolutionPolicy, sys, view, _decorator } from 'cc'
|
||||
import DialogBase from '../uicomponent/DialogBase'
|
||||
const { ccclass, property } = _decorator
|
||||
|
||||
import { Logger } from './Logger'
|
||||
|
||||
@ccclass('AdapterHelper')
|
||||
export default class AdapterHelper {
|
||||
public static winSizeWidth: number
|
||||
public static winSizeHeiht: number
|
||||
public static fixApdater() {
|
||||
log('v3.6没找到接口修改 fitHeight、fitWidth, 先在项目里写死fitHeight=true')
|
||||
return
|
||||
let framesize = view.getFrameSize()
|
||||
if (!this.winSizeWidth) {
|
||||
this.winSizeWidth = screen.width
|
||||
this.winSizeHeiht = screen.height
|
||||
}
|
||||
let designsize = view.getDesignResolutionSize()
|
||||
let canvas: Canvas = DialogBase.GetRootCanvas().getComponent(Canvas)
|
||||
|
||||
let ratio: number = framesize.height / framesize.width
|
||||
let designRatio: number = designsize.height / designsize.width
|
||||
if (ratio > designRatio) {
|
||||
//canvas.fitHeight = false;
|
||||
//canvas.fitWidth = true;
|
||||
error(
|
||||
'v3.6没找到接口修改 fitHeight、fitWidth, 先在项目里写死fitHeight=true'
|
||||
)
|
||||
} else {
|
||||
//canvas.fitHeight = true;
|
||||
//canvas.fitWidth = false;
|
||||
error(
|
||||
'v3.6没找到接口修改 fitHeight、fitWidth, 先在项目里写死fitHeight=true'
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
11
assets/FishSingle/script/engine/utils/AdapterHelper.ts.meta
Normal file
11
assets/FishSingle/script/engine/utils/AdapterHelper.ts.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "d2b64431-33c2-4fa1-83b0-0ece0e0a35e2",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"simulateGlobals": []
|
||||
}
|
||||
}
|
||||
52
assets/FishSingle/script/engine/utils/BitUtil.ts
Normal file
52
assets/FishSingle/script/engine/utils/BitUtil.ts
Normal file
@@ -0,0 +1,52 @@
|
||||
import { _decorator } from 'cc'
|
||||
const { ccclass, property } = _decorator
|
||||
|
||||
import { Logger } from './Logger'
|
||||
|
||||
@ccclass('BitUtil')
|
||||
export default class BitUtil {
|
||||
//index是二进制从右到左
|
||||
public static isBitSet(value: number, index: number): boolean {
|
||||
let str: string = value.toString(2)
|
||||
if (parseInt(str[str.length - 1 - index]) == 1) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
//从右到左计算
|
||||
public static setBitValue(value: number, index: number): number {
|
||||
let newValue: number = value
|
||||
let str: string = value.toString(2)
|
||||
let newStr: string = ''
|
||||
let maxIndex = Math.max(str.length - 1, index)
|
||||
for (let i = 0; i <= maxIndex; i++) {
|
||||
if (index == i) {
|
||||
newStr = '1' + newStr
|
||||
} else {
|
||||
if (str[i] == undefined) {
|
||||
newStr = '0' + newStr
|
||||
} else {
|
||||
newStr = str[i] + newStr
|
||||
}
|
||||
}
|
||||
}
|
||||
newValue = parseInt(newStr, 2)
|
||||
return newValue
|
||||
}
|
||||
|
||||
public static clearBitValue(value: number, index: number) {
|
||||
let newValue: number = value
|
||||
let str: string = value.toString(2)
|
||||
let newStr: string = ''
|
||||
for (let i = str.length - 1; i >= 0; i--) {
|
||||
if (index == str.length - 1 - i) {
|
||||
newStr = '0' + newStr
|
||||
} else {
|
||||
newStr = str[i] + newStr
|
||||
}
|
||||
}
|
||||
newValue = parseInt(newStr, 2)
|
||||
return newValue
|
||||
}
|
||||
}
|
||||
11
assets/FishSingle/script/engine/utils/BitUtil.ts.meta
Normal file
11
assets/FishSingle/script/engine/utils/BitUtil.ts.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "8a5aad8d-c1cf-4e6a-bbbe-bc0ef0b4d05f",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"simulateGlobals": []
|
||||
}
|
||||
}
|
||||
10
assets/FishSingle/script/engine/utils/ColorHelper.ts
Normal file
10
assets/FishSingle/script/engine/utils/ColorHelper.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
import { _decorator, Color } from 'cc'
|
||||
const { ccclass, property } = _decorator
|
||||
|
||||
@ccclass('ColorHelper')
|
||||
export default class ColorHelper {
|
||||
public static getColor(hexStr: string): Color {
|
||||
let color: Color = Color.BLACK
|
||||
return color.fromHEX(hexStr)
|
||||
}
|
||||
}
|
||||
11
assets/FishSingle/script/engine/utils/ColorHelper.ts.meta
Normal file
11
assets/FishSingle/script/engine/utils/ColorHelper.ts.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "d1bc656e-a928-4212-a2b4-408b73ef0ec9",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"simulateGlobals": []
|
||||
}
|
||||
}
|
||||
139
assets/FishSingle/script/engine/utils/DateUtil.ts
Normal file
139
assets/FishSingle/script/engine/utils/DateUtil.ts
Normal file
@@ -0,0 +1,139 @@
|
||||
import { _decorator } from 'cc'
|
||||
import { Logger } from './Logger'
|
||||
|
||||
export default class DateUtil {
|
||||
public static formatNumStr(num: number) {
|
||||
let str = '' + num
|
||||
if (num < 10) {
|
||||
str = '0' + num
|
||||
}
|
||||
return str
|
||||
}
|
||||
|
||||
public static formateYearMonthDayStr(timestamp: number) {
|
||||
let date: Date = new Date(timestamp)
|
||||
return (
|
||||
date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate()
|
||||
)
|
||||
}
|
||||
|
||||
public static formateMonthDayStr(timestamp: number) {
|
||||
let date: Date = new Date(timestamp)
|
||||
return date.getMonth() + 1 + '月' + date.getDate() + '日'
|
||||
}
|
||||
|
||||
// timestamp:1453094034000 2018-1-31 19:53:44
|
||||
//根据时间戳返回 2018-1-31 19:53:44
|
||||
public static formatDateStr(timestamp: number) {
|
||||
let date: Date = new Date(timestamp)
|
||||
return (
|
||||
date.getFullYear() +
|
||||
'-' +
|
||||
(date.getMonth() + 1) +
|
||||
'-' +
|
||||
date.getDate() +
|
||||
' ' +
|
||||
this.formatNumStr(date.getHours()) +
|
||||
':' +
|
||||
this.formatNumStr(date.getMinutes()) +
|
||||
':' +
|
||||
this.formatNumStr(date.getSeconds())
|
||||
)
|
||||
}
|
||||
|
||||
// timestamp:1453094034000 2018-1-31-19-53-44
|
||||
//根据时间戳返回 2018-1-31-19-53-44
|
||||
public static formatDateStr2(timestamp: number) {
|
||||
let date: Date = new Date(timestamp)
|
||||
return (
|
||||
date.getFullYear() +
|
||||
'-' +
|
||||
(date.getMonth() + 1) +
|
||||
'-' +
|
||||
date.getDate() +
|
||||
'-' +
|
||||
this.formatNumStr(date.getHours()) +
|
||||
'-' +
|
||||
this.formatNumStr(date.getMinutes()) +
|
||||
'-' +
|
||||
this.formatNumStr(date.getSeconds())
|
||||
)
|
||||
}
|
||||
|
||||
// timestamp:1453094034000 2018-1-31
|
||||
//根据时间戳返回 2018-1-31
|
||||
public static formatDateStr3(timestamp: number) {
|
||||
let date: Date = new Date(timestamp)
|
||||
return (
|
||||
date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate()
|
||||
)
|
||||
}
|
||||
|
||||
// timestamp:1453094034000
|
||||
//根据时间戳返回 19:53
|
||||
public static formatHourMinStr(timestamp: number) {
|
||||
let date: Date = new Date(timestamp)
|
||||
return (
|
||||
this.formatNumStr(date.getHours()) +
|
||||
':' +
|
||||
this.formatNumStr(date.getMinutes())
|
||||
)
|
||||
}
|
||||
|
||||
// timestamp:1453094034000
|
||||
//根据时间戳返回 19:53:11
|
||||
public static formatHourMinSecondStr(timestamp: number) {
|
||||
let date: Date = new Date(timestamp)
|
||||
return (
|
||||
this.formatNumStr(date.getHours()) +
|
||||
':' +
|
||||
this.formatNumStr(date.getMinutes()) +
|
||||
':' +
|
||||
this.formatNumStr(date.getSeconds())
|
||||
)
|
||||
}
|
||||
|
||||
public static now(): number {
|
||||
let date: Date = new Date()
|
||||
return date.getTime()
|
||||
}
|
||||
|
||||
public static betweenTime(startTime: number, endTime: number) {
|
||||
let date: Date = new Date()
|
||||
if (date.getTime() >= startTime && date.getTime() <= endTime) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
//根据时间戳返回 1天19:53:11
|
||||
public static formatLeftTime(timestamp: number) {
|
||||
let result: string = ''
|
||||
let day: number = Math.floor(timestamp / (1000 * 60 * 60 * 24))
|
||||
let hour: number = Math.floor(timestamp / (1000 * 60 * 60)) % 24
|
||||
let min: number = Math.floor(timestamp / (1000 * 60)) % 60
|
||||
let second: number = Math.floor(timestamp / 1000) % 60
|
||||
result =
|
||||
day +
|
||||
'天' +
|
||||
this.formatNumStr(hour) +
|
||||
':' +
|
||||
this.formatNumStr(min) +
|
||||
':' +
|
||||
this.formatNumStr(second)
|
||||
return result
|
||||
}
|
||||
|
||||
public static isToday(dateTime: number): boolean {
|
||||
let nowDate: Date = new Date()
|
||||
let checkDate: Date = new Date(dateTime)
|
||||
if (
|
||||
checkDate.getFullYear() == nowDate.getFullYear() &&
|
||||
checkDate.getMonth() == nowDate.getMonth() &&
|
||||
checkDate.getDate() == nowDate.getDate()
|
||||
) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
}
|
||||
11
assets/FishSingle/script/engine/utils/DateUtil.ts.meta
Normal file
11
assets/FishSingle/script/engine/utils/DateUtil.ts.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "b42f778f-ca3e-4982-bd84-c8a54d39ced4",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"simulateGlobals": []
|
||||
}
|
||||
}
|
||||
131
assets/FishSingle/script/engine/utils/EventManager.ts
Normal file
131
assets/FishSingle/script/engine/utils/EventManager.ts
Normal file
@@ -0,0 +1,131 @@
|
||||
import { _decorator, Node, Color, Button, Component, Slider } from 'cc'
|
||||
import { Logger } from './Logger'
|
||||
import ColorHelper from './ColorHelper'
|
||||
|
||||
export class HaoEvent {
|
||||
public callback: Function
|
||||
public caller: any
|
||||
public isStop: boolean
|
||||
constructor(callback: Function, caller: any) {
|
||||
this.callback = callback
|
||||
this.caller = caller
|
||||
this.isStop = false
|
||||
}
|
||||
}
|
||||
|
||||
export default class EventManager {
|
||||
public static instance: EventManager = new EventManager()
|
||||
|
||||
private callbackList = {}
|
||||
|
||||
public constructor() {}
|
||||
|
||||
//注册事件
|
||||
public addListener(eventName: string, callback: Function, caller: any) {
|
||||
if (this.callbackList[eventName]) {
|
||||
let eventList: Array<HaoEvent> = this.callbackList[eventName]
|
||||
//不同元件才放入,相同元件覆蓋
|
||||
let add: boolean = true
|
||||
for (let i = 0; i < eventList.length; i++) {
|
||||
let event: HaoEvent = eventList[i]
|
||||
if (caller === event.caller) {
|
||||
add = false
|
||||
}
|
||||
}
|
||||
if (add) {
|
||||
eventList.push(new HaoEvent(callback, caller))
|
||||
this.callbackList[eventName] = eventList
|
||||
}
|
||||
} else {
|
||||
// this.callbackList[eventName] = [[callback, caller]];
|
||||
this.callbackList[eventName] = [new HaoEvent(callback, caller)]
|
||||
}
|
||||
}
|
||||
|
||||
public removeListener(eventName: string, callback: Function) {
|
||||
if (this.callbackList[eventName]) {
|
||||
for (let i = this.callbackList[eventName].length - 1; i >= 0; i--) {
|
||||
let event: HaoEvent = this.callbackList[eventName][i]
|
||||
if (event.callback == callback) {
|
||||
this.callbackList[eventName].splice(i, 1)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public dispatchEvent(eventName, parameter?: any, ...restOfName: any[]) {
|
||||
let eventList: Array<HaoEvent> = this.callbackList[eventName]
|
||||
if (eventList) {
|
||||
for (let i = eventList.length - 1; i >= 0; i--) {
|
||||
let event: HaoEvent = eventList[i]
|
||||
event.callback.call(event.caller, event, parameter, ...restOfName)
|
||||
if (event.isStop) {
|
||||
break
|
||||
}
|
||||
}
|
||||
for (let i = eventList.length - 1; i >= 0; i--) {
|
||||
let event: HaoEvent = eventList[i]
|
||||
event.isStop = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public addBtnEvent(
|
||||
parentNode: Node,
|
||||
objectNode: Node,
|
||||
scriptName: string,
|
||||
eventName: string,
|
||||
data: any = null
|
||||
) {
|
||||
var btn: Button = objectNode.addComponent(Button)
|
||||
var clickEventHandler = new Component.EventHandler()
|
||||
clickEventHandler.target = parentNode //这个 node 节点是你的事件处理代码组件所属的节点
|
||||
clickEventHandler.component = scriptName //这个是代码文件名
|
||||
clickEventHandler.handler = eventName
|
||||
clickEventHandler.customEventData = data
|
||||
btn.clickEvents.push(clickEventHandler)
|
||||
this.addBtnEffect(objectNode)
|
||||
}
|
||||
|
||||
public removeBtnEvent(objectNode: Node) {
|
||||
objectNode.removeComponent(Button)
|
||||
}
|
||||
|
||||
public removeBtnEffect(objectNode: Node) {
|
||||
var b = objectNode.getComponent(Button)
|
||||
b.transition = Button.Transition.NONE
|
||||
}
|
||||
|
||||
public addBtnEffect(objectNode: Node, scale: number = 1.1) {
|
||||
var b = objectNode.getComponent(Button)
|
||||
b.transition = Button.Transition.SCALE
|
||||
b.zoomScale = scale
|
||||
}
|
||||
|
||||
public addBtnEffect_color(
|
||||
objectNode: Node,
|
||||
normalC: Color = ColorHelper.getColor('#FFFFFF'),
|
||||
pressC: Color = ColorHelper.getColor('#C0C0C0')
|
||||
) {
|
||||
var b = objectNode.getComponent(Button)
|
||||
b.transition = Button.Transition.COLOR
|
||||
b.normalColor = normalC
|
||||
b.pressedColor = pressC
|
||||
}
|
||||
|
||||
public addSliderEvent(
|
||||
parentNode: Node,
|
||||
objectNode: Node,
|
||||
EventName: string,
|
||||
data: any
|
||||
) {
|
||||
var b = objectNode.getComponent(Slider)
|
||||
var clickEventHandler = new Component.EventHandler()
|
||||
clickEventHandler.target = parentNode //这个 node 节点是你的事件处理代码组件所属的节点
|
||||
clickEventHandler.component = parentNode.name //这个是代码文件名
|
||||
clickEventHandler.handler = EventName
|
||||
clickEventHandler.customEventData = data
|
||||
b.slideEvents.push(clickEventHandler)
|
||||
}
|
||||
}
|
||||
11
assets/FishSingle/script/engine/utils/EventManager.ts.meta
Normal file
11
assets/FishSingle/script/engine/utils/EventManager.ts.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "b7dbd2a3-1ad1-45b8-8cae-53c431e08789",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"simulateGlobals": []
|
||||
}
|
||||
}
|
||||
13
assets/FishSingle/script/engine/utils/Grid.ts
Normal file
13
assets/FishSingle/script/engine/utils/Grid.ts
Normal file
@@ -0,0 +1,13 @@
|
||||
import { _decorator } from 'cc'
|
||||
export default class Grid {
|
||||
public row: number
|
||||
public col: number
|
||||
constructor(row: number, col) {
|
||||
this.row = row
|
||||
this.col = col
|
||||
}
|
||||
|
||||
public static init(row: number, col: number) {
|
||||
return new Grid(row, col)
|
||||
}
|
||||
}
|
||||
11
assets/FishSingle/script/engine/utils/Grid.ts.meta
Normal file
11
assets/FishSingle/script/engine/utils/Grid.ts.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "696c7042-c332-4a1a-a7f8-a898e63b35b4",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"simulateGlobals": []
|
||||
}
|
||||
}
|
||||
34
assets/FishSingle/script/engine/utils/HaoEncrypt.ts
Normal file
34
assets/FishSingle/script/engine/utils/HaoEncrypt.ts
Normal file
@@ -0,0 +1,34 @@
|
||||
import { _decorator } from 'cc'
|
||||
import { Logger } from './Logger'
|
||||
|
||||
export default class HaoEncrypt {
|
||||
public static encode(str: string) {
|
||||
let result: string = ''
|
||||
for (let i = 0; i < str.length; i++) {
|
||||
//遍历字符串
|
||||
let code: number = str.charCodeAt(i) // //逐个提取每个字符,并获取Unicode编码值
|
||||
if (i % 2 == 0) {
|
||||
code += 2
|
||||
} else {
|
||||
code += 1
|
||||
}
|
||||
result += String.fromCharCode(code)
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
public static decode(str: string) {
|
||||
let result: string = ''
|
||||
for (let i = 0; i < str.length; i++) {
|
||||
//遍历字符串
|
||||
let code: number = str.charCodeAt(i) // //逐个提取每个字符,并获取Unicode编码值
|
||||
if (i % 2 == 0) {
|
||||
code -= 2
|
||||
} else {
|
||||
code -= 1
|
||||
}
|
||||
result += String.fromCharCode(code)
|
||||
}
|
||||
return result
|
||||
}
|
||||
}
|
||||
11
assets/FishSingle/script/engine/utils/HaoEncrypt.ts.meta
Normal file
11
assets/FishSingle/script/engine/utils/HaoEncrypt.ts.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "87a63258-3b93-48f6-945d-5bfd9959bb70",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"simulateGlobals": []
|
||||
}
|
||||
}
|
||||
332
assets/FishSingle/script/engine/utils/HotUpdate.ts
Normal file
332
assets/FishSingle/script/engine/utils/HotUpdate.ts
Normal file
@@ -0,0 +1,332 @@
|
||||
import { sys, _decorator, native, System } from 'cc'
|
||||
import { Logger } from './Logger'
|
||||
import EventManager from './EventManager'
|
||||
import VersionManager from './VersionManager'
|
||||
import ManifestConfig from '../config/ManifestConfig'
|
||||
import ResourcePreload from '../../game/utils/ResourcePreload'
|
||||
import CommonTips from '../uicomponent/CommonTips'
|
||||
|
||||
export default class HotUpdate {
|
||||
public static Event_CheckUpdate: string = 'Event_CheckUpdate'
|
||||
public static Event_On_Progress: string = 'HotUpdate_Event_On_Progress'
|
||||
public static Event_On_NeedUpdate: string = 'HotUpdate_Event_On_NeedUpdate'
|
||||
public static Event_Finish_Update: string = 'HotUpdate_Event_Finish'
|
||||
public static Event_On_ALREADY_UP_TO_DATE: string =
|
||||
'HotUpdate_Event_On_ALREADY_UP_TO_DATE'
|
||||
public static Event_On_Fail_Update: string = 'HotUpdate_Event_On_Fail_Update'
|
||||
private _am: any
|
||||
private _checkListener
|
||||
private storagePath: string
|
||||
private manifestUrl: string
|
||||
private localBigVersion: number
|
||||
private remoteBigVersion: number
|
||||
public needUpdate: boolean = false
|
||||
public isUpdating: boolean
|
||||
public isFinishUpdate: boolean
|
||||
public isCheck: boolean
|
||||
private key: string
|
||||
private hotupdateIndex: number
|
||||
constructor() {}
|
||||
public init(
|
||||
index: number,
|
||||
key: string = 'Code-remote-asset',
|
||||
manifestUrl: string
|
||||
) {
|
||||
if (sys.isNative) {
|
||||
this.hotupdateIndex = index
|
||||
this.key = key
|
||||
this.manifestUrl = manifestUrl
|
||||
if (false) {
|
||||
//暂时不想修 fileUtils 这个报错
|
||||
//暂时注释
|
||||
// this.storagePath = jsb.fileUtils.getWritablePath() + key;
|
||||
// if (!jsb.fileUtils.isDirectoryExist(this.storagePath)) {
|
||||
// jsb.fileUtils.createDirectory(this.storagePath)
|
||||
// }
|
||||
} else {
|
||||
this.storagePath = '获取this.storagePath报错了'
|
||||
}
|
||||
|
||||
Logger.log(this, 'init removeDirectory=', this.storagePath + '_temp')
|
||||
}
|
||||
this.needUpdate = false
|
||||
this.isUpdating = false
|
||||
this.isFinishUpdate = false
|
||||
this.isCheck = false
|
||||
}
|
||||
|
||||
private jumpToPack() {
|
||||
let url: string
|
||||
if (sys.isNative) {
|
||||
if (sys.os == sys.OS.ANDROID) {
|
||||
url = VersionManager.instance.apkStoreUrl
|
||||
} else if (sys.os == sys.OS.IOS) {
|
||||
url = VersionManager.instance.iosStoreUrl
|
||||
}
|
||||
}
|
||||
Logger.info(
|
||||
this,
|
||||
'jumpToPack==androidurl===',
|
||||
VersionManager.instance.apkStoreUrl
|
||||
)
|
||||
Logger.info(
|
||||
this,
|
||||
'jumpToPack==iosStoreUrl===',
|
||||
VersionManager.instance.iosStoreUrl
|
||||
)
|
||||
Logger.info(this, 'jumpToPack=====', url)
|
||||
sys.openURL(url)
|
||||
// cc.game.end();
|
||||
}
|
||||
|
||||
//显示强制更新,即更细包面板
|
||||
private showPackUpdateDialog() {
|
||||
CommonTips.showMsg(
|
||||
'有新的版本需要更新,下载后请先卸载,以前的版本,再安装!'
|
||||
)
|
||||
this.jumpToPack()
|
||||
this.showPackUpdateDialog()
|
||||
}
|
||||
|
||||
private checkCb(event) {
|
||||
Logger.log(this, 'checkCb Code: =================' + event.getEventCode())
|
||||
switch (event.getEventCode()) {
|
||||
case native.EventAssetsManager.ERROR_NO_LOCAL_MANIFEST:
|
||||
Logger.info(this, 'No local manifest file found, hot update skipped.')
|
||||
this.failUpdate()
|
||||
break
|
||||
case native.EventAssetsManager.ERROR_DOWNLOAD_MANIFEST:
|
||||
case native.EventAssetsManager.ERROR_PARSE_MANIFEST:
|
||||
Logger.info(this, 'Fail to download manifest file, hot update skipped.')
|
||||
this.failUpdate()
|
||||
break
|
||||
case native.EventAssetsManager.ALREADY_UP_TO_DATE:
|
||||
Logger.info(this, 'Already up to date with the latest remote version.')
|
||||
this.alreadyUpToDate()
|
||||
break
|
||||
case native.EventAssetsManager.NEW_VERSION_FOUND:
|
||||
Logger.info(
|
||||
this,
|
||||
'new version found, please try to update.',
|
||||
this.localBigVersion,
|
||||
this.remoteBigVersion
|
||||
)
|
||||
if (
|
||||
this.key == VersionManager.Config_Key[0] &&
|
||||
this.localBigVersion < this.remoteBigVersion
|
||||
) {
|
||||
//更新大版本
|
||||
Logger.info(
|
||||
this,
|
||||
'new version found, please try to update======packupdate=',
|
||||
this.localBigVersion,
|
||||
this.remoteBigVersion
|
||||
)
|
||||
this.showPackUpdateDialog()
|
||||
} else {
|
||||
Logger.info(
|
||||
this,
|
||||
'new version found, please try to update======hotupdate=',
|
||||
this.localBigVersion,
|
||||
this.remoteBigVersion
|
||||
)
|
||||
// this._am.update();
|
||||
this.needUpdate = true
|
||||
EventManager.instance.dispatchEvent(
|
||||
HotUpdate.Event_On_NeedUpdate,
|
||||
this.key
|
||||
)
|
||||
}
|
||||
break
|
||||
case native.EventAssetsManager.UPDATE_PROGRESSION:
|
||||
// var currentPercent = event.getPercent();
|
||||
// var totalPercent = event.getPercentByFile();
|
||||
// var fileprocess = event.getDownloadedFiles() + ' / ' + event.getTotalFiles();
|
||||
// var byteprocess = event.getDownloadedBytes() + ' / ' + event.getTotalBytes();
|
||||
Logger.info(
|
||||
this,
|
||||
'UPDATE_PROGRESSION2222==========',
|
||||
this.key,
|
||||
event.getDownloadedBytes(),
|
||||
event.getTotalBytes()
|
||||
)
|
||||
if (event.getTotalBytes() > 0) {
|
||||
EventManager.instance.dispatchEvent(
|
||||
HotUpdate.Event_On_Progress,
|
||||
event.getDownloadedBytes(),
|
||||
event.getTotalBytes(),
|
||||
this.key
|
||||
)
|
||||
}
|
||||
break
|
||||
case native.EventAssetsManager.UPDATE_FINISHED:
|
||||
Logger.info(this, 'UPDATE_FINISHED==============')
|
||||
this.finishUpdate(true)
|
||||
break
|
||||
case native.EventAssetsManager.UPDATE_FAILED:
|
||||
Logger.warn(this, 'Update failed==========', event.getMessage())
|
||||
this.failUpdate()
|
||||
break
|
||||
case native.EventAssetsManager.ERROR_UPDATING:
|
||||
let fullFilePath: string = this.storagePath + '/' + event.getAssetId()
|
||||
let tempFilePath: string =
|
||||
this.storagePath + '_temp/' + event.getAssetId()
|
||||
Logger.warn(this, 'fullFilePath====', fullFilePath)
|
||||
Logger.warn(this, 'tempFilePath====', tempFilePath)
|
||||
// jsb.fileUtils.removeFile(tempFilePath);
|
||||
Logger.warn(
|
||||
this,
|
||||
'ERROR_UPDATING=============',
|
||||
event.getAssetId(),
|
||||
event.getMessage()
|
||||
)
|
||||
this.failUpdate()
|
||||
break
|
||||
default:
|
||||
// this.failUpdate();
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
public checkUpdate() {
|
||||
if (this.isUpdating || this.isCheck) {
|
||||
Logger.log(this, 'Checking or updating ...')
|
||||
return
|
||||
}
|
||||
let hotupdateUrlKey: string =
|
||||
VersionManager.Config_Url_Key[this.hotupdateIndex]
|
||||
Logger.log(this, 'checkoutUpdate=====', this.manifestUrl, hotupdateUrlKey)
|
||||
if (!this._am) {
|
||||
this._am = new native.AssetsManager(
|
||||
'',
|
||||
this.storagePath,
|
||||
this.versionCompareHandle.bind(this)
|
||||
)
|
||||
}
|
||||
// this._am.setMaxConcurrentTask(1);
|
||||
let manifestStr: string = ManifestConfig.getManifestStr(hotupdateUrlKey)
|
||||
Logger.log(this, 'checkUpdate=======manifestStr=======', manifestStr)
|
||||
let manifest = new native.Manifest(manifestStr, this.storagePath)
|
||||
this._am.setVerifyCallback(function (filePath, asset) {
|
||||
return true
|
||||
// var md5 = calculateMD5(filePath);
|
||||
// if (md5 === asset.md5)
|
||||
// return true;
|
||||
// else
|
||||
// return false;
|
||||
})
|
||||
this._am.setEventCallback(this.checkCb.bind(this))
|
||||
// 设置事件回调
|
||||
this.isCheck = true
|
||||
this._am.loadLocalManifest(manifest, this.storagePath)
|
||||
this._am.checkUpdate()
|
||||
}
|
||||
|
||||
/**
|
||||
* @param versionA 本地版本 1.0.0
|
||||
* @param versionB 服务器版本 1.0.1
|
||||
* @param return -1需要更新 不用更新
|
||||
*/
|
||||
private versionCompareHandle(versionA, versionB) {
|
||||
var vA = versionA.split('.')
|
||||
var vB = versionB.split('.')
|
||||
Logger.log(
|
||||
this,
|
||||
'versionCompareHandle======',
|
||||
this.key,
|
||||
VersionManager.Config_Key[0]
|
||||
)
|
||||
if (this.key == VersionManager.Config_Key[0]) {
|
||||
Logger.log(this, 'versionCompareHandle22===', versionA, versionB)
|
||||
VersionManager.instance.nowVersion = versionA
|
||||
VersionManager.instance.targetVersion = versionB
|
||||
}
|
||||
this.localBigVersion = parseInt(vA[0])
|
||||
this.remoteBigVersion = parseInt(vB[0])
|
||||
for (var i = 0; i < vA.length; ++i) {
|
||||
var a = parseInt(vA[i])
|
||||
var b = parseInt(vB[i] || 0)
|
||||
if (a === b) {
|
||||
continue
|
||||
} else {
|
||||
return a - b
|
||||
}
|
||||
}
|
||||
if (vB.length > vA.length) {
|
||||
return -1
|
||||
} else {
|
||||
return 0
|
||||
}
|
||||
}
|
||||
|
||||
public startUpdate() {
|
||||
if (this.isUpdating) return
|
||||
let localManifest = this._am.getLocalManifest()
|
||||
let remoteManifest = this._am.getRemoteManifest()
|
||||
Logger.log(this, 'startUpdate111===', localManifest.getVersionFileUrl())
|
||||
Logger.log(this, 'startUpdate2222===', localManifest.getManifestFileUrl())
|
||||
Logger.log(this, 'startUpdate3333===', remoteManifest.getVersionFileUrl())
|
||||
Logger.log(this, 'startUpdate4444===', remoteManifest.getManifestFileUrl())
|
||||
this.isUpdating = true
|
||||
EventManager.instance.dispatchEvent(
|
||||
HotUpdate.Event_On_Progress,
|
||||
0,
|
||||
100,
|
||||
this.key
|
||||
)
|
||||
this._am.update()
|
||||
}
|
||||
|
||||
public disposeUpdate() {
|
||||
if (this._am) {
|
||||
this._am.setVerifyCallback(null)
|
||||
this._am.setEventCallback(null)
|
||||
}
|
||||
this._am = null
|
||||
this._checkListener = null
|
||||
this.isUpdating = false
|
||||
this.needUpdate = false
|
||||
}
|
||||
|
||||
private failUpdate() {
|
||||
this.disposeUpdate()
|
||||
this.isCheck = false
|
||||
EventManager.instance.dispatchEvent(
|
||||
HotUpdate.Event_On_Fail_Update,
|
||||
this.key
|
||||
)
|
||||
}
|
||||
|
||||
private alreadyUpToDate() {
|
||||
this.disposeUpdate()
|
||||
this.isFinishUpdate = true
|
||||
EventManager.instance.dispatchEvent(
|
||||
HotUpdate.Event_On_ALREADY_UP_TO_DATE,
|
||||
this.key
|
||||
)
|
||||
}
|
||||
|
||||
private finishUpdate(needRestart: boolean) {
|
||||
Logger.info(this, '更新完成=====', needRestart)
|
||||
this.disposeUpdate()
|
||||
this.isFinishUpdate = true
|
||||
EventManager.instance.dispatchEvent(
|
||||
HotUpdate.Event_Finish_Update,
|
||||
this.key,
|
||||
needRestart
|
||||
)
|
||||
if (false && needRestart) {
|
||||
//暂时不想修 fileUtils 这个报错
|
||||
var searchPaths = '' //jsb.fileUtils.getSearchPaths();暂时注释
|
||||
Logger.info(this, '更新完成====searchPaths======', searchPaths)
|
||||
sys.localStorage.setItem(
|
||||
'HotUpdateSearchPaths',
|
||||
JSON.stringify(searchPaths)
|
||||
)
|
||||
//jsb.fileUtils.setSearchPaths(searchPaths);暂时注释
|
||||
if (this.key == VersionManager.Config_Key[0]) {
|
||||
ResourcePreload.instance.restartGame()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
11
assets/FishSingle/script/engine/utils/HotUpdate.ts.meta
Normal file
11
assets/FishSingle/script/engine/utils/HotUpdate.ts.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "a0006bd3-77dc-49ae-991e-77aa5a70f4a6",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"simulateGlobals": []
|
||||
}
|
||||
}
|
||||
160
assets/FishSingle/script/engine/utils/HttpClient.ts
Normal file
160
assets/FishSingle/script/engine/utils/HttpClient.ts
Normal file
@@ -0,0 +1,160 @@
|
||||
import { _decorator } from 'cc'
|
||||
const { ccclass } = _decorator
|
||||
|
||||
import LoadingPrefab from '../uicomponent/LoadingPrefab'
|
||||
import VersionManager from './VersionManager'
|
||||
import { Logger } from './Logger'
|
||||
|
||||
@ccclass('HttpClient')
|
||||
export default class HttpClient {
|
||||
public static instance: HttpClient //= new HttpClient();
|
||||
|
||||
//example
|
||||
// HttpClient.instance.request("http://localhost:8080/haohttp/test", ()=>{
|
||||
// console.log("http 请求 end=============");
|
||||
// }, {"nickName":"jhao", "hh":1, "id":9527});
|
||||
|
||||
private methodType: string = 'GET'
|
||||
|
||||
private responseType: XMLHttpRequestResponseType = 'json'
|
||||
|
||||
private xhr: XMLHttpRequest
|
||||
|
||||
// --GET or POST
|
||||
public setMethod(method: string = 'GET') {
|
||||
this.methodType = method
|
||||
}
|
||||
|
||||
public setParams(paramsObj: object): string {
|
||||
let resParams = ''
|
||||
let nowIndex = 1
|
||||
for (const key in paramsObj) {
|
||||
if (paramsObj.hasOwnProperty(key)) {
|
||||
if (nowIndex == 1) {
|
||||
resParams += key + '=' + paramsObj[key]
|
||||
} else {
|
||||
resParams += '&' + key + '=' + paramsObj[key]
|
||||
}
|
||||
nowIndex += 1
|
||||
}
|
||||
}
|
||||
Logger.log(this, 'resParam===============', resParams)
|
||||
return resParams
|
||||
}
|
||||
|
||||
public setResponseType(responseType: XMLHttpRequestResponseType) {
|
||||
this.responseType = responseType
|
||||
}
|
||||
|
||||
public setContentType() {}
|
||||
|
||||
public request(
|
||||
url: string,
|
||||
callback: Function,
|
||||
params: any = null,
|
||||
timeOut: number = 5 * 1000
|
||||
) {
|
||||
if (params && this.methodType == 'GET') {
|
||||
let getParams: string = this.setParams(params)
|
||||
// getParams = StringUtil:encodeURI(params)
|
||||
getParams = encodeURI(getParams)
|
||||
url += '?' + getParams
|
||||
}
|
||||
this.xhr = new XMLHttpRequest() // http请求 fget
|
||||
//this.xhr = cc.loader.getXMLHttpRequest();
|
||||
let xhr: XMLHttpRequest = this.xhr
|
||||
xhr.responseType = this.responseType
|
||||
xhr.timeout = timeOut
|
||||
// xhr.setRequestHeader("Content-Type", "text/plain");
|
||||
xhr.onreadystatechange = () => {
|
||||
Logger.log(
|
||||
this,
|
||||
'status======',
|
||||
xhr.status,
|
||||
xhr.readyState,
|
||||
xhr.statusText
|
||||
)
|
||||
// if (xhr.readyState == 4 && (xhr.status >= 200 && xhr.status < 400)) {
|
||||
if (xhr.readyState == 4 && xhr.status == 200) {
|
||||
let response = xhr.response
|
||||
Logger.log(this, 'http response1============', xhr)
|
||||
try {
|
||||
let testJson = JSON.stringify(response)
|
||||
Logger.log(this, 'http response json============', testJson)
|
||||
if (callback) {
|
||||
callback(true, response)
|
||||
callback = null
|
||||
}
|
||||
} catch (error) {
|
||||
Logger.error(this, 'http response json=====error=======', error)
|
||||
if (callback) {
|
||||
callback(false)
|
||||
callback = null
|
||||
}
|
||||
}
|
||||
} else if (xhr.readyState == 4 && xhr.status == 301) {
|
||||
//域名转移
|
||||
Logger.log(
|
||||
this,
|
||||
'http response222============',
|
||||
xhr.getResponseHeader('Location')
|
||||
)
|
||||
// console.log("http response333============", xhr.getAllResponseHeaders());
|
||||
if (HttpClient.instance == null) HttpClient.instance = new HttpClient()
|
||||
HttpClient.instance.request(xhr.getResponseHeader('Location'), callback)
|
||||
} else if (xhr.readyState == 4 && xhr.status == 404) {
|
||||
Logger.log(this, 'http onError============')
|
||||
if (callback) {
|
||||
callback(false)
|
||||
callback = null
|
||||
}
|
||||
} else {
|
||||
Logger.log(
|
||||
this,
|
||||
'onreadystatechange else====',
|
||||
xhr.status,
|
||||
xhr.readyState,
|
||||
xhr.response
|
||||
)
|
||||
if (xhr.readyState == 4) {
|
||||
Logger.log(this, 'http onError else============')
|
||||
if (callback) {
|
||||
callback(false)
|
||||
callback = null
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
xhr.onprogress = () => {
|
||||
Logger.log(
|
||||
this,
|
||||
'http onprogress===',
|
||||
xhr.status,
|
||||
xhr.readyState,
|
||||
xhr.response
|
||||
)
|
||||
}
|
||||
xhr.onerror = () => {
|
||||
Logger.log(this, 'http onError============')
|
||||
if (callback) {
|
||||
callback(false)
|
||||
callback = null
|
||||
}
|
||||
}
|
||||
xhr.ontimeout = () => {
|
||||
Logger.log(this, 'http ontimeout============')
|
||||
if (callback) {
|
||||
callback(false)
|
||||
callback = null
|
||||
}
|
||||
}
|
||||
Logger.log(this, 'http request==============', url)
|
||||
Logger.log(this, 'http request======method========', this.methodType)
|
||||
Logger.log(this, 'http request======params========', params)
|
||||
xhr.open(this.methodType, url, true)
|
||||
xhr.setRequestHeader('content-type', 'text/plain;charset=UTF-8')
|
||||
xhr.send(params)
|
||||
}
|
||||
|
||||
public getInfo(callback: Function = null) {}
|
||||
}
|
||||
11
assets/FishSingle/script/engine/utils/HttpClient.ts.meta
Normal file
11
assets/FishSingle/script/engine/utils/HttpClient.ts.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "97dba6a3-a0b7-42ef-9abc-de779e8bd220",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"simulateGlobals": []
|
||||
}
|
||||
}
|
||||
64
assets/FishSingle/script/engine/utils/LocalStorage.ts
Normal file
64
assets/FishSingle/script/engine/utils/LocalStorage.ts
Normal file
@@ -0,0 +1,64 @@
|
||||
import { sys, _decorator } from 'cc'
|
||||
import { Logger } from './Logger'
|
||||
|
||||
export default class LocalStorage {
|
||||
public static GamePreFlag: string = 'fengshen-game-HaoLocalStorage'
|
||||
|
||||
public static setItem(key: string, value: string): void {
|
||||
sys.localStorage.setItem(LocalStorage.GamePreFlag + key, value)
|
||||
}
|
||||
|
||||
public static getItem(key: string): string {
|
||||
return sys.localStorage.getItem(LocalStorage.GamePreFlag + key)
|
||||
}
|
||||
|
||||
public static removeItem(key: string): void {
|
||||
sys.localStorage.removeItem(LocalStorage.GamePreFlag + key)
|
||||
}
|
||||
|
||||
public static getInt(key: string): number {
|
||||
let tempValue: string = LocalStorage.getItem(key)
|
||||
let result: number = 0
|
||||
if (tempValue) {
|
||||
result = parseInt(tempValue)
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
public static setInt(key: string, value: number): void {
|
||||
LocalStorage.setItem(key, value.toString())
|
||||
}
|
||||
|
||||
public static getFloat(key: string): number {
|
||||
let tempValue: string = LocalStorage.getItem(key)
|
||||
let result: number = 0
|
||||
if (tempValue) {
|
||||
result = parseFloat(tempValue)
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
public static setFloat(key: string, value: number): void {
|
||||
LocalStorage.setItem(key, value.toString())
|
||||
}
|
||||
|
||||
public static getBoolean(key: string): boolean {
|
||||
let temp: number = LocalStorage.getInt(key)
|
||||
if (temp == 1) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
public static setBoolean(key: string, value: boolean) {
|
||||
if (value) {
|
||||
LocalStorage.setInt(key, 1)
|
||||
} else {
|
||||
LocalStorage.setInt(key, 0)
|
||||
}
|
||||
}
|
||||
|
||||
public static clear() {
|
||||
sys.localStorage.clear()
|
||||
}
|
||||
}
|
||||
11
assets/FishSingle/script/engine/utils/LocalStorage.ts.meta
Normal file
11
assets/FishSingle/script/engine/utils/LocalStorage.ts.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "6ac377cd-dfa3-4928-ae69-ae600d9aabb1",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"simulateGlobals": []
|
||||
}
|
||||
}
|
||||
133
assets/FishSingle/script/engine/utils/Logger.ts
Normal file
133
assets/FishSingle/script/engine/utils/Logger.ts
Normal file
@@ -0,0 +1,133 @@
|
||||
import { error, _decorator } from 'cc'
|
||||
class LOG_LEVEL_TYPES {
|
||||
public static DEBUG = 0
|
||||
public static LOG = 1
|
||||
public static INFO = 2
|
||||
public static WARN = 3
|
||||
public static ERROR = 4
|
||||
}
|
||||
const Log_Level_Names: Array<string> = ['debug', 'log', 'info', 'warn', 'error']
|
||||
|
||||
export class Logger {
|
||||
public static tag: string = '[HaoJslog]' //可以设置当前游戏的前缀
|
||||
public static LEVEL: number = LOG_LEVEL_TYPES.WARN //当前Logger等级
|
||||
public static Log_Color_Config: Array<string> = [
|
||||
'color:#890;font-size:10px;',
|
||||
'color:#000;font-size:11px;',
|
||||
'color:#09f;font-size:12px;',
|
||||
'color:#f90;font-size:13px;',
|
||||
'color:#f00;font-size:15px;',
|
||||
]
|
||||
private static Terminal_Log: boolean = false
|
||||
public static formatNow() {
|
||||
let date: Date = new Date() //后端返回的时间戳是秒
|
||||
return (
|
||||
date.getFullYear() +
|
||||
'-' +
|
||||
(date.getMonth() + 1) +
|
||||
'-' +
|
||||
date.getDate() +
|
||||
' ' +
|
||||
date.getHours() +
|
||||
':' +
|
||||
date.getMinutes() +
|
||||
':' +
|
||||
date.getSeconds() +
|
||||
':' +
|
||||
date.getMilliseconds()
|
||||
)
|
||||
}
|
||||
private static getLogPreKey(nowLevel: number): string {
|
||||
let str: string =
|
||||
'[' +
|
||||
Logger.formatNow() +
|
||||
'] ' +
|
||||
Logger.tag +
|
||||
' [' +
|
||||
Log_Level_Names[nowLevel] +
|
||||
'] '
|
||||
return str
|
||||
}
|
||||
public static debug(...params: any) {
|
||||
if (Logger.LEVEL > LOG_LEVEL_TYPES.DEBUG) {
|
||||
return
|
||||
}
|
||||
let str: string = this.getLogPreKey(LOG_LEVEL_TYPES.DEBUG)
|
||||
let fileStr: string = str + params.join(' ')
|
||||
// LogErrorFileUtil.debug(fileStr);
|
||||
if (this.Terminal_Log) {
|
||||
console.log(
|
||||
'%c' + str,
|
||||
this.Log_Color_Config[LOG_LEVEL_TYPES.DEBUG],
|
||||
...params
|
||||
)
|
||||
} else {
|
||||
console.info(fileStr)
|
||||
}
|
||||
}
|
||||
public static log(...params: any) {
|
||||
if (Logger.LEVEL > LOG_LEVEL_TYPES.LOG) {
|
||||
return
|
||||
}
|
||||
let str: string = this.getLogPreKey(LOG_LEVEL_TYPES.LOG)
|
||||
let fileStr: string = str + params.join(' ')
|
||||
// LogErrorFileUtil.log(fileStr);
|
||||
if (this.Terminal_Log) {
|
||||
console.log(
|
||||
'%c' + str,
|
||||
this.Log_Color_Config[LOG_LEVEL_TYPES.DEBUG],
|
||||
...params
|
||||
)
|
||||
} else {
|
||||
console.info(fileStr) //console.log(str, ...params)
|
||||
}
|
||||
}
|
||||
public static info(...params: any) {
|
||||
if (Logger.LEVEL > LOG_LEVEL_TYPES.INFO) {
|
||||
return
|
||||
}
|
||||
let str: string = this.getLogPreKey(LOG_LEVEL_TYPES.INFO)
|
||||
let fileStr: string = str + params.join(' ')
|
||||
if (this.Terminal_Log) {
|
||||
console.info(
|
||||
'%c' + str,
|
||||
this.Log_Color_Config[LOG_LEVEL_TYPES.DEBUG],
|
||||
...params
|
||||
)
|
||||
} else {
|
||||
console.info(fileStr)
|
||||
}
|
||||
}
|
||||
public static warn(...params: any) {
|
||||
if (Logger.LEVEL > LOG_LEVEL_TYPES.WARN) {
|
||||
return
|
||||
}
|
||||
let str: string = this.getLogPreKey(LOG_LEVEL_TYPES.WARN)
|
||||
let fileStr: string = str + params.join(' ')
|
||||
if (this.Terminal_Log) {
|
||||
console.warn(
|
||||
'%c' + str,
|
||||
this.Log_Color_Config[LOG_LEVEL_TYPES.DEBUG],
|
||||
...params
|
||||
)
|
||||
} else {
|
||||
console.warn(fileStr)
|
||||
}
|
||||
}
|
||||
public static error(...params: any) {
|
||||
if (Logger.LEVEL > LOG_LEVEL_TYPES.ERROR) {
|
||||
return
|
||||
}
|
||||
let str: string = this.getLogPreKey(LOG_LEVEL_TYPES.ERROR)
|
||||
let fileStr: string = str + params.join(' ')
|
||||
if (this.Terminal_Log) {
|
||||
console.error(
|
||||
'%c' + str,
|
||||
this.Log_Color_Config[LOG_LEVEL_TYPES.DEBUG],
|
||||
...params
|
||||
)
|
||||
} else {
|
||||
console.error(fileStr)
|
||||
}
|
||||
}
|
||||
}
|
||||
11
assets/FishSingle/script/engine/utils/Logger.ts.meta
Normal file
11
assets/FishSingle/script/engine/utils/Logger.ts.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "64f5d910-1b40-421a-a57e-315335fd7b33",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"simulateGlobals": []
|
||||
}
|
||||
}
|
||||
61
assets/FishSingle/script/engine/utils/MathUtils.ts
Normal file
61
assets/FishSingle/script/engine/utils/MathUtils.ts
Normal file
@@ -0,0 +1,61 @@
|
||||
import { _decorator, Vec2 } from 'cc'
|
||||
export default class MathUtils {
|
||||
/**
|
||||
* 2个点之前的直线距离
|
||||
* @param p1
|
||||
* @param p2
|
||||
*/
|
||||
public static distance(x1: number, y1: number, x2: number, y2: number) {
|
||||
// 设两点A(X1,Y1),B(X2,Y2)
|
||||
// 距离D=(X2-X1)的平方+(Y2-Y1)平方的和开平方
|
||||
return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2))
|
||||
}
|
||||
|
||||
/**
|
||||
* 2点间的向量
|
||||
* @param p1
|
||||
* @param p2
|
||||
*/
|
||||
public static sub(p1: Vec2, p2: Vec2) {
|
||||
return new Vec2(p1.x - p2.x, p1.y - p2.y)
|
||||
}
|
||||
|
||||
/**
|
||||
* 弧度转角度
|
||||
* @param radians
|
||||
*/
|
||||
public static radiansToDegrees(radians: number) {
|
||||
return (180 / Math.PI) * radians
|
||||
}
|
||||
|
||||
/**
|
||||
* 角度转弧度
|
||||
* @param degrees
|
||||
*/
|
||||
public static degreesToRadians(degrees: number) {
|
||||
return (Math.PI * degrees) / 180
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回2点间的弧度
|
||||
* @param startP
|
||||
* @param endP
|
||||
*/
|
||||
public static p2pRad(startP: Vec2, endP: Vec2) {
|
||||
let rad: number = Math.atan2(endP.y - startP.y, endP.x - startP.x)
|
||||
return rad
|
||||
}
|
||||
|
||||
/**
|
||||
* 针对捕鱼鱼的方向特定实现的鱼方向转换
|
||||
* @param rot
|
||||
*/
|
||||
public static rotation2Fish(rot: number) {
|
||||
if (rot >= 0 && rot <= 180) {
|
||||
rot = 180 - rot
|
||||
} else {
|
||||
rot = -180 - rot
|
||||
}
|
||||
return rot
|
||||
}
|
||||
}
|
||||
11
assets/FishSingle/script/engine/utils/MathUtils.ts.meta
Normal file
11
assets/FishSingle/script/engine/utils/MathUtils.ts.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "93c7eb99-4e1c-4343-9017-b8511388166a",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"simulateGlobals": []
|
||||
}
|
||||
}
|
||||
62
assets/FishSingle/script/engine/utils/MoveHelper.ts
Normal file
62
assets/FishSingle/script/engine/utils/MoveHelper.ts
Normal file
@@ -0,0 +1,62 @@
|
||||
import { _decorator, Node, Vec3, Vec2 } from 'cc'
|
||||
import { Logger } from './Logger'
|
||||
import MathUtils from './MathUtils'
|
||||
|
||||
export class MoveHelper {
|
||||
public static _vec3: Vec3 = new Vec3()
|
||||
public static _vec2_0: Vec2 = new Vec2()
|
||||
public static _vec2_1: Vec2 = new Vec2()
|
||||
public static moveNode(
|
||||
moveNode: Node,
|
||||
speed: number,
|
||||
tx: number,
|
||||
ty: number,
|
||||
minSpeed: number = 0.01
|
||||
) {
|
||||
let isMoving: boolean = false
|
||||
let times: number = 0
|
||||
moveNode.getPosition(MoveHelper._vec3)
|
||||
MoveHelper._vec2_0.x = MoveHelper._vec3.x
|
||||
MoveHelper._vec2_0.y = MoveHelper._vec3.y
|
||||
MoveHelper._vec2_1.x = tx
|
||||
MoveHelper._vec2_1.y = ty
|
||||
let rad: number = MathUtils.p2pRad(MoveHelper._vec2_0, MoveHelper._vec2_1)
|
||||
let speedX: number = speed * Math.cos(rad)
|
||||
let speedY: number = speed * Math.sin(rad)
|
||||
if (Math.abs(MoveHelper._vec3.x - tx) > minSpeed) {
|
||||
times = Math.floor(Math.abs(speedX / minSpeed))
|
||||
for (let i = 0; i < times; i++) {
|
||||
if (MoveHelper._vec3.x > tx) {
|
||||
MoveHelper._vec3.x -= minSpeed
|
||||
moveNode.setPosition(MoveHelper._vec3)
|
||||
} else {
|
||||
MoveHelper._vec3.x += minSpeed
|
||||
moveNode.setPosition(MoveHelper._vec3)
|
||||
}
|
||||
if (Math.abs(MoveHelper._vec3.x - tx) <= minSpeed * 2) {
|
||||
MoveHelper._vec3.x = tx
|
||||
moveNode.setPosition(MoveHelper._vec3)
|
||||
}
|
||||
}
|
||||
isMoving = true
|
||||
}
|
||||
if (Math.abs(MoveHelper._vec3.y - ty) > minSpeed) {
|
||||
times = Math.floor(Math.abs(speedY / minSpeed))
|
||||
for (let j = 0; j < times; j++) {
|
||||
if (MoveHelper._vec3.y > ty) {
|
||||
MoveHelper._vec3.y -= minSpeed
|
||||
moveNode.setPosition(MoveHelper._vec3)
|
||||
} else {
|
||||
MoveHelper._vec3.y += minSpeed
|
||||
moveNode.setPosition(MoveHelper._vec3)
|
||||
}
|
||||
if (Math.abs(MoveHelper._vec3.x - ty) <= minSpeed * 2) {
|
||||
MoveHelper._vec3.y = ty
|
||||
moveNode.setPosition(MoveHelper._vec3)
|
||||
}
|
||||
}
|
||||
isMoving = true
|
||||
}
|
||||
return isMoving
|
||||
}
|
||||
}
|
||||
11
assets/FishSingle/script/engine/utils/MoveHelper.ts.meta
Normal file
11
assets/FishSingle/script/engine/utils/MoveHelper.ts.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "4304fd05-cb03-46da-a6a6-f742febe535e",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"simulateGlobals": []
|
||||
}
|
||||
}
|
||||
30
assets/FishSingle/script/engine/utils/PrefabLoader.ts
Normal file
30
assets/FishSingle/script/engine/utils/PrefabLoader.ts
Normal file
@@ -0,0 +1,30 @@
|
||||
import { AssetManager, Prefab, _decorator } from 'cc'
|
||||
const { ccclass, property } = _decorator
|
||||
|
||||
import { Logger } from './Logger'
|
||||
|
||||
@ccclass('PrefabLoader')
|
||||
export default class PrefabLoader {
|
||||
private static isLoading: boolean = false
|
||||
|
||||
public static loadPrefab(url: string, callback: Function) {
|
||||
if (this.isLoading) return
|
||||
this.isLoading = true
|
||||
AssetManager.instance.resources.load(
|
||||
url,
|
||||
Prefab,
|
||||
(error: Error, loadedResource) => {
|
||||
if (error) {
|
||||
Logger.warn(this, '载入Prefab失败, 原因:', url, error.message)
|
||||
return
|
||||
}
|
||||
if (!(loadedResource instanceof Prefab)) {
|
||||
Logger.warn(this, '你载入的不是Prefab, 你做了什么事?')
|
||||
return
|
||||
}
|
||||
callback(loadedResource)
|
||||
this.isLoading = false
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
11
assets/FishSingle/script/engine/utils/PrefabLoader.ts.meta
Normal file
11
assets/FishSingle/script/engine/utils/PrefabLoader.ts.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "10db6736-1255-4a28-91a1-fe4c41312d29",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"simulateGlobals": []
|
||||
}
|
||||
}
|
||||
50
assets/FishSingle/script/engine/utils/RandomUtil.ts
Normal file
50
assets/FishSingle/script/engine/utils/RandomUtil.ts
Normal file
@@ -0,0 +1,50 @@
|
||||
import { Vec2, _decorator } from 'cc'
|
||||
export default class RandomUtil {
|
||||
//随机minNum到maxNum的数字 (包含maxNum)
|
||||
public static nextInt(minNum: number, maxNum: number) {
|
||||
return Math.floor(Math.random() * (maxNum - minNum + 1) + minNum)
|
||||
}
|
||||
|
||||
public static nextNumber(minNum: number, maxNum: number) {
|
||||
return Math.random() * (maxNum - minNum) + minNum
|
||||
}
|
||||
|
||||
public static nextSign() {
|
||||
let temp = Math.random()
|
||||
if (temp < 0.5) {
|
||||
return 1
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
public static nextBoolean() {
|
||||
let temp = Math.random()
|
||||
if (temp < 0.5) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
public static randomArr(nowArr: Array<any>, needNum: number) {
|
||||
let tempArr: Array<any> = nowArr.concat()
|
||||
let resultArr: Array<any> = []
|
||||
for (let index = 0; index < needNum; index++) {
|
||||
if (tempArr.length <= 0) {
|
||||
break
|
||||
}
|
||||
let randomIndex: number = RandomUtil.nextInt(0, tempArr.length - 1)
|
||||
resultArr.push(tempArr.splice(randomIndex, 1)[0])
|
||||
}
|
||||
return resultArr
|
||||
}
|
||||
|
||||
public static randomItem(nowArr: Array<any>) {
|
||||
return this.randomArr(nowArr, 1)[0]
|
||||
}
|
||||
|
||||
public static randomP(left: number, right: number, up: number, down: number) {
|
||||
let randomX: number = RandomUtil.nextNumber(left, right)
|
||||
let randomY: number = RandomUtil.nextNumber(up, down)
|
||||
return new Vec2(randomX, randomY)
|
||||
}
|
||||
}
|
||||
11
assets/FishSingle/script/engine/utils/RandomUtil.ts.meta
Normal file
11
assets/FishSingle/script/engine/utils/RandomUtil.ts.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "09813185-c544-4799-88cd-3134aa4da011",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"simulateGlobals": []
|
||||
}
|
||||
}
|
||||
436
assets/FishSingle/script/engine/utils/ShaderHelper.ts
Normal file
436
assets/FishSingle/script/engine/utils/ShaderHelper.ts
Normal file
@@ -0,0 +1,436 @@
|
||||
import {
|
||||
_decorator,
|
||||
Node,
|
||||
Material,
|
||||
Color,
|
||||
UIRenderer,
|
||||
Vec2,
|
||||
UITransform,
|
||||
} from 'cc'
|
||||
import ShaderMaterialPrefab from '../../game/prefab/ShaderMaterialPrefab'
|
||||
import { Logger } from './Logger'
|
||||
|
||||
export default class ShaderHelper {
|
||||
/**
|
||||
* 清除所有shader
|
||||
* @param showNode
|
||||
* @param material
|
||||
*/
|
||||
public static clearAllEffect(
|
||||
showNode: Node,
|
||||
material: Material = ShaderMaterialPrefab.instance.getComponent(
|
||||
ShaderMaterialPrefab
|
||||
).default
|
||||
) {
|
||||
showNode
|
||||
.getComponents(UIRenderer)
|
||||
.forEach((renderComponent: UIRenderer) => {
|
||||
renderComponent.setSharedMaterial(material, 0)
|
||||
})
|
||||
showNode.children.forEach((childNode) => {
|
||||
childNode
|
||||
.getComponents(UIRenderer)
|
||||
.forEach((renderComponent: UIRenderer) => {
|
||||
renderComponent.setSharedMaterial(material, 0)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置图片灰白程度
|
||||
* @param showNode
|
||||
* @param material
|
||||
* @param grayLevel [0.0, 1.0]
|
||||
*/
|
||||
public static setGrayEffect(
|
||||
showNode: Node,
|
||||
grayLevel: number = 1,
|
||||
material: Material = ShaderMaterialPrefab.instance.getComponent(
|
||||
ShaderMaterialPrefab
|
||||
).grayMaterial
|
||||
) {
|
||||
showNode
|
||||
.getComponents(UIRenderer)
|
||||
.forEach((renderComponent: UIRenderer) => {
|
||||
material.setProperty('grayLevel', grayLevel)
|
||||
renderComponent.setMaterial(material, 0)
|
||||
})
|
||||
showNode.children.forEach((childNode) => {
|
||||
childNode
|
||||
.getComponents(UIRenderer)
|
||||
.forEach((renderComponent: UIRenderer) => {
|
||||
material.setProperty('grayLevel', grayLevel)
|
||||
renderComponent.setSharedMaterial(material, 0)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 播放变灰过程动画
|
||||
*/
|
||||
public static showGrayMv(showNode: Node) {
|
||||
let grayValue: number = 0.5
|
||||
let intervalId = setInterval(() => {
|
||||
grayValue += 0.01
|
||||
if (grayValue >= 1) {
|
||||
grayValue = 1
|
||||
clearInterval(intervalId)
|
||||
}
|
||||
if (showNode) {
|
||||
ShaderHelper.setGrayEffect(showNode, grayValue)
|
||||
}
|
||||
}, 1)
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置图片老化
|
||||
* @param showNode
|
||||
* @param grayLevel [0.0, 1.0]
|
||||
* @param material
|
||||
*/
|
||||
public static setOldPhotoEffect(
|
||||
showNode: Node,
|
||||
grayLevel: number = 1,
|
||||
material: Material = ShaderMaterialPrefab.instance.getComponent(
|
||||
ShaderMaterialPrefab
|
||||
).oldPhoto
|
||||
) {
|
||||
showNode
|
||||
.getComponents(UIRenderer)
|
||||
.forEach((renderComponent: UIRenderer) => {
|
||||
material.setProperty('oldLevel', grayLevel)
|
||||
renderComponent.setSharedMaterial(material, 0)
|
||||
})
|
||||
showNode.children.forEach((childNode) => {
|
||||
childNode
|
||||
.getComponents(UIRenderer)
|
||||
.forEach((renderComponent: UIRenderer) => {
|
||||
material.setProperty('oldLevel', grayLevel)
|
||||
renderComponent.setSharedMaterial(material, 0)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 播放变灰过程动画
|
||||
*/
|
||||
public static showOldPhotoMv(showNode: Node) {
|
||||
let grayValue: number = 0
|
||||
let intervalId = setInterval(() => {
|
||||
grayValue += 0.01
|
||||
if (grayValue >= 1) {
|
||||
grayValue = 1
|
||||
clearInterval(intervalId)
|
||||
}
|
||||
if (showNode) {
|
||||
ShaderHelper.setOldPhotoEffect(showNode, grayValue)
|
||||
}
|
||||
}, 1)
|
||||
}
|
||||
|
||||
/**
|
||||
* 增加内发光特效
|
||||
* showNode:要增加特效的节点或者他的子节点
|
||||
* material:发光特效材质
|
||||
* materialParam: {}
|
||||
* materialParam.glowColor:cc.v4(r,g,b,a) 颜色rbga值的结构体
|
||||
* materialParam.glowColorSize:这里为约束一下值发光宽度值在 [0.0, 0.1] 因为 0.1+ 之后的效果可能不明显,也可以自己尝试修改,个人测试感觉0.01效果最佳
|
||||
* materialParam.glowThreshold:这里为约束一下值发光阈值值在 [0.0, 0.5] 因为 0.5+ 之后的效果可能就是其他效果,个人感觉0.1效果最佳
|
||||
*/
|
||||
public static setGlowInner(
|
||||
showNode: Node,
|
||||
materialParam: any,
|
||||
material: Material = ShaderMaterialPrefab.instance.getComponent(
|
||||
ShaderMaterialPrefab
|
||||
).glowInner
|
||||
) {
|
||||
showNode
|
||||
.getComponents(UIRenderer)
|
||||
.forEach((renderComponent: UIRenderer) => {
|
||||
material.setProperty('glowColor', materialParam.glowColor)
|
||||
material.setProperty('glowColorSize', materialParam.glowColorSize)
|
||||
material.setProperty('glowThreshold', materialParam.glowThreshold)
|
||||
renderComponent.setSharedMaterial(material, 0)
|
||||
})
|
||||
showNode.children.forEach((childNode) => {
|
||||
childNode
|
||||
.getComponents(UIRenderer)
|
||||
.forEach((renderComponent: UIRenderer) => {
|
||||
material.setProperty('glowColor', materialParam.glowColor)
|
||||
material.setProperty('glowColorSize', materialParam.glowColorSize)
|
||||
material.setProperty('glowThreshold', materialParam.glowThreshold)
|
||||
renderComponent.setMaterial(material, 0)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置不同颜色的发光
|
||||
* @param showNode
|
||||
* @param color
|
||||
*/
|
||||
public static setCommonGlowInner(showNode: Node, color: Color = Color.WHITE) {
|
||||
this.setGlowInner(showNode, {
|
||||
glowColor: color,
|
||||
glowColorSize: 0.015,
|
||||
glowThreshold: 0.1,
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 播放被攻击闪烁过程动画
|
||||
*/
|
||||
public static showFlash(showNode: Node, totalFlashTimes: number = 1) {
|
||||
let timeCount: number = 0
|
||||
let color: Color = Color.WHITE
|
||||
let flashTimes: number = 0
|
||||
let intervalId = setInterval(() => {
|
||||
timeCount += 1
|
||||
if (timeCount % 50 == 0) {
|
||||
let tempCount: number = timeCount / 50
|
||||
if (tempCount % 2 == 0) {
|
||||
color.a = 100
|
||||
this.setGlowInner(showNode, {
|
||||
glowColor: color,
|
||||
glowColorSize: 0.1,
|
||||
glowThreshold: 0,
|
||||
})
|
||||
} else {
|
||||
flashTimes++
|
||||
this.setGlowInner(showNode, {
|
||||
glowColor: color,
|
||||
glowColorSize: 0,
|
||||
glowThreshold: 0,
|
||||
})
|
||||
if (flashTimes > totalFlashTimes) {
|
||||
clearInterval(intervalId)
|
||||
}
|
||||
}
|
||||
}
|
||||
}, 1)
|
||||
}
|
||||
|
||||
/**
|
||||
* 马赛克
|
||||
* @param showNode
|
||||
* @param materialParam
|
||||
* @param material
|
||||
*/
|
||||
public static setMosaic(
|
||||
showNode: Node,
|
||||
materialParam: any,
|
||||
material: Material = ShaderMaterialPrefab.instance.getComponent(
|
||||
ShaderMaterialPrefab
|
||||
).mosaic
|
||||
) {
|
||||
showNode
|
||||
.getComponents(UIRenderer)
|
||||
.forEach((renderComponent: UIRenderer) => {
|
||||
material.setProperty('xBlockCount', materialParam.xBlockCount)
|
||||
material.setProperty('yBlockCount', materialParam.yBlockCount)
|
||||
renderComponent.setSharedMaterial(material, 0)
|
||||
})
|
||||
showNode.children.forEach((childNode) => {
|
||||
childNode
|
||||
.getComponents(UIRenderer)
|
||||
.forEach((renderComponent: UIRenderer) => {
|
||||
material.setProperty('xBlockCount', materialParam.xBlockCount)
|
||||
material.setProperty('yBlockCount', materialParam.yBlockCount)
|
||||
renderComponent.setSharedMaterial(material, 0)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 播放被攻击闪烁过程动画
|
||||
*/
|
||||
public static showMosaicMv(showNode: Node, callback: Function = null) {
|
||||
let masaicTimes: number = 500
|
||||
let intervalId = setInterval(() => {
|
||||
masaicTimes -= 2
|
||||
this.setMosaic(showNode, {
|
||||
xBlockCount: masaicTimes,
|
||||
yBlockCount: masaicTimes,
|
||||
})
|
||||
if (masaicTimes <= 30) {
|
||||
clearInterval(intervalId)
|
||||
if (callback) {
|
||||
callback()
|
||||
}
|
||||
}
|
||||
}, 1)
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置圆角剪切
|
||||
* @param showNode
|
||||
* @param roundCornerRadius [0, 1]
|
||||
*/
|
||||
public static setRoundCornerCrop(
|
||||
showNode: Node,
|
||||
roundCornerRadius: number = 0.1,
|
||||
material: Material = ShaderMaterialPrefab.instance.getComponent(
|
||||
ShaderMaterialPrefab
|
||||
).roundCornerCrop
|
||||
) {
|
||||
showNode
|
||||
.getComponents(UIRenderer)
|
||||
.forEach((renderComponent: UIRenderer) => {
|
||||
// material.setProperty("roundCornerRadius", roundCornerRadius);
|
||||
material.setProperty('xRadius', roundCornerRadius)
|
||||
material.setProperty('yRadius', roundCornerRadius)
|
||||
renderComponent.setSharedMaterial(material, 0)
|
||||
})
|
||||
showNode.children.forEach((childNode) => {
|
||||
childNode
|
||||
.getComponents(UIRenderer)
|
||||
.forEach((renderComponent: UIRenderer) => {
|
||||
// material.setProperty("roundCornerRadius", roundCornerRadius);
|
||||
material.setProperty('xRadius', roundCornerRadius)
|
||||
material.setProperty('yRadius', roundCornerRadius)
|
||||
renderComponent.setSharedMaterial(material, 0)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置闪光
|
||||
* @param showNode
|
||||
* @param lightColor 光颜色
|
||||
* @param lightWidth 光的宽度
|
||||
* @param lightAngle 光的角度
|
||||
* @param enableGradient
|
||||
* @param cropAlpha
|
||||
* @param enableFog
|
||||
* @param material
|
||||
*/
|
||||
public static setFlashLight(
|
||||
showNode: Node,
|
||||
lightColor: Color,
|
||||
lightWidth: number,
|
||||
lightAngle: number = 0,
|
||||
enableGradient: boolean = true,
|
||||
cropAlpha: boolean = true,
|
||||
enableFog: boolean = false,
|
||||
material: Material = ShaderMaterialPrefab.instance.getComponent(
|
||||
ShaderMaterialPrefab
|
||||
).flashLight
|
||||
) {
|
||||
showNode
|
||||
.getComponents(UIRenderer)
|
||||
.forEach((renderComponent: UIRenderer) => {
|
||||
material.setProperty('lightColor', lightColor)
|
||||
material.setProperty('lightWidth', lightWidth)
|
||||
material.setProperty('lightAngle', lightAngle)
|
||||
material.setProperty('enableGradient', enableGradient ? 1 : 0)
|
||||
material.setProperty('cropAlpha', cropAlpha ? 1 : 0)
|
||||
material.setProperty('enableFog', enableFog ? 1 : 0)
|
||||
renderComponent.setSharedMaterial(material, 0)
|
||||
})
|
||||
showNode.children.forEach((childNode) => {
|
||||
childNode
|
||||
.getComponents(UIRenderer)
|
||||
.forEach((renderComponent: UIRenderer) => {
|
||||
material.setProperty('lightColor', lightColor)
|
||||
material.setProperty('lightWidth', lightWidth)
|
||||
material.setProperty('lightAngle', lightAngle)
|
||||
material.setProperty('enableGradient', enableGradient ? 1 : 0)
|
||||
material.setProperty('cropAlpha', cropAlpha ? 1 : 0)
|
||||
material.setProperty('enableFog', enableFog ? 1 : 0)
|
||||
renderComponent.setSharedMaterial(material, 0)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 玩家升级shader动画
|
||||
* @param showNode
|
||||
* @param callback
|
||||
*/
|
||||
public static showFlashLightMv(showNode: Node, callback: Function = null) {
|
||||
let nowClor: Color = new Color(0, 0, 0, 255)
|
||||
let colorIndex: number = 0
|
||||
let lightAngle: number = 0
|
||||
let intervalId = setInterval(() => {
|
||||
if (colorIndex == 0) {
|
||||
nowClor.r = nowClor.r + 2
|
||||
if (nowClor.r >= 255) {
|
||||
colorIndex += 1
|
||||
}
|
||||
} else if (colorIndex == 1) {
|
||||
nowClor.g = nowClor.g + 2
|
||||
if (nowClor.g >= 255) {
|
||||
colorIndex += 1
|
||||
}
|
||||
} else {
|
||||
nowClor.b = nowClor.b + 2
|
||||
if (nowClor.b >= 255) {
|
||||
clearInterval(intervalId)
|
||||
ShaderHelper.clearAllEffect(showNode)
|
||||
if (callback) {
|
||||
callback()
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
lightAngle += 1
|
||||
this.setFlashLight(showNode, nowClor, 1, lightAngle)
|
||||
}, 1)
|
||||
}
|
||||
|
||||
public static setFlag(
|
||||
showNode: Node,
|
||||
material: Material = ShaderMaterialPrefab.instance.getComponent(
|
||||
ShaderMaterialPrefab
|
||||
).flag
|
||||
) {
|
||||
showNode
|
||||
.getComponents(UIRenderer)
|
||||
.forEach((renderComponent: UIRenderer) => {
|
||||
renderComponent.setSharedMaterial(material, 0)
|
||||
})
|
||||
showNode.children.forEach((childNode) => {
|
||||
childNode
|
||||
.getComponents(UIRenderer)
|
||||
.forEach((renderComponent: UIRenderer) => {
|
||||
renderComponent.setSharedMaterial(material, 0)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置高斯模糊
|
||||
* @param showNode
|
||||
* @param material
|
||||
*/
|
||||
public static setGaussian(
|
||||
showNode: Node,
|
||||
material: Material = ShaderMaterialPrefab.instance.getComponent(
|
||||
ShaderMaterialPrefab
|
||||
).gaussian
|
||||
) {
|
||||
showNode
|
||||
.getComponents(UIRenderer)
|
||||
.forEach((renderComponent: UIRenderer) => {
|
||||
let tran = renderComponent.node.getComponent(UITransform)
|
||||
material.setProperty(
|
||||
'textureSize',
|
||||
new Vec2(tran.contentSize.width, tran.contentSize.height)
|
||||
)
|
||||
renderComponent.setMaterial(material, 0)
|
||||
})
|
||||
showNode.children.forEach((childNode) => {
|
||||
childNode
|
||||
.getComponents(UIRenderer)
|
||||
.forEach((renderComponent: UIRenderer) => {
|
||||
let tran = renderComponent.node.getComponent(UITransform)
|
||||
material.setProperty(
|
||||
'textureSize',
|
||||
new Vec2(tran.contentSize.width, tran.contentSize.height)
|
||||
)
|
||||
// material.setProperty("textureSize", cc.v2(showNode.width, showNode.height));
|
||||
renderComponent.setSharedMaterial(material, 0)
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
11
assets/FishSingle/script/engine/utils/ShaderHelper.ts.meta
Normal file
11
assets/FishSingle/script/engine/utils/ShaderHelper.ts.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "347c6bb0-da88-4e18-b261-9298e6dcaa7a",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"simulateGlobals": []
|
||||
}
|
||||
}
|
||||
139
assets/FishSingle/script/engine/utils/VersionManager.ts
Normal file
139
assets/FishSingle/script/engine/utils/VersionManager.ts
Normal file
@@ -0,0 +1,139 @@
|
||||
import { sys, _decorator } from 'cc'
|
||||
import ManifestConfig from '../config/ManifestConfig'
|
||||
import EventManager from './EventManager'
|
||||
import HotUpdate from './HotUpdate'
|
||||
|
||||
export default class VersionManager {
|
||||
public static instance: VersionManager = new VersionManager()
|
||||
|
||||
public static Config_Game_Name: Array<string> = ['游戏大厅']
|
||||
|
||||
//热更文件下载来后存放文件夹
|
||||
public static Config_Key: Array<string> = ['main-remote-asset']
|
||||
|
||||
private static Config_ManifestName: string = 'project.manifest'
|
||||
|
||||
public static Config_Url_Key: Array<string> = ['main']
|
||||
|
||||
public iosStoreUrl: string = ''
|
||||
public apkStoreUrl: string = ''
|
||||
|
||||
public nowVersion: string = ManifestConfig.version //网页显示版本号,如果是热更会替换改值
|
||||
public targetVersion: string = '1.0.0'
|
||||
|
||||
public isOpenHotUpdate: boolean = true //是否打开热更
|
||||
|
||||
private hotUpdateList: Array<HotUpdate> = []
|
||||
|
||||
private noUpdateIndex: number = -1 //
|
||||
|
||||
public init() {
|
||||
this.reInitAll()
|
||||
}
|
||||
public reInitAll() {
|
||||
this.releaseAll()
|
||||
for (let i = 0; i < VersionManager.Config_Key.length; i++) {
|
||||
this.reInit(i)
|
||||
}
|
||||
}
|
||||
|
||||
public releaseAll() {
|
||||
for (let i = 0; i < VersionManager.Config_Key.length; i++) {
|
||||
if (this.hotUpdateList[i]) {
|
||||
this.hotUpdateList[i].disposeUpdate()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public reInit(index: number) {
|
||||
if (!this.hotUpdateList[index]) {
|
||||
this.hotUpdateList[index] = new HotUpdate()
|
||||
}
|
||||
this.hotUpdateList[index].init(
|
||||
index,
|
||||
VersionManager.Config_Key[index],
|
||||
VersionManager.Config_ManifestName
|
||||
)
|
||||
if (!this.isOpenHotUpdate) {
|
||||
this.hotUpdateList[index].isCheck = true
|
||||
this.hotUpdateList[index].isFinishUpdate = true
|
||||
}
|
||||
}
|
||||
|
||||
public checkUpdate(keyIndex: number) {
|
||||
if (keyIndex < this.hotUpdateList.length) {
|
||||
let hotUpdate: HotUpdate = this.hotUpdateList[keyIndex]
|
||||
if (sys.isNative) {
|
||||
if (keyIndex == this.noUpdateIndex) {
|
||||
//在大厅热更,不用子游戏热更了
|
||||
hotUpdate.isCheck = true
|
||||
hotUpdate.isFinishUpdate = true
|
||||
EventManager.instance.dispatchEvent(
|
||||
HotUpdate.Event_On_ALREADY_UP_TO_DATE,
|
||||
VersionManager.Config_Key[keyIndex]
|
||||
)
|
||||
} else {
|
||||
hotUpdate.checkUpdate()
|
||||
}
|
||||
} else {
|
||||
hotUpdate.isCheck = true
|
||||
hotUpdate.isFinishUpdate = true
|
||||
EventManager.instance.dispatchEvent(
|
||||
HotUpdate.Event_On_ALREADY_UP_TO_DATE,
|
||||
VersionManager.Config_Key[keyIndex]
|
||||
)
|
||||
}
|
||||
} else {
|
||||
EventManager.instance.dispatchEvent(
|
||||
HotUpdate.Event_On_ALREADY_UP_TO_DATE,
|
||||
VersionManager.Config_Key[keyIndex]
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
public startUpdate(keyIndex: number) {
|
||||
let hotUpdate: HotUpdate = this.hotUpdateList[keyIndex]
|
||||
hotUpdate.startUpdate()
|
||||
}
|
||||
|
||||
public isCheck(keyIndex: number) {
|
||||
if (keyIndex < this.hotUpdateList.length) {
|
||||
let hotUpdate: HotUpdate = this.hotUpdateList[keyIndex]
|
||||
if (keyIndex == this.noUpdateIndex) {
|
||||
return true
|
||||
}
|
||||
return hotUpdate.isCheck
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
public needUpdate(keyIndex: number) {
|
||||
if (keyIndex < this.hotUpdateList.length) {
|
||||
let hotUpdate: HotUpdate = this.hotUpdateList[keyIndex]
|
||||
if (keyIndex == this.noUpdateIndex) {
|
||||
return false
|
||||
}
|
||||
return hotUpdate.needUpdate
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
public isUpdating(keyIndex: number) {
|
||||
if (keyIndex < this.hotUpdateList.length) {
|
||||
let hotUpdate: HotUpdate = this.hotUpdateList[keyIndex]
|
||||
return hotUpdate.isUpdating
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
public isFinishUpdate(keyIndex: number) {
|
||||
if (keyIndex < this.hotUpdateList.length) {
|
||||
let hotUpdate: HotUpdate = this.hotUpdateList[keyIndex]
|
||||
if (keyIndex == this.noUpdateIndex) {
|
||||
return true
|
||||
}
|
||||
return hotUpdate.isFinishUpdate
|
||||
}
|
||||
return true
|
||||
}
|
||||
}
|
||||
11
assets/FishSingle/script/engine/utils/VersionManager.ts.meta
Normal file
11
assets/FishSingle/script/engine/utils/VersionManager.ts.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "c79a6571-dc2f-4715-a5d6-151542eef238",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"simulateGlobals": []
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user