This commit is contained in:
2024-05-01 19:13:01 +08:00
parent cf008327aa
commit 80a32d9b1b
150 changed files with 8561 additions and 5045 deletions

View File

@@ -4,9 +4,9 @@ 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'
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'
}

View File

@@ -1,37 +1,36 @@
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)
}
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) {
const obj: {
packageUrl?: string
remoteManifestUrl?: string
remoteVersionUrl?: string
version?: string
assets?: object
searchPaths?: Array<any>
} = {}
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)
}
}

View File

@@ -1,64 +1,59 @@
import { 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 musicKey2Path: Map<string, string> = new Map<string, string>() // 资源预加载路径
public static musicKey2Cache: Map<string, AudioClip> = new Map<
string,
AudioClip
>() //资源加载后cache路径
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
}
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)
}
}
}
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 (Object.prototype.hasOwnProperty.call(musicConfig, key)) {
const path = `${GameConfig.GameName}/${musicConfig[key]}`
MusicConfig.musicKey2Path.set(key, path)
}
}
}
}

View File

@@ -1,3 +1,3 @@
export default class NetConfig {
public static hotupdateUrl: string = 'http://localhost:33/hotupdate'
public static hotupdateUrl: string = 'http://localhost:33/hotupdate'
}

View File

@@ -1,50 +1,53 @@
import { _decorator, Component, instantiate, Label, Node, tween, Vec3 } from 'cc'
import PrefabLoader from '../utils/PrefabLoader'
import { Component, Label, Node, Vec3, _decorator, instantiate, tween } from 'cc'
import { GameConfig } from '../../game/config/GameConfig'
import PrefabLoader from '../utils/PrefabLoader'
import DialogBase from './DialogBase'
const { ccclass, property } = _decorator
@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() {}
public static TipsZorderIndex: number = 999
@property({ type: Label })
txtContent: Label | null = null
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()
}
private tips: string = ''
private static showingNameList: Array<string> = []
onDestroy() {
let index: number = CommonTips.showingNameList.indexOf(this.tips)
CommonTips.showingNameList.splice(index, 1)
this.unscheduleAllCallbacks()
}
onLoad() {}
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)
}
)
}
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() {
const 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.includes(msg)) CommonTips.showingNameList.push(msg)
const dialogNode = instantiate(loadedResource)
dialogNode.setPosition(0, 0)
const dialogScript: CommonTips = dialogNode.getComponent(CommonTips)
dialogScript.tips = msg
dialogScript.txtContent.string = msg
parentNode.insertChild(dialogNode, CommonTips.TipsZorderIndex)
},
)
}
}

View File

@@ -1,30 +1,36 @@
import { _decorator, Component, instantiate, Node, Prefab, Widget } from 'cc'
import PrefabLoader from '../utils/PrefabLoader'
import { Component, Node, Prefab, Widget, _decorator, instantiate } from 'cc'
import { GameConfig } from '../../game/config/GameConfig'
import PrefabLoader from '../utils/PrefabLoader'
import DialogBase from './DialogBase'
const { ccclass, property } = _decorator
@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
}
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() {
const dialogNode: Node = instantiate(DarkLayer.prefab)
return dialogNode
}
}

View File

@@ -1,65 +1,65 @@
import { _decorator, Component, Node, Widget } from 'cc'
import DarkLayer from './DarkLayer'
import { Component, Node, Widget, _decorator } from 'cc'
import { UIRoot } from '../../game/utils/UIRoot'
import DarkLayer from './DarkLayer'
const { ccclass } = _decorator
@ccclass('DialogBase')
export default class DialogBase extends Component {
private static LocalZOrder: number = 5
private darkLayer: Node | null = null
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()
}
// 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
}
onLoadMe() {}
onLoad() {
DialogBase.LocalZOrder += 1
const closeLayer: Node = this.node.getChildByName('closeLayer')
if (closeLayer) {
const 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()
}
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()
}
}
onLoadMe() {}
onStartMe() {}
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()
}
onClickClose() {
this.node.destroy()
}
onStartMe() {}
update(dt) {
this.onUpdateMe(dt)
}
onClickClose() {
this.node.destroy()
}
onUpdateMe(dt) {}
update(dt) {
this.onUpdateMe(dt)
}
onDestroy() {
DialogBase.LocalZOrder -= 1
this.onDestroyMe()
}
onUpdateMe(dt) {}
onDestroyMe() {}
onDestroy() {
DialogBase.LocalZOrder -= 1
this.onDestroyMe()
}
onDestroyMe() {}
}

View File

@@ -1,78 +1,76 @@
import { _decorator, Component, instantiate, Node, Prefab, Quat, Vec3 } from 'cc'
import PrefabLoader from '../utils/PrefabLoader'
import { Component, Node, Prefab, Quat, Vec3, _decorator, instantiate } from 'cc'
import { GameConfig } from '../../game/config/GameConfig'
import PrefabLoader from '../utils/PrefabLoader'
import DialogBase from './DialogBase'
const { ccclass, property } = _decorator
@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
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()
}
private _quatCache: Quat
private _vec3Cache: Vec3
start() {}
onLoad() {
this._quatCache = new Quat()
this._vec3Cache = new Vec3()
}
public static close() {
if (!LoadingPrefab.instance) {
return
}
LoadingPrefab.instance.removeFromParent()
LoadingPrefab.instance.destroy()
LoadingPrefab.instance = null
}
start() {}
public static preLoad(): Promise<void> {
return new Promise((resolve, reject) => {
PrefabLoader.loadPrefab(
GameConfig.GameName + '/' + 'share/uicomponent/LoadingPrefab',
(loadedResource) => {
LoadingPrefab.prefab = loadedResource
resolve()
}
)
})
}
public static close() {
if (!LoadingPrefab.instance) return
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)
}
LoadingPrefab.instance.removeFromParent()
LoadingPrefab.instance.destroy()
LoadingPrefab.instance = null
}
public static async show(parentNode: Node = null) {
if (LoadingPrefab.instance) return
if (!LoadingPrefab.prefab) {
await LoadingPrefab.preLoad()
}
this.createLoadingPrefab(parentNode)
}
public static preLoad(): Promise<void> {
return new Promise((resolve, reject) => {
PrefabLoader.loadPrefab(
`${GameConfig.GameName}/share/uicomponent/LoadingPrefab`,
(loadedResource) => {
LoadingPrefab.prefab = loadedResource
resolve()
},
)
})
}
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)
}
}
private static createLoadingPrefab(parentNode: Node = null) {
const dialogNode: Node = instantiate(LoadingPrefab.prefab)
LoadingPrefab.instance = dialogNode
if (!parentNode) parentNode = DialogBase.GetRootCanvas()
public static clear() {
LoadingPrefab.instance = null
LoadingPrefab.prefab = null
}
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
}
}

View File

@@ -1,90 +1,76 @@
import { _decorator, Component, instantiate, Node, Prefab } from 'cc'
import PrefabLoader from '../utils/PrefabLoader'
import Progress from './Progress'
import { Component, Node, Prefab, _decorator, instantiate } from 'cc'
import { GameConfig } from '../../game/config/GameConfig'
import PrefabLoader from '../utils/PrefabLoader'
import DialogBase from './DialogBase'
import Progress from './Progress'
const { ccclass, property } = _decorator
@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() {}
public static instance: Node
private static prefab: Prefab
public static LoadingZorderIndex: number = 99
@property({ type: Node })
private progressNode: Node | null = null
start() {}
onLoad() {}
public updateProgress(
completedCount: number,
totalCount: number,
item: any = null
) {
this.progressNode
.getComponent(Progress)
.updateProgress(
completedCount,
totalCount,
'消耗流量,预下载所有"鱼"类中,请耐心等待...'
)
}
start() {}
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)
}
}
}
public updateProgress(completedCount: number, totalCount: number, item: any = null) {
this.progressNode
.getComponent(Progress)
.updateProgress(completedCount, totalCount, '消耗流量,预下载所有"鱼"类中,请耐心等待...')
}
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 updateLoading(completedCount: number, totalCount: number, item: any = null) {
if (LoadingScenePrefab.instance) {
const nodeTs: LoadingScenePrefab =
LoadingScenePrefab.instance.getComponent(LoadingScenePrefab)
if (nodeTs) nodeTs.updateProgress(completedCount, totalCount, item)
}
}
public static preLoad(): Promise<void> {
return new Promise((resolve, reject) => {
PrefabLoader.loadPrefab(
GameConfig.GameName + '/' + 'share/uicomponent/LoadingScenePrefab',
(loadedResource: Prefab) => {
LoadingScenePrefab.prefab = loadedResource
resolve()
}
)
})
}
private static createPrefab(parentNode: Node = null) {
const dialogNode: Node = instantiate(LoadingScenePrefab.prefab)
LoadingScenePrefab.instance = dialogNode
if (!parentNode) parentNode = DialogBase.GetRootCanvas()
public static close() {
if (!LoadingScenePrefab.instance) {
return
}
LoadingScenePrefab.instance.destroy()
LoadingScenePrefab.instance = null
}
parentNode.insertChild(dialogNode, LoadingScenePrefab.LoadingZorderIndex)
dialogNode.setPosition(0, 0)
}
public static async show(parentNode: Node = null) {
if (LoadingScenePrefab.instance) return
if (!LoadingScenePrefab.prefab) {
await LoadingScenePrefab.preLoad()
}
this.createPrefab(parentNode)
}
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 clear() {
LoadingScenePrefab.instance = null
LoadingScenePrefab.prefab = null
}
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
}
}

View File

@@ -1,9 +1,18 @@
import { _decorator, AssetManager, AudioClip, AudioSource, Component, instantiate, Prefab } from 'cc'
import {
AssetManager,
AudioClip,
AudioSource,
Component,
Prefab,
_decorator,
instantiate,
} from 'cc'
import { GameConfig } from '../../game/config/GameConfig'
import MusicConfig from '../config/MusicConfig'
import LocalStorage from '../utils/LocalStorage'
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'
const { ccclass, property } = _decorator
@@ -13,71 +22,59 @@ const { ccclass, property } = _decorator
@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)
}
}
private static instance: MusicPrefab
private static MUSIC_VOLUMN_KEY: string = 'musicVolumn'
public static musicVolumn: number = 1
public static changeVolumn(nowVolumn: number) {
this.musicVolumn = nowVolumn
this.instance.node.getComponent(AudioSource).volume = nowVolumn
LocalStorage.setItem(
MusicPrefab.MUSIC_VOLUMN_KEY,
this.musicVolumn.toString()
)
}
public static play(key: string) {
const 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)
}
}
private static preInit() {
this.musicVolumn = parseFloat(
LocalStorage.getItem(MusicPrefab.MUSIC_VOLUMN_KEY)
)
if (isNaN(this.musicVolumn)) {
this.musicVolumn = 1
}
}
public static changeVolumn(nowVolumn: number) {
this.musicVolumn = nowVolumn
this.instance.node.getComponent(AudioSource).volume = nowVolumn
LocalStorage.setItem(MusicPrefab.MUSIC_VOLUMN_KEY, this.musicVolumn.toString())
}
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()
}
)
})
}
private static preInit() {
this.musicVolumn = Number.parseFloat(LocalStorage.getItem(MusicPrefab.MUSIC_VOLUMN_KEY))
if (Number.isNaN(this.musicVolumn)) this.musicVolumn = 1
}
public static destory() {
if (MusicPrefab.instance) {
MusicPrefab.instance.getComponent(AudioSource).stop()
MusicPrefab.instance.destroy()
}
MusicPrefab.instance = null
}
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
}
}

View File

@@ -1,56 +1,55 @@
import { _decorator, Component, Label, ProgressBar } from 'cc'
import { Component, Label, ProgressBar, _decorator } from 'cc'
const { ccclass, property } = _decorator
@ccclass('Progress')
export default class Progress extends Component {
@property(Label)
public percentLable: Label
@property(Label)
public percentLable: Label
@property(ProgressBar)
public bar: ProgressBar
@property(ProgressBar)
public bar: ProgressBar
onLoad() {
this.bar.node.active = false
this.bar.progress = 0
}
onLoad() {
this.bar.node.active = false
this.bar.progress = 0
}
start() {}
start() {}
updatePercent(current, filePercent) {
//this.percentLable.string = filePercent.toFixed(2);
}
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
}
updatefileTotal(current: number, filePercent: number) {
if (!this.bar.node.active) this.bar.node.active = true
let nowPercent = Math.round((current / filePercent) * 100)
const curMB = this.getMB(current)
const totalMB = this.getMB(filePercent)
// this.percentLable.string = "正在更新 " + nowPercent + "%" + " ( " + curMB + " / "+totalMB +" MB)";
nowPercent = Math.min(nowPercent, 100)
this.percentLable.string = `正在更新 ${nowPercent}%`
this.bar.progress = current / filePercent
}
public updateProgress(
current,
total,
msg: string = '正在加载资源,此过程不消耗流量...'
) {
this.bar.node.active = true
// this.setMsg(msg+ current + "/" + total);
this.setMsg(msg)
this.bar.progress = current / total
}
public updateProgress(
current: number,
total: number,
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)
}
getMB(bytes: number) {
bytes /= 1024
bytes /= 1024
return bytes.toFixed(2)
}
public setMsg(msg: string = '游戏加载中,请稍后...') {
this.percentLable.string = msg
}
public setMsg(msg: string = '游戏加载中,请稍后...') {
this.percentLable.string = msg
}
}

View File

@@ -1,11 +1,22 @@
import { _decorator, AssetManager, AudioClip, AudioSource, Component, instantiate, Node, NodePool, Prefab } from 'cc'
import { Logger } from '../utils/Logger'
import PrefabLoader from '../utils/PrefabLoader'
import LocalStorage from '../utils/LocalStorage'
import EventManager from '../utils/EventManager'
import {
AssetManager,
AudioClip,
AudioSource,
Component,
Node,
NodePool,
Prefab,
_decorator,
instantiate,
} from 'cc'
import { GameConfig } from '../../game/config/GameConfig'
import CommonEvent from '../config/CommonEvent'
import MusicConfig from '../config/MusicConfig'
import { GameConfig } from '../../game/config/GameConfig'
import EventManager from '../utils/EventManager'
import LocalStorage from '../utils/LocalStorage'
import { Logger } from '../utils/Logger'
import PrefabLoader from '../utils/PrefabLoader'
const { ccclass, property } = _decorator
@@ -16,120 +27,102 @@ const { ccclass, property } = _decorator
@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) {
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 = ''
// node = this.pool.get();
// } else {
node = instantiate(this.prefab)
// }
return node
}
private static getAudioNode() {
let node: Node = null
// if (this.pool.size() > 0) {
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)
}
}
// node = this.pool.get();
// } else {
node = instantiate(this.prefab)
// }
return node
}
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()
)
}
public static play(key: string) {
const 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) {
const 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)
}
}
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
}
}
public static changeVolumn(nowVolumn: number) {
this.soundVolumn = nowVolumn
for (let i = 0; i < this.nowAudioNodeList.length; i++) {
const audioNode: Node = this.nowAudioNodeList[i]
const audioSource: AudioSource = audioNode.getComponent(AudioSource)
if (audioSource.playing) audioSource.volume = nowVolumn
}
LocalStorage.setItem(SoundPrefab.SOUND_VOLUMN_KEY, SoundPrefab.soundVolumn.toString())
}
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)
}
}
}
private static preInit() {
EventManager.instance.addListener(CommonEvent.Event_FrameUpdate, this.updateFrame, this)
SoundPrefab.soundVolumn = Number.parseFloat(LocalStorage.getItem(SoundPrefab.SOUND_VOLUMN_KEY))
if (Number.isNaN(SoundPrefab.soundVolumn)) SoundPrefab.soundVolumn = 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()
}
)
})
}
private static updateFrame() {
for (let i = 0; i < this.nowAudioNodeList.length; i++) {
const audioNode: Node = this.nowAudioNodeList[i]
const audioSource: AudioSource = audioNode.getComponent(AudioSource)
if (!audioSource.playing) SoundPrefab.nowAudioNodeList.splice(i, 1)
}
}
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()
}
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++) {
const audioNode: Node = this.nowAudioNodeList[i]
audioNode.getComponent(AudioSource).stop()
audioNode.getComponent(AudioSource).destroy()
}
this.nowAudioNodeList = []
this.pool.clear()
}
}

View File

@@ -1,21 +1,25 @@
import { _decorator, Component, SpriteFrame } from 'cc'
import { Component, SpriteFrame, _decorator } 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[] = []
@property({ type: [SpriteFrame] })
public Spriteset: SpriteFrame[] = []
onLoad() {
// // init logic
}
@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
}
}

View File

@@ -10,29 +10,25 @@ export default class AdapterHelper {
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'
)
}
// return
// const framesize = view.getFrameSize()
// if (!this.winSizeWidth) {
// this.winSizeWidth = screen.width
// this.winSizeHeiht = screen.height
// }
// const designsize = view.getDesignResolutionSize()
// const canvas: Canvas = DialogBase.GetRootCanvas().getComponent(Canvas)
// const ratio: number = framesize.height / framesize.width
// const 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')
// }
}
}

View File

@@ -4,45 +4,39 @@ const { ccclass, property } = _decorator
@ccclass('BitUtil')
export default class BitUtil {
//index是二进制从右到左
// index是二进制从右到左
public static isBitSet(value: number, index: number): boolean {
let str: string = value.toString(2)
return parseInt(str[str.length - 1 - index]) == 1
const str: string = value.toString(2)
return Number.parseInt(str[str.length - 1 - index]) === 1
}
//从右到左计算
// 从右到左计算
public static setBitValue(value: number, index: number): number {
let newValue: number = value
let str: string = value.toString(2)
const str: string = value.toString(2)
let newStr: string = ''
let maxIndex = Math.max(str.length - 1, index)
const maxIndex = Math.max(str.length - 1, index)
for (let i = 0; i <= maxIndex; i++) {
if (index == i) {
newStr = '1' + newStr
if (index === i) {
newStr = `1${newStr}`
} else {
if (str[i] == undefined) {
newStr = '0' + newStr
} else {
newStr = str[i] + newStr
}
if (str[i] === undefined) newStr = `0${newStr}`
else newStr = str[i] + newStr
}
}
newValue = parseInt(newStr, 2)
newValue = Number.parseInt(newStr, 2)
return newValue
}
public static clearBitValue(value: number, index: number) {
let newValue: number = value
let str: string = value.toString(2)
const 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
}
if (index === str.length - 1 - i) newStr = `0${newStr}`
else newStr = str[i] + newStr
}
newValue = parseInt(newStr, 2)
newValue = Number.parseInt(newStr, 2)
return newValue
}
}

View File

@@ -1,11 +1,11 @@
import { _decorator, Color } from 'cc'
import { Color, _decorator } from 'cc'
const { ccclass, property } = _decorator
@ccclass('ColorHelper')
export default class ColorHelper {
public static getColor(hexStr: string): Color {
let color: Color = Color.BLACK
const color: Color = Color.BLACK
return color.fromHEX(hexStr)
}
}

View File

@@ -1,136 +1,83 @@
export default class DateUtil {
public static formatNumStr(num: number) {
let str = '' + num
if (num < 10) {
str = '0' + num
}
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()
)
const 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() + '日'
const 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
// 根据时间戳返回 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())
)
const 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
// 根据时间戳返回 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())
)
const 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
// 根据时间戳返回 2018-1-31
public static formatDateStr3(timestamp: number) {
let date: Date = new Date(timestamp)
return (
date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate()
)
const date: Date = new Date(timestamp)
return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`
}
// timestamp:1453094034000
//根据时间戳返回 19:53
// 根据时间戳返回 19:53
public static formatHourMinStr(timestamp: number) {
let date: Date = new Date(timestamp)
return (
this.formatNumStr(date.getHours()) +
':' +
this.formatNumStr(date.getMinutes())
)
const date: Date = new Date(timestamp)
return `${this.formatNumStr(date.getHours())}:${this.formatNumStr(date.getMinutes())}`
}
// timestamp:1453094034000
//根据时间戳返回 19:53:11
// 根据时间戳返回 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())
)
const 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()
const 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
const date: Date = new Date()
return date.getTime() >= startTime && date.getTime() <= endTime
}
//根据时间戳返回 1天19:53:11
// 根据时间戳返回 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
const day: number = Math.floor(timestamp / (1000 * 60 * 60 * 24))
const hour: number = Math.floor(timestamp / (1000 * 60 * 60)) % 24
const min: number = Math.floor(timestamp / (1000 * 60)) % 60
const second: number = Math.floor(timestamp / 1000) % 60
return `${day}${this.formatNumStr(hour)}:${this.formatNumStr(min)}:${this.formatNumStr(second)}`
}
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
const nowDate: Date = new Date()
const checkDate: Date = new Date(dateTime)
return (
checkDate.getFullYear() === nowDate.getFullYear() &&
checkDate.getMonth() === nowDate.getMonth() &&
checkDate.getDate() === nowDate.getDate()
)
}
}

View File

@@ -1,4 +1,5 @@
import { Button, Color, Component, Node, Slider } from 'cc'
import ColorHelper from './ColorHelper'
export class HaoEvent {
@@ -18,20 +19,17 @@ export default class EventManager {
private callbackList = {}
public constructor() {
}
public constructor() {}
//注册事件
// 注册事件
public addListener(eventName: string, callback: Function, caller: any) {
if (this.callbackList[eventName]) {
let eventList: Array<HaoEvent> = this.callbackList[eventName]
//不同元件才放入,相同元件覆蓋
const 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
}
const event: HaoEvent = eventList[i]
if (caller === event.caller) add = false
}
if (add) {
eventList.push(new HaoEvent(callback, caller))
@@ -46,7 +44,7 @@ export default class EventManager {
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]
const event: HaoEvent = this.callbackList[eventName][i]
if (event.callback == callback) {
this.callbackList[eventName].splice(i, 1)
break
@@ -56,17 +54,15 @@ export default class EventManager {
}
public dispatchEvent(eventName, parameter?: any, ...restOfName: any[]) {
let eventList: Array<HaoEvent> = this.callbackList[eventName]
const eventList: Array<HaoEvent> = this.callbackList[eventName]
if (eventList) {
for (let i = eventList.length - 1; i >= 0; i--) {
let event: HaoEvent = eventList[i]
const event: HaoEvent = eventList[i]
event.callback.call(event.caller, event, parameter, ...restOfName)
if (event.isStop) {
break
}
if (event.isStop) break
}
for (let i = eventList.length - 1; i >= 0; i--) {
let event: HaoEvent = eventList[i]
const event: HaoEvent = eventList[i]
event.isStop = false
}
}
@@ -77,12 +73,12 @@ export default class EventManager {
objectNode: Node,
scriptName: string,
eventName: string,
data: any = null
data: any = null,
) {
var btn: Button = objectNode.addComponent(Button)
var clickEventHandler = new Component.EventHandler()
clickEventHandler.target = parentNode //这个 node 节点是你的事件处理代码组件所属的节点
clickEventHandler.component = scriptName //这个是代码文件名
const btn: Button = objectNode.addComponent(Button)
const clickEventHandler = new Component.EventHandler()
clickEventHandler.target = parentNode // 这个 node 节点是你的事件处理代码组件所属的节点
clickEventHandler.component = scriptName // 这个是代码文件名
clickEventHandler.handler = eventName
clickEventHandler.customEventData = data
btn.clickEvents.push(clickEventHandler)
@@ -94,12 +90,12 @@ export default class EventManager {
}
public removeBtnEffect(objectNode: Node) {
var b = objectNode.getComponent(Button)
const b = objectNode.getComponent(Button)
b.transition = Button.Transition.NONE
}
public addBtnEffect(objectNode: Node, scale: number = 1.1) {
var b = objectNode.getComponent(Button)
const b = objectNode.getComponent(Button)
b.transition = Button.Transition.SCALE
b.zoomScale = scale
}
@@ -107,24 +103,19 @@ export default class EventManager {
public addBtnEffect_color(
objectNode: Node,
normalC: Color = ColorHelper.getColor('#FFFFFF'),
pressC: Color = ColorHelper.getColor('#C0C0C0')
pressC: Color = ColorHelper.getColor('#C0C0C0'),
) {
var b = objectNode.getComponent(Button)
const 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 //这个是代码文件名
public addSliderEvent(parentNode: Node, objectNode: Node, EventName: string, data: any) {
const b = objectNode.getComponent(Slider)
const clickEventHandler = new Component.EventHandler()
clickEventHandler.target = parentNode // 这个 node 节点是你的事件处理代码组件所属的节点
clickEventHandler.component = parentNode.name // 这个是代码文件名
clickEventHandler.handler = EventName
clickEventHandler.customEventData = data
b.slideEvents.push(clickEventHandler)

View File

@@ -2,13 +2,11 @@ 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
}
if (i % 2 === 0) code += 2
else code += 1
result += String.fromCharCode(code)
}
return result
@@ -17,13 +15,10 @@ export default class HaoEncrypt {
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
}
if (i % 2 === 0) code -= 2
else code -= 1
result += String.fromCharCode(code)
}
return result

View File

@@ -1,18 +1,19 @@
import { native, sys } 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'
import EventManager from './EventManager'
import { Logger } from './Logger'
import VersionManager from './VersionManager'
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_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: null
@@ -27,21 +28,16 @@ export default class HotUpdate {
private key: string
private hotupdateIndex: number
constructor() {
}
constructor() {}
public init(
index: number,
key: string = 'Code-remote-asset',
manifestUrl: string
) {
public init(index: number, key: string = 'Code-remote-asset', manifestUrl: string) {
if (sys.isNative) {
this.hotupdateIndex = index
this.key = key
this.manifestUrl = manifestUrl
this.storagePath = '获取this.storagePath报错了'
Logger.log(this, 'init removeDirectory=', this.storagePath + '_temp')
Logger.log(this, 'init removeDirectory=', `${this.storagePath}_temp`)
}
this.needUpdate = false
this.isUpdating = false
@@ -52,38 +48,25 @@ export default class HotUpdate {
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
}
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==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(
'有新的版本需要更新,下载后请先卸载,以前的版本,再安装!'
)
CommonTips.showMsg('有新的版本需要更新,下载后请先卸载,以前的版本,再安装!')
this.jumpToPack()
this.showPackUpdateDialog()
}
private checkCb(event: any) {
Logger.log(this, 'checkCb Code: =================' + event.getEventCode())
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.')
@@ -103,18 +86,18 @@ export default class HotUpdate {
this,
'new version found, please try to update.',
this.localBigVersion,
this.remoteBigVersion
this.remoteBigVersion,
)
if (
this.key == VersionManager.Config_Key[0] &&
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.remoteBigVersion,
)
this.showPackUpdateDialog()
} else {
@@ -122,14 +105,11 @@ export default class HotUpdate {
this,
'new version found, please try to update======hotupdate=',
this.localBigVersion,
this.remoteBigVersion
this.remoteBigVersion,
)
// this._am.update();
this.needUpdate = true
EventManager.instance.dispatchEvent(
HotUpdate.Event_On_NeedUpdate,
this.key
)
EventManager.instance.dispatchEvent(HotUpdate.Event_On_NeedUpdate, this.key)
}
break
case native.EventAssetsManager.UPDATE_PROGRESSION:
@@ -142,14 +122,14 @@ export default class HotUpdate {
'UPDATE_PROGRESSION2222==========',
this.key,
event.getDownloadedBytes(),
event.getTotalBytes()
event.getTotalBytes(),
)
if (event.getTotalBytes() > 0) {
EventManager.instance.dispatchEvent(
HotUpdate.Event_On_Progress,
event.getDownloadedBytes(),
event.getTotalBytes(),
this.key
this.key,
)
}
break
@@ -162,23 +142,16 @@ export default class HotUpdate {
this.failUpdate()
break
case native.EventAssetsManager.ERROR_UPDATING:
let fullFilePath: string = this.storagePath + '/' + event.getAssetId()
let tempFilePath: string =
this.storagePath + '_temp/' + event.getAssetId()
const fullFilePath: string = `${this.storagePath}/${event.getAssetId()}`
const 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()
)
Logger.warn(this, 'ERROR_UPDATING=============', event.getAssetId(), event.getMessage())
this.failUpdate()
break
default:
// this.failUpdate();
return
// this.failUpdate();
}
}
@@ -187,21 +160,20 @@ export default class HotUpdate {
Logger.log(this, 'Checking or updating ...')
return
}
let hotupdateUrlKey: string =
VersionManager.Config_Url_Key[this.hotupdateIndex]
const 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.versionCompareHandle.bind(this),
)
}
// this._am.setMaxConcurrentTask(1);
let manifestStr: string = ManifestConfig.getManifestStr(hotupdateUrlKey)
const 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) {
const manifest = new native.Manifest(manifestStr, this.storagePath)
this._am.setVerifyCallback((filePath, asset) => {
return true
// var md5 = calculateMD5(filePath);
// if (md5 === asset.md5)
@@ -223,46 +195,33 @@ export default class HotUpdate {
private versionCompareHandle(versionA: string, versionB: string) {
const vA = versionA.split('.')
const vB = versionB.split('.')
Logger.log(
this,
'versionCompareHandle======',
this.key,
VersionManager.Config_Key[0]
)
if (this.key == VersionManager.Config_Key[0]) {
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])
this.localBigVersion = Number.parseInt(vA[0])
this.remoteBigVersion = Number.parseInt(vB[0])
for (let i = 0; i < vA.length; ++i) {
const a = parseInt(vA[i])
const b = parseInt(vB[i] || '0')
const a = Number.parseInt(vA[i])
const b = Number.parseInt(vB[i] || '0')
if (a !== b) return a - b
}
if (vB.length > vA.length) {
return -1
} else {
return 0
}
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()
const localManifest = this._am.getLocalManifest()
const 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
)
EventManager.instance.dispatchEvent(HotUpdate.Event_On_Progress, 0, 100, this.key)
this._am.update()
}
@@ -280,42 +239,19 @@ export default class HotUpdate {
private failUpdate() {
this.disposeUpdate()
this.isCheck = false
EventManager.instance.dispatchEvent(
HotUpdate.Event_On_Fail_Update,
this.key
)
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
)
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()
}
}
EventManager.instance.dispatchEvent(HotUpdate.Event_Finish_Update, this.key, needRestart)
}
}

View File

@@ -1,13 +1,14 @@
import { _decorator } from 'cc'
import { Logger } from './Logger'
const { ccclass } = _decorator
@ccclass('HttpClient')
export default class HttpClient {
public static instance: HttpClient //= new HttpClient();
public static instance: HttpClient // = new HttpClient();
//example
// example
// HttpClient.instance.request("http://localhost:8080/haohttp/test", ()=>{
// console.log("http 请求 end=============");
// }, {"nickName":"jhao", "hh":1, "id":9527});
@@ -27,12 +28,10 @@ export default class HttpClient {
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]
}
if (Object.prototype.hasOwnProperty.call(paramsObj, key)) {
if (nowIndex === 1) resParams += `${key}=${paramsObj[key]}`
else resParams += `&${key}=${paramsObj[key]}`
nowIndex += 1
}
}
@@ -44,41 +43,29 @@ export default class HttpClient {
this.responseType = responseType
}
public setContentType() {
}
public setContentType() {}
public request(
url: string,
callback: Function,
params: any = null,
timeOut: number = 5 * 1000
) {
if (params && this.methodType == 'GET') {
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
url += `?${getParams}`
}
this.xhr = new XMLHttpRequest() // http请求 fget
//this.xhr = cc.loader.getXMLHttpRequest();
let xhr: XMLHttpRequest = this.xhr
// this.xhr = cc.loader.getXMLHttpRequest();
const 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
)
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
if (xhr.readyState === 4 && xhr.status === 200) {
const response = xhr.response
Logger.log(this, 'http response1============', xhr)
try {
let testJson = JSON.stringify(response)
const testJson = JSON.stringify(response)
Logger.log(this, 'http response json============', testJson)
if (callback) {
callback(true, response)
@@ -91,31 +78,21 @@ export default class HttpClient {
callback = null
}
}
} else if (xhr.readyState == 4 && xhr.status == 301) {
//域名转移
Logger.log(
this,
'http response222============',
xhr.getResponseHeader('Location')
)
} 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) {
} 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, 'onreadystatechange else====', xhr.status, xhr.readyState, xhr.response)
if (xhr.readyState === 4) {
Logger.log(this, 'http onError else============')
if (callback) {
callback(false)
@@ -125,13 +102,7 @@ export default class HttpClient {
}
}
xhr.onprogress = () => {
Logger.log(
this,
'http onprogress===',
xhr.status,
xhr.readyState,
xhr.response
)
Logger.log(this, 'http onprogress===', xhr.status, xhr.readyState, xhr.response)
}
xhr.onerror = () => {
Logger.log(this, 'http onError============')
@@ -155,6 +126,5 @@ export default class HttpClient {
xhr.send(params)
}
public getInfo(callback: Function = null) {
}
public getInfo(callback: Function = null) {}
}

View File

@@ -16,11 +16,10 @@ export default class LocalStorage {
}
public static getInt(key: string): number {
let tempValue: string = LocalStorage.getItem(key)
const tempValue: string = LocalStorage.getItem(key)
let result: number = 0
if (tempValue) {
result = parseInt(tempValue)
}
if (tempValue) result = Number.parseInt(tempValue)
return result
}
@@ -29,11 +28,10 @@ export default class LocalStorage {
}
public static getFloat(key: string): number {
let tempValue: string = LocalStorage.getItem(key)
const tempValue: string = LocalStorage.getItem(key)
let result: number = 0
if (tempValue) {
result = parseFloat(tempValue)
}
if (tempValue) result = Number.parseFloat(tempValue)
return result
}
@@ -42,19 +40,13 @@ export default class LocalStorage {
}
public static getBoolean(key: string): boolean {
let temp: number = LocalStorage.getInt(key)
if (temp == 1) {
return true
}
return false
const temp: number = LocalStorage.getInt(key)
return temp === 1
}
public static setBoolean(key: string, value: boolean) {
if (value) {
LocalStorage.setInt(key, 1)
} else {
LocalStorage.setInt(key, 0)
}
if (value) LocalStorage.setInt(key, 1)
else LocalStorage.setInt(key, 0)
}
public static clear() {

View File

@@ -9,130 +9,78 @@ class LOG_LEVEL_TYPES {
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 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;'
'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()
)
const 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 {
return '[' +
Logger.formatNow() +
'] ' +
Logger.tag +
' [' +
Log_Level_Names[nowLevel] +
'] '
return `[${Logger.formatNow()}] ${Logger.tag} [${Log_Level_Names[nowLevel]}] `
}
public static debug(...params: any) {
if (Logger.LEVEL > LOG_LEVEL_TYPES.DEBUG) {
if (Logger.LEVEL > LOG_LEVEL_TYPES.DEBUG)
return
}
let str: string = this.getLogPreKey(LOG_LEVEL_TYPES.DEBUG)
let fileStr: string = str + params.join(' ')
const str: string = this.getLogPreKey(LOG_LEVEL_TYPES.DEBUG)
const 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)
}
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) {
if (Logger.LEVEL > LOG_LEVEL_TYPES.LOG)
return
}
let str: string = this.getLogPreKey(LOG_LEVEL_TYPES.LOG)
let fileStr: string = str + params.join(' ')
const str: string = this.getLogPreKey(LOG_LEVEL_TYPES.LOG)
const 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)
}
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)
}
if (Logger.LEVEL > LOG_LEVEL_TYPES.INFO) return
const str: string = this.getLogPreKey(LOG_LEVEL_TYPES.INFO)
const 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) {
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)
}
const str: string = this.getLogPreKey(LOG_LEVEL_TYPES.WARN)
const 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)
}
if (Logger.LEVEL > LOG_LEVEL_TYPES.ERROR) return
const str: string = this.getLogPreKey(LOG_LEVEL_TYPES.ERROR)
const 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)
}
}

View File

@@ -11,7 +11,7 @@ export default class MathUtils {
public static distance(x1: number, y1: number, x2: number, y2: number) {
// 设两点AX1,Y1,BX2,Y2
// 距离D=X2-X1的平方+Y2-Y1平方的和开平方
return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2))
return Math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)
}
/**
@@ -45,7 +45,7 @@ export default class MathUtils {
* @param endP
*/
public static p2pRad(startP: Vec2, endP: Vec2) {
let rad: number = Math.atan2(endP.y - startP.y, endP.x - startP.x)
const rad: number = Math.atan2(endP.y - startP.y, endP.x - startP.x)
return rad
}
@@ -54,11 +54,8 @@ export default class MathUtils {
* @param rot
*/
public static rotation2Fish(rot: number) {
if (rot >= 0 && rot <= 180) {
rot = 180 - rot
} else {
rot = -180 - rot
}
if (rot >= 0 && rot <= 180) rot = 180 - rot
else rot = -180 - rot
return rot
}
}

View File

@@ -1,4 +1,5 @@
import { Node, Vec2, Vec3 } from 'cc'
import MathUtils from './MathUtils'
export class MoveHelper {
@@ -11,7 +12,7 @@ export class MoveHelper {
speed: number,
tx: number,
ty: number,
minSpeed: number = 0.01
minSpeed: number = 0.01,
) {
let isMoving: boolean = false
let times: number = 0
@@ -20,9 +21,9 @@ export class MoveHelper {
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)
const rad: number = MathUtils.p2pRad(MoveHelper._vec2_0, MoveHelper._vec2_1)
const speedX: number = speed * Math.cos(rad)
const 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++) {

View File

@@ -1,4 +1,5 @@
import { _decorator, AssetManager, Prefab } from 'cc'
import { AssetManager, Prefab, _decorator } from 'cc'
import { Logger } from './Logger'
const { ccclass, property } = _decorator
@@ -10,21 +11,17 @@ export default class PrefabLoader {
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
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
})
}
}

View File

@@ -1,7 +1,7 @@
import { Vec2 } from 'cc'
export default class RandomUtil {
//随机minNum到maxNum的数字 包含maxNum
// 随机minNum到maxNum的数字 包含maxNum
public static nextInt(minNum: number, maxNum: number) {
return Math.floor(Math.random() * (maxNum - minNum + 1) + minNum)
}
@@ -11,27 +11,24 @@ export default class RandomUtil {
}
public static nextSign() {
let temp = Math.random()
if (temp < 0.5) {
return 1
}
const temp = Math.random()
if (temp < 0.5) return 1
return -1
}
public static nextBoolean() {
let temp = Math.random()
return temp < 0.5;
const temp = Math.random()
return temp < 0.5
}
public static randomArr(nowArr: Array<any>, needNum: number) {
let tempArr: Array<any> = nowArr.concat()
let resultArr: Array<any> = []
const tempArr: Array<any> = nowArr.concat()
const resultArr: Array<any> = []
for (let index = 0; index < needNum; index++) {
if (tempArr.length <= 0) {
break
}
let randomIndex: number = RandomUtil.nextInt(0, tempArr.length - 1)
if (tempArr.length <= 0) break
const randomIndex: number = RandomUtil.nextInt(0, tempArr.length - 1)
resultArr.push(tempArr.splice(randomIndex, 1)[0])
}
return resultArr
@@ -42,8 +39,8 @@ export default class RandomUtil {
}
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)
const randomX: number = RandomUtil.nextNumber(left, right)
const randomY: number = RandomUtil.nextNumber(up, down)
return new Vec2(randomX, randomY)
}
}

View File

@@ -1,4 +1,5 @@
import { Color, Material, Node, UIRenderer, UITransform, Vec2 } from 'cc'
import ShaderMaterialPrefab from '../../game/prefab/ShaderMaterialPrefab'
export default class ShaderHelper {
@@ -9,21 +10,15 @@ export default class ShaderHelper {
*/
public static clearAllEffect(
showNode: Node,
material: Material = ShaderMaterialPrefab.instance.getComponent(
ShaderMaterialPrefab
).default
material: Material = ShaderMaterialPrefab.instance.getComponent(ShaderMaterialPrefab).default,
) {
showNode
.getComponents(UIRenderer)
.forEach((renderComponent: UIRenderer) => {
showNode.getComponents(UIRenderer).forEach((renderComponent: UIRenderer) => {
renderComponent.setSharedMaterial(material, 0)
})
showNode.children.forEach((childNode) => {
childNode.getComponents(UIRenderer).forEach((renderComponent: UIRenderer) => {
renderComponent.setSharedMaterial(material, 0)
})
showNode.children.forEach((childNode) => {
childNode
.getComponents(UIRenderer)
.forEach((renderComponent: UIRenderer) => {
renderComponent.setSharedMaterial(material, 0)
})
})
}
@@ -36,23 +31,18 @@ export default class ShaderHelper {
public static setGrayEffect(
showNode: Node,
grayLevel: number = 1,
material: Material = ShaderMaterialPrefab.instance.getComponent(
ShaderMaterialPrefab
).grayMaterial
material: Material = ShaderMaterialPrefab.instance.getComponent(ShaderMaterialPrefab)
.grayMaterial,
) {
showNode
.getComponents(UIRenderer)
.forEach((renderComponent: UIRenderer) => {
material.setProperty('grayLevel', grayLevel)
renderComponent.setMaterial(material, 0)
})
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)
})
childNode.getComponents(UIRenderer).forEach((renderComponent: UIRenderer) => {
material.setProperty('grayLevel', grayLevel)
renderComponent.setSharedMaterial(material, 0)
})
})
}
@@ -61,15 +51,13 @@ export default class ShaderHelper {
*/
public static showGrayMv(showNode: Node) {
let grayValue: number = 0.5
let intervalId = setInterval(() => {
const intervalId = setInterval(() => {
grayValue += 0.01
if (grayValue >= 1) {
grayValue = 1
clearInterval(intervalId)
}
if (showNode) {
ShaderHelper.setGrayEffect(showNode, grayValue)
}
if (showNode) ShaderHelper.setGrayEffect(showNode, grayValue)
}, 1)
}
@@ -82,23 +70,17 @@ export default class ShaderHelper {
public static setOldPhotoEffect(
showNode: Node,
grayLevel: number = 1,
material: Material = ShaderMaterialPrefab.instance.getComponent(
ShaderMaterialPrefab
).oldPhoto
material: Material = ShaderMaterialPrefab.instance.getComponent(ShaderMaterialPrefab).oldPhoto,
) {
showNode
.getComponents(UIRenderer)
.forEach((renderComponent: UIRenderer) => {
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)
})
showNode.children.forEach((childNode) => {
childNode
.getComponents(UIRenderer)
.forEach((renderComponent: UIRenderer) => {
material.setProperty('oldLevel', grayLevel)
renderComponent.setSharedMaterial(material, 0)
})
})
}
@@ -107,15 +89,13 @@ export default class ShaderHelper {
*/
public static showOldPhotoMv(showNode: Node) {
let grayValue: number = 0
let intervalId = setInterval(() => {
const intervalId = setInterval(() => {
grayValue += 0.01
if (grayValue >= 1) {
grayValue = 1
clearInterval(intervalId)
}
if (showNode) {
ShaderHelper.setOldPhotoEffect(showNode, grayValue)
}
if (showNode) ShaderHelper.setOldPhotoEffect(showNode, grayValue)
}, 1)
}
@@ -131,27 +111,21 @@ export default class ShaderHelper {
public static setGlowInner(
showNode: Node,
materialParam: any,
material: Material = ShaderMaterialPrefab.instance.getComponent(
ShaderMaterialPrefab
).glowInner
material: Material = ShaderMaterialPrefab.instance.getComponent(ShaderMaterialPrefab).glowInner,
) {
showNode
.getComponents(UIRenderer)
.forEach((renderComponent: UIRenderer) => {
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.setSharedMaterial(material, 0)
renderComponent.setMaterial(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)
})
})
}
@@ -164,7 +138,7 @@ export default class ShaderHelper {
this.setGlowInner(showNode, {
glowColor: color,
glowColorSize: 0.015,
glowThreshold: 0.1
glowThreshold: 0.1,
})
}
@@ -173,29 +147,27 @@ export default class ShaderHelper {
*/
public static showFlash(showNode: Node, totalFlashTimes: number = 1) {
let timeCount: number = 0
let color: Color = Color.WHITE
const color: Color = Color.WHITE
let flashTimes: number = 0
let intervalId = setInterval(() => {
const intervalId = setInterval(() => {
timeCount += 1
if (timeCount % 50 == 0) {
let tempCount: number = timeCount / 50
if (tempCount % 2 == 0) {
if (timeCount % 50 === 0) {
const tempCount: number = timeCount / 50
if (tempCount % 2 === 0) {
color.a = 100
this.setGlowInner(showNode, {
glowColor: color,
glowColorSize: 0.1,
glowThreshold: 0
glowThreshold: 0,
})
} else {
flashTimes++
this.setGlowInner(showNode, {
glowColor: color,
glowColorSize: 0,
glowThreshold: 0
glowThreshold: 0,
})
if (flashTimes > totalFlashTimes) {
clearInterval(intervalId)
}
if (flashTimes > totalFlashTimes) clearInterval(intervalId)
}
}
}, 1)
@@ -210,25 +182,19 @@ export default class ShaderHelper {
public static setMosaic(
showNode: Node,
materialParam: any,
material: Material = ShaderMaterialPrefab.instance.getComponent(
ShaderMaterialPrefab
).mosaic
material: Material = ShaderMaterialPrefab.instance.getComponent(ShaderMaterialPrefab).mosaic,
) {
showNode
.getComponents(UIRenderer)
.forEach((renderComponent: UIRenderer) => {
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)
})
showNode.children.forEach((childNode) => {
childNode
.getComponents(UIRenderer)
.forEach((renderComponent: UIRenderer) => {
material.setProperty('xBlockCount', materialParam.xBlockCount)
material.setProperty('yBlockCount', materialParam.yBlockCount)
renderComponent.setSharedMaterial(material, 0)
})
})
}
@@ -237,17 +203,15 @@ export default class ShaderHelper {
*/
public static showMosaicMv(showNode: Node, callback: Function = null) {
let masaicTimes: number = 500
let intervalId = setInterval(() => {
const intervalId = setInterval(() => {
masaicTimes -= 2
this.setMosaic(showNode, {
xBlockCount: masaicTimes,
yBlockCount: masaicTimes
yBlockCount: masaicTimes,
})
if (masaicTimes <= 30) {
clearInterval(intervalId)
if (callback) {
callback()
}
if (callback) callback()
}
}, 1)
}
@@ -261,27 +225,22 @@ export default class ShaderHelper {
public static setRoundCornerCrop(
showNode: Node,
roundCornerRadius: number = 0.1,
material: Material = ShaderMaterialPrefab.instance.getComponent(
ShaderMaterialPrefab
).roundCornerCrop
material: Material = ShaderMaterialPrefab.instance.getComponent(ShaderMaterialPrefab)
.roundCornerCrop,
) {
showNode
.getComponents(UIRenderer)
.forEach((renderComponent: UIRenderer) => {
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)
})
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)
})
})
}
@@ -304,33 +263,49 @@ export default class ShaderHelper {
enableGradient: boolean = true,
cropAlpha: boolean = true,
enableFog: boolean = false,
material: Material = ShaderMaterialPrefab.instance.getComponent(
ShaderMaterialPrefab
).flashLight
material: Material = ShaderMaterialPrefab.instance.getComponent(ShaderMaterialPrefab)
.flashLight,
) {
showNode
.getComponents(UIRenderer)
.forEach((renderComponent: UIRenderer) => {
// 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)
// })
// })
const setMaterialProperties = (renderer: UIRenderer) => {
try {
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)
})
renderer.setSharedMaterial(material, 0)
} catch (error) {
console.error('Error setting material properties:', error)
}
}
const renderComponents = [
...showNode.getComponents(UIRenderer),
...showNode.children.flatMap(childNode => childNode.getComponents(UIRenderer)),
]
renderComponents.forEach((renderComponent: UIRenderer) => {
setMaterialProperties(renderComponent)
})
}
@@ -340,28 +315,23 @@ export default class ShaderHelper {
* @param callback
*/
public static showFlashLightMv(showNode: Node, callback: Function = null) {
let nowClor: Color = new Color(0, 0, 0, 255)
const nowClor: Color = new Color(0, 0, 0, 255)
let colorIndex: number = 0
let lightAngle: number = 0
let intervalId = setInterval(() => {
if (colorIndex == 0) {
const intervalId = setInterval(() => {
if (colorIndex === 0) {
nowClor.r = nowClor.r + 2
if (nowClor.r >= 255) {
colorIndex += 1
}
} else if (colorIndex == 1) {
if (nowClor.r >= 255) colorIndex += 1
} else if (colorIndex === 1) {
nowClor.g = nowClor.g + 2
if (nowClor.g >= 255) {
colorIndex += 1
}
if (nowClor.g >= 255) colorIndex += 1
} else {
nowClor.b = nowClor.b + 2
if (nowClor.b >= 255) {
clearInterval(intervalId)
ShaderHelper.clearAllEffect(showNode)
if (callback) {
callback()
}
if (callback) callback()
return
}
}
@@ -372,21 +342,15 @@ export default class ShaderHelper {
public static setFlag(
showNode: Node,
material: Material = ShaderMaterialPrefab.instance.getComponent(
ShaderMaterialPrefab
).flag
material: Material = ShaderMaterialPrefab.instance.getComponent(ShaderMaterialPrefab).flag,
) {
showNode
.getComponents(UIRenderer)
.forEach((renderComponent: UIRenderer) => {
showNode.getComponents(UIRenderer).forEach((renderComponent: UIRenderer) => {
renderComponent.setSharedMaterial(material, 0)
})
showNode.children.forEach((childNode) => {
childNode.getComponents(UIRenderer).forEach((renderComponent: UIRenderer) => {
renderComponent.setSharedMaterial(material, 0)
})
showNode.children.forEach((childNode) => {
childNode
.getComponents(UIRenderer)
.forEach((renderComponent: UIRenderer) => {
renderComponent.setSharedMaterial(material, 0)
})
})
}
@@ -397,32 +361,23 @@ export default class ShaderHelper {
*/
public static setGaussian(
showNode: Node,
material: Material = ShaderMaterialPrefab.instance.getComponent(
ShaderMaterialPrefab
).gaussian
material: Material = ShaderMaterialPrefab.instance.getComponent(ShaderMaterialPrefab).gaussian,
) {
showNode
.getComponents(UIRenderer)
.forEach((renderComponent: UIRenderer) => {
let tran = renderComponent.node.getComponent(UITransform)
showNode.getComponents(UIRenderer).forEach((renderComponent: UIRenderer) => {
const tran = renderComponent.node.getComponent(UITransform)
material.setProperty('textureSize', new Vec2(tran.contentSize.width, tran.contentSize.height))
renderComponent.setSharedMaterial(material, 0)
})
showNode.children.forEach((childNode) => {
childNode.getComponents(UIRenderer).forEach((renderComponent: UIRenderer) => {
const tran = renderComponent.node.getComponent(UITransform)
material.setProperty(
'textureSize',
new Vec2(tran.contentSize.width, tran.contentSize.height)
new Vec2(tran.contentSize.width, tran.contentSize.height),
)
renderComponent.setMaterial(material, 0)
// material.setProperty("textureSize", cc.v2(showNode.width, showNode.height));
renderComponent.setSharedMaterial(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)
})
})
}
}

View File

@@ -1,5 +1,7 @@
import { sys } from 'cc'
import ManifestConfig from '../config/ManifestConfig'
import EventManager from './EventManager'
import HotUpdate from './HotUpdate'
@@ -8,7 +10,7 @@ export default class VersionManager {
public static Config_Game_Name: Array<string> = ['游戏大厅']
//热更文件下载来后存放文件夹
// 热更文件下载来后存放文件夹
public static Config_Key: Array<string> = ['main-remote-asset']
private static Config_ManifestName: string = 'project.manifest'
@@ -18,10 +20,10 @@ export default class VersionManager {
public iosStoreUrl: string = ''
public apkStoreUrl: string = ''
public nowVersion: string = ManifestConfig.version //网页显示版本号,如果是热更会替换改值
public nowVersion: string = ManifestConfig.version // 网页显示版本号,如果是热更会替换改值
public targetVersion: string = '1.0.0'
public isOpenHotUpdate: boolean = true //是否打开热更
public isOpenHotUpdate: boolean = true // 是否打开热更
private hotUpdateList: Array<HotUpdate> = []
@@ -33,27 +35,21 @@ export default class VersionManager {
public reInitAll() {
this.releaseAll()
for (let i = 0; i < VersionManager.Config_Key.length; i++) {
this.reInit(i)
}
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()
}
}
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()
}
if (!this.hotUpdateList[index]) this.hotUpdateList[index] = new HotUpdate()
this.hotUpdateList[index].init(
index,
VersionManager.Config_Key[index],
VersionManager.Config_ManifestName
VersionManager.Config_ManifestName,
)
if (!this.isOpenHotUpdate) {
this.hotUpdateList[index].isCheck = true
@@ -63,15 +59,15 @@ export default class VersionManager {
public checkUpdate(keyIndex: number) {
if (keyIndex < this.hotUpdateList.length) {
let hotUpdate: HotUpdate = this.hotUpdateList[keyIndex]
const hotUpdate: HotUpdate = this.hotUpdateList[keyIndex]
if (sys.isNative) {
if (keyIndex == this.noUpdateIndex) {
//在大厅热更,不用子游戏热更了
if (keyIndex === this.noUpdateIndex) {
// 在大厅热更,不用子游戏热更了
hotUpdate.isCheck = true
hotUpdate.isFinishUpdate = true
EventManager.instance.dispatchEvent(
HotUpdate.Event_On_ALREADY_UP_TO_DATE,
VersionManager.Config_Key[keyIndex]
VersionManager.Config_Key[keyIndex],
)
} else {
hotUpdate.checkUpdate()
@@ -81,28 +77,27 @@ export default class VersionManager {
hotUpdate.isFinishUpdate = true
EventManager.instance.dispatchEvent(
HotUpdate.Event_On_ALREADY_UP_TO_DATE,
VersionManager.Config_Key[keyIndex]
VersionManager.Config_Key[keyIndex],
)
}
} else {
EventManager.instance.dispatchEvent(
HotUpdate.Event_On_ALREADY_UP_TO_DATE,
VersionManager.Config_Key[keyIndex]
VersionManager.Config_Key[keyIndex],
)
}
}
public startUpdate(keyIndex: number) {
let hotUpdate: HotUpdate = this.hotUpdateList[keyIndex]
const 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
}
const hotUpdate: HotUpdate = this.hotUpdateList[keyIndex]
if (keyIndex === this.noUpdateIndex) return true
return hotUpdate.isCheck
}
return true
@@ -110,10 +105,9 @@ export default class VersionManager {
public needUpdate(keyIndex: number) {
if (keyIndex < this.hotUpdateList.length) {
let hotUpdate: HotUpdate = this.hotUpdateList[keyIndex]
if (keyIndex == this.noUpdateIndex) {
return false
}
const hotUpdate: HotUpdate = this.hotUpdateList[keyIndex]
if (keyIndex === this.noUpdateIndex) return false
return hotUpdate.needUpdate
}
return false
@@ -121,7 +115,7 @@ export default class VersionManager {
public isUpdating(keyIndex: number) {
if (keyIndex < this.hotUpdateList.length) {
let hotUpdate: HotUpdate = this.hotUpdateList[keyIndex]
const hotUpdate: HotUpdate = this.hotUpdateList[keyIndex]
return hotUpdate.isUpdating
}
return false
@@ -129,10 +123,9 @@ export default class VersionManager {
public isFinishUpdate(keyIndex: number) {
if (keyIndex < this.hotUpdateList.length) {
let hotUpdate: HotUpdate = this.hotUpdateList[keyIndex]
if (keyIndex == this.noUpdateIndex) {
return true
}
const hotUpdate: HotUpdate = this.hotUpdateList[keyIndex]
if (keyIndex === this.noUpdateIndex) return true
return hotUpdate.isFinishUpdate
}
return true

View File

@@ -0,0 +1,6 @@
import { DEV } from 'cc/env'
export default {
url: () => (DEV ? 'https://fish.wanzhuanyongcheng.cn' : 'https://fish.jdt168.com'),
wsUrl: () => (DEV ? 'fish.wanzhuanyongcheng.cn' : 'fish.jdt168.com'),
}

View File

@@ -2,10 +2,8 @@
"ver": "4.0.23",
"importer": "typescript",
"imported": true,
"uuid": "71a46444-1a80-435f-b02e-0fe6acf71155",
"uuid": "f01978bd-5d14-49a6-bea7-4b7ad0c82b7b",
"files": [],
"subMetas": {},
"userData": {
"simulateGlobals": []
}
"userData": {}
}

View File

@@ -1,44 +1,86 @@
import { FishInfo } from './FishInfo'
import config from './Config'
export class FishConfig {
public static readonly config: ReadonlyArray<FishInfo> = [
new FishInfo(1, '蝴蝶鱼', 2, 2),
new FishInfo(2, '鲶鱼', 2, 1),
new FishInfo(3, '狮子鱼', 2, 2),
new FishInfo(4, '条纹鱼', 2, 2),
new FishInfo(5, '沙丁鱼', 2, 2),
new FishInfo(6, '石斑鱼', 2, 2),
new FishInfo(7, '河豚', 3, 1.2),
new FishInfo(8, '海螺', 3, 2),
new FishInfo(9, '接吻鱼', 3, 1.2),
new FishInfo(10, '海姆', 4, 1),
new FishInfo(11, '绿鳍鱼', 4, 1.2),
new FishInfo(12, '鲎', 4, 1.2),
new FishInfo(13, '魔鬼鱼', 5, 0.6),
new FishInfo(14, '小海龟', 5, 2),
new FishInfo(15, '锤头鲨', 6, 0.5),
new FishInfo(16, '金枪鱼', 6, 0.5),
new FishInfo(17, '大三元', 6, 0.5),
new FishInfo(18, '黄金鲎', 6, 1.2),
new FishInfo(19, '大四喜', 7, 0.5),
new FishInfo(20, '黄金锤头鲨', 7, 0.5),
new FishInfo(21, '金海姆', 7, 0.6),
new FishInfo(22, '五福临门', 8, 0.4),
new FishInfo(23, '金海龟', 8, 0.7),
new FishInfo(24, '金鲨', 8, 0.5),
new FishInfo(25, '蓝鲨', 8, 0.5),
new FishInfo(26, '美人鱼', 14, 0.4),
new FishInfo(27, '金龙', 14, 0.3),
new FishInfo(28, '章鱼', 10, 0.5),
new FishInfo(29, '电鳗鱼', 3, 0.8)
public static config: Array<FishInfo> = [
// new FishInfo(1, '蝴蝶鱼', 2, 2),
// new FishInfo(2, '鲶鱼', 2, 1),
// new FishInfo(3, '狮子鱼', 2, 2),
// new FishInfo(4, '条纹鱼', 2, 2),
// new FishInfo(5, '沙丁鱼', 2, 2),
// new FishInfo(6, '石斑鱼', 2, 2),
// new FishInfo(7, '河豚', 3, 1.2),
// new FishInfo(8, '海螺', 3, 2),
// new FishInfo(9, '接吻鱼', 3, 1.2),
// new FishInfo(10, '海姆', 4, 1),
// new FishInfo(11, '绿鳍鱼', 4, 1.2),
// new FishInfo(12, '鲎', 4, 1.2),
// new FishInfo(13, '魔鬼鱼', 5, 0.6),
// new FishInfo(14, '小海龟', 5, 2),
// new FishInfo(15, '锤头鲨', 6, 0.5),
// new FishInfo(16, '金枪鱼', 6, 0.5),
// new FishInfo(17, '大三元', 6, 0.5),
// new FishInfo(18, '黄金鲎', 6, 1.2),
// new FishInfo(19, '大四喜', 7, 0.5),
// new FishInfo(20, '黄金锤头鲨', 7, 0.5),
// new FishInfo(21, '金海姆', 7, 0.6),
// new FishInfo(22, '五福临门', 8, 0.4),
// new FishInfo(23, '金海龟', 8, 0.7),
// new FishInfo(24, '金鲨', 8, 0.5),
// new FishInfo(25, '蓝鲨', 8, 0.5),
// new FishInfo(26, '美人鱼', 14, 0.4),
// new FishInfo(27, '金龙', 14, 0.3),
// new FishInfo(28, '章鱼', 10, 0.5),
// new FishInfo(29, '电鳗鱼', 3, 0.8),
// new FishInfo(1, '蝴蝶鱼'),
// new FishInfo(2, '鲶鱼'),
// new FishInfo(3, '狮子鱼'),
// new FishInfo(4, '条纹鱼'),
// new FishInfo(5, '沙丁鱼'),
// new FishInfo(6, '石斑鱼'),
// new FishInfo(7, '河豚'),
// new FishInfo(8, '海螺'),
// new FishInfo(9, '接吻鱼'),
// new FishInfo(10, '海姆'),
// new FishInfo(11, '绿鳍鱼'),
// new FishInfo(12, '鲎'),
// new FishInfo(13, '魔鬼鱼'),
// new FishInfo(14, '小海龟'),
// new FishInfo(15, '锤头鲨'),
// new FishInfo(16, '金枪鱼'),
// new FishInfo(17, '大三元'),
// new FishInfo(18, '黄金鲎'),
// new FishInfo(19, '大四喜'),
// new FishInfo(20, '黄金锤头鲨'),
// new FishInfo(21, '金海姆'),
// new FishInfo(22, '五福临门'),
// new FishInfo(23, '金海龟'),
// new FishInfo(24, '金鲨'),
// new FishInfo(25, '蓝鲨'),
// new FishInfo(26, '美人鱼'),
// new FishInfo(27, '金龙'),
// new FishInfo(28, '章鱼'),
// new FishInfo(29, '电鳗鱼'),
]
public static async init() {
this.config = []
return new Promise<boolean>((resolve) => {
fetch(`${config.url()}/fish/list`)
.then((response) => response.text())
.then((response) => {
const { data: res } = JSON.parse(response)
res.data.forEach((item) => {
this.config.push(new FishInfo(item.ID, item.name, item.health))
})
resolve(true)
})
})
}
public static getFishInfoByType(fishType: number) {
for (let i = 0; i < this.config.length; i++) {
let fishInfo: FishInfo = this.config[i]
if (fishInfo.fishType == fishType) {
return fishInfo
}
const fishInfo: FishInfo = this.config[i]
if (fishInfo.fishType === fishType) return fishInfo
}
}
}

View File

@@ -2,17 +2,17 @@ export class FishInfo {
public fishType: number
public name: string
public blood: number
public wikiScale: number
// public wikiScale: number
constructor(
fishType: number,
name: string,
blood: number,
wikiScale: number
// wikiScale: number,
) {
this.fishType = fishType
this.name = name
this.blood = blood
this.wikiScale = wikiScale
// this.wikiScale = wikiScale
}
}

View File

@@ -1,17 +1,11 @@
export class FishMapInfo {
public fishType: number
public scale: number
public side: number //1: -1:
public side: number // 1: -1:
public x: number
public y: number
constructor(
fishType: number,
scale: number,
side: number,
x: number,
y: number
) {
constructor(fishType: number, scale: number, side: number, x: number, y: number) {
this.fishType = fishType
this.scale = scale
this.side = side

View File

@@ -1,8 +1,10 @@
import { Vec2 } from 'cc'
import { FishPathInfo } from './FishPathInfo'
import RandomUtil from '../../engine/utils/RandomUtil'
import { FishMapInfo } from './FishMapInfo'
import { FishMap } from './FishMap'
import { FishMapInfo } from './FishMapInfo'
import { FishPathInfo } from './FishPathInfo'
export class FishPathConfig {
private static mapConfig: Array<Array<Array<number>>> = [
@@ -90,7 +92,7 @@ export class FishPathConfig {
[1, 1, 1, 754, -7],
[1, 1, 1, 671, 26],
[1, 1, 1, 630, 59],
[1, 1, 1, 584, 80]
[1, 1, 1, 584, 80],
],
[
[2, 1, 1, -784, 353],
@@ -135,7 +137,7 @@ export class FishPathConfig {
[3, 1, 1, 523, -253],
[3, 1, 1, 172, 128],
[3, 1, 1, -357, 30],
[3, 1, 1, 582, 23]
[3, 1, 1, 582, 23],
],
[
[5, 1, 1, -888, 405],
@@ -191,7 +193,7 @@ export class FishPathConfig {
[7, 1, 1, 340, -259],
[7, 1, 1, 485, -254],
[7, 1, 1, 622, -254],
[7, 1, 1, 816, -251]
[7, 1, 1, 816, -251],
],
[
[9, 1, 1, -513, 150],
@@ -222,7 +224,7 @@ export class FishPathConfig {
[9, 1, 1, 865, 195],
[9, 1, 1, 665, 207],
[17, 1, 1, -461, 2],
[17, 1, 1, 515, -49]
[17, 1, 1, 515, -49],
],
[
[19, 1, 1, -785, 31],
@@ -234,7 +236,7 @@ export class FishPathConfig {
[20, 1, 1, 425, -301],
[20, 1, 1, 537, 265],
[20, 1, 1, -604, 317],
[20, 1, 1, -634, -285]
[20, 1, 1, -634, -285],
],
[
[21, 1, 1, -757, 94],
@@ -245,12 +247,12 @@ export class FishPathConfig {
[21, 1, 1, -437, 300],
[21, 1, 1, -434, -155],
[21, 1, 1, 314, -154],
[21, 1, 1, 435, 249]
[21, 1, 1, 435, 249],
],
[
[22, 1, 1, -548, 65],
[22, 1, 1, 747, 61],
[22, 1, 1, 95, 63]
[22, 1, 1, 95, 63],
],
[
[23, 1, 1, -431, 384],
@@ -262,7 +264,7 @@ export class FishPathConfig {
[23, 1, 1, 1025, 60],
[23, 1, 1, 677, -247],
[23, 1, 1, 104, 390],
[23, 1, 1, 84, -265]
[23, 1, 1, 84, -265],
],
[
[24, 1, 1, -429, 353],
@@ -271,7 +273,7 @@ export class FishPathConfig {
[24, 1, 1, -27, 35],
[24, 1, 1, 563, 39],
[24, 1, 1, -268, -245],
[24, 1, 1, 172, -260]
[24, 1, 1, 172, -260],
],
[
[25, 1, 1, -595, 276],
@@ -279,27 +281,27 @@ export class FishPathConfig {
[25, 1, 1, -192, -64],
[25, 1, 1, 464, -46],
[25, 1, 1, 191, -280],
[25, 1, 1, 884, -319]
[25, 1, 1, 884, -319],
],
[
[26, 1, 1, -681, 441],
[26, 1, 1, 685, 426],
[26, 1, 1, -46, 140],
[26, 1, 1, -494, -207],
[26, 1, 1, 497, -238]
[26, 1, 1, 497, -238],
],
[
[27, 1, 1, -431, 345],
[27, 1, 1, 569, 311],
[27, 1, 1, 112, -12],
[27, 1, 1, -298, -271],
[27, 1, 1, 678, -244]
[27, 1, 1, 678, -244],
],
[
[28, 1, 1, -454, 8],
[28, 1, 1, 597, 1],
[28, 1, 1, 46, 431],
[28, 1, 1, 44, -227]
[28, 1, 1, 44, -227],
],
[
[2, 1, 1, -557, 409],
@@ -345,9 +347,10 @@ export class FishPathConfig {
[5, 1, 1, 407, -178],
[5, 1, 1, 297, 8],
[5, 1, 1, 625, 48],
[5, 1, 1, 379, 92]
]
[5, 1, 1, 379, 92],
],
]
private static formatMapConfig: Array<FishMap> = []
private static config: Array<Array<Array<number>>> = [
// 左边开始
@@ -368,7 +371,7 @@ export class FishPathConfig {
[627, -511],
[762, -578],
[885, -667],
[1068, -773]
[1068, -773],
],
[
[-1295, 534],
@@ -385,7 +388,7 @@ export class FishPathConfig {
[753, 233],
[936, 279],
[1182, 350],
[1314, 418]
[1314, 418],
],
[
[-1295, 534],
@@ -402,7 +405,7 @@ export class FishPathConfig {
[827, -42],
[1020, -131],
[1189, -170],
[1309, -198]
[1309, -198],
],
[
[-1295, 534],
@@ -419,7 +422,7 @@ export class FishPathConfig {
[835, 88],
[1013, -2],
[1212, -99],
[1309, -198]
[1309, -198],
],
[
[-1275, -118],
@@ -436,7 +439,7 @@ export class FishPathConfig {
[772, 391],
[887, 426],
[1066, 513],
[1164, 710]
[1164, 710],
],
[
[-1299, -618],
@@ -453,7 +456,7 @@ export class FishPathConfig {
[904, 176],
[1090, 273],
[1208, 355],
[1308, 435]
[1308, 435],
],
[
[-1275, -118],
@@ -470,7 +473,7 @@ export class FishPathConfig {
[784, 266],
[935, 228],
[1157, 174],
[1329, 163]
[1329, 163],
],
[
[-1288, -220],
@@ -487,7 +490,7 @@ export class FishPathConfig {
[851, 203],
[1050, 141],
[1255, 58],
[1326, 20]
[1326, 20],
],
[
[-1288, -220],
@@ -504,7 +507,7 @@ export class FishPathConfig {
[993, -283],
[1090, -319],
[1242, -341],
[1329, -396]
[1329, -396],
],
[
[-1288, -220],
@@ -521,7 +524,7 @@ export class FishPathConfig {
[1011, -407],
[1095, -418],
[1238, -539],
[1317, -663]
[1317, -663],
],
[
[-1314, -508],
@@ -540,7 +543,7 @@ export class FishPathConfig {
[1093, 280],
[1026, 371],
[868, 631],
[648, 787]
[648, 787],
],
[
[-1314, -508],
@@ -559,7 +562,7 @@ export class FishPathConfig {
[1093, 280],
[1026, 371],
[868, 631],
[648, 787]
[648, 787],
],
[
[-1314, -508],
@@ -576,9 +579,9 @@ export class FishPathConfig {
[872, -200],
[1060, -391],
[1150, -492],
[1301, -461]
[1301, -461],
],
//右边开始
// 右边开始
[
[1286, -293],
[1149, -184],
@@ -588,7 +591,7 @@ export class FishPathConfig {
[476, 57],
[467, 300],
[408, 500],
[405, 701]
[405, 701],
],
[
[1345, 34],
@@ -599,7 +602,7 @@ export class FishPathConfig {
[267, -29],
[66, -79],
[-219, -287],
[-271, -693]
[-271, -693],
],
[
[1345, 34],
@@ -614,7 +617,7 @@ export class FishPathConfig {
[-725, -92],
[-963, -68],
[-1169, -46],
[-1325, -40]
[-1325, -40],
],
[
[1345, 34],
@@ -629,7 +632,7 @@ export class FishPathConfig {
[-719, -199],
[-981, -264],
[-1180, -291],
[-1320, -367]
[-1320, -367],
],
[
[1345, 34],
@@ -644,7 +647,7 @@ export class FishPathConfig {
[-707, -320],
[-961, -408],
[-1160, -449],
[-1309, -524]
[-1309, -524],
],
[
[1345, 34],
@@ -659,7 +662,7 @@ export class FishPathConfig {
[-596, -448],
[-847, -604],
[-1019, -589],
[-1241, -695]
[-1241, -695],
],
[
[1345, 34],
@@ -674,7 +677,7 @@ export class FishPathConfig {
[-898, 66],
[-1070, 219],
[-1181, 292],
[-1289, 558]
[-1289, 558],
],
[
[1345, 34],
@@ -689,7 +692,7 @@ export class FishPathConfig {
[-806, 84],
[-905, 246],
[-1008, 375],
[-1021, 750]
[-1021, 750],
],
[
[1297, 542],
@@ -704,7 +707,7 @@ export class FishPathConfig {
[-806, 84],
[-905, 246],
[-1008, 375],
[-1021, 750]
[-1021, 750],
],
[
[1297, 542],
@@ -719,7 +722,7 @@ export class FishPathConfig {
[-806, 84],
[-927, 189],
[-1073, 291],
[-1318, 474]
[-1318, 474],
],
[
[1297, 542],
@@ -734,7 +737,7 @@ export class FishPathConfig {
[-775, -77],
[-923, -28],
[-1133, -46],
[-1294, -10]
[-1294, -10],
],
[
[1297, 542],
@@ -749,7 +752,7 @@ export class FishPathConfig {
[-616, -254],
[-854, -240],
[-1115, -272],
[-1312, -336]
[-1312, -336],
],
[
[1297, 542],
@@ -764,7 +767,7 @@ export class FishPathConfig {
[-562, -321],
[-647, -446],
[-930, -540],
[-1073, -726]
[-1073, -726],
],
[
[1293, -558],
@@ -779,7 +782,7 @@ export class FishPathConfig {
[-562, -321],
[-647, -446],
[-930, -540],
[-1073, -726]
[-1073, -726],
],
[
[1293, -558],
@@ -794,7 +797,7 @@ export class FishPathConfig {
[-568, -262],
[-857, -301],
[-1055, -406],
[-1353, -380]
[-1353, -380],
],
[
[1293, -558],
@@ -809,7 +812,7 @@ export class FishPathConfig {
[-590, -195],
[-905, -120],
[-1100, -72],
[-1300, 225]
[-1300, 225],
],
[
[1293, -558],
@@ -824,7 +827,7 @@ export class FishPathConfig {
[-633, -130],
[-917, 33],
[-1079, 184],
[-1220, 412]
[-1220, 412],
],
[
[1293, -558],
@@ -839,9 +842,9 @@ export class FishPathConfig {
[-602, -25],
[-857, 181],
[-921, 416],
[-909, 805]
[-909, 805],
],
//下往上
// 下往上
[
[-279, -786],
[-92, -667],
@@ -855,7 +858,7 @@ export class FishPathConfig {
[-602, -25],
[-857, 181],
[-921, 416],
[-909, 805]
[-909, 805],
],
[
[-279, -786],
@@ -870,7 +873,7 @@ export class FishPathConfig {
[-362, 152],
[-543, 358],
[-721, 502],
[-401, 770]
[-401, 770],
],
[
[-279, -786],
@@ -885,7 +888,7 @@ export class FishPathConfig {
[60, 214],
[-85, 418],
[-140, 630],
[-401, 770]
[-401, 770],
],
[
[-279, -786],
@@ -900,7 +903,7 @@ export class FishPathConfig {
[253, 319],
[330, 465],
[544, 684],
[858, 803]
[858, 803],
],
[
[841, -837],
@@ -915,9 +918,10 @@ export class FishPathConfig {
[253, 319],
[330, 465],
[544, 684],
[858, 803]
]
[858, 803],
],
]
private static formatConfig: Array<FishPathInfo> = []
public static init() {
@@ -928,70 +932,60 @@ export class FishPathConfig {
private static initMapConfig() {
this.formatMapConfig = []
for (let i = 0; i < this.mapConfig.length; i++) {
let arr: Array<Array<number>> = this.mapConfig[i]
let fishMapInfoList: Array<FishMapInfo> = []
const arr: Array<Array<number>> = this.mapConfig[i]
const fishMapInfoList: Array<FishMapInfo> = []
for (let j = 0; j < arr.length; j++) {
let temp: Array<number> = arr[j]
let fishMapInfo: FishMapInfo = new FishMapInfo(
const temp: Array<number> = arr[j]
const fishMapInfo: FishMapInfo = new FishMapInfo(
temp[0],
temp[1],
temp[2],
temp[3],
temp[4]
temp[4],
)
fishMapInfoList.push(fishMapInfo)
}
let fishMap: FishMap = new FishMap(i, fishMapInfoList)
const fishMap: FishMap = new FishMap(i, fishMapInfoList)
this.formatMapConfig.push(fishMap)
// console.log('this.formatMapConfig ', this.formatMapConfig)
}
}
public static randomFishMap() {
let randomIndex: number = RandomUtil.nextInt(
0,
this.formatMapConfig.length - 1
)
let map: FishMap = this.formatMapConfig[randomIndex]
return map
const randomIndex: number = RandomUtil.nextInt(0, this.formatMapConfig.length - 1)
return this.formatMapConfig[randomIndex]
}
private static initNormalConfig() {
this.formatConfig = []
let pathId: number = 1
for (let i = 0; i < this.config.length; i++) {
let path: Array<Vec2> = []
let flipXPath: Array<Vec2> = []
let flipYPath: Array<Vec2> = []
const path: Array<Vec2> = []
const flipXPath: Array<Vec2> = []
const flipYPath: Array<Vec2> = []
for (let j = 0; j < this.config[i].length; j++) {
let p: Vec2 = new Vec2(this.config[i][j][0], this.config[i][j][1])
const p: Vec2 = new Vec2(this.config[i][j][0], this.config[i][j][1])
path.push(p)
let flipXP: Vec2 = new Vec2(-p.x, p.y)
let flipYP: Vec2 = new Vec2(p.x, -p.y)
const flipXP: Vec2 = new Vec2(-p.x, p.y)
const flipYP: Vec2 = new Vec2(p.x, -p.y)
flipXPath.push(flipXP)
flipYPath.push(flipYP)
}
this.formatConfig.push(new FishPathInfo(pathId++, path))
this.formatConfig.push(new FishPathInfo(pathId++, flipXPath))
this.formatConfig.push(new FishPathInfo(pathId++, flipYPath))
this.formatConfig.push(new FishPathInfo(pathId, path))
this.formatConfig.push(new FishPathInfo(pathId, flipXPath))
this.formatConfig.push(new FishPathInfo(pathId, flipYPath))
}
}
public static getPathInfo(pathId: number) {
for (let i = 0; i < this.formatConfig.length; i++) {
let pathInfo: FishPathInfo = this.formatConfig[i]
if (pathInfo.pathId == pathId) {
return pathInfo
}
const pathInfo: FishPathInfo = this.formatConfig[i]
if (pathInfo.pathId === pathId) return pathInfo
}
}
public static randomPathInfo() {
let randomIndex: number = RandomUtil.nextInt(
0,
this.formatConfig.length - 1
)
// let randomIndex: number = 0
let pathInfo: FishPathInfo = this.formatConfig[randomIndex]
return pathInfo
const randomIndex: number = RandomUtil.nextInt(0, this.formatConfig.length - 1)
return this.formatConfig[randomIndex]
}
}

View File

@@ -1,10 +1,10 @@
import { Vec2 } from 'cc'
export class FishPathInfo {
public pathId: number
public pathId: string
public path: Array<Vec2> = []
constructor(pathId: number, path: Array<Vec2>) {
constructor(pathId: string, path: Array<Vec2>) {
this.pathId = pathId
this.path = path
}

View File

@@ -1,2 +0,0 @@
export default class GameEvent {
}

View File

@@ -1,32 +1,39 @@
import {
_decorator,
Component,
EventTouch,
instantiate,
Node,
NodePool,
Prefab,
sys,
UITransform,
Vec2,
Vec3
Vec3,
_decorator,
instantiate,
sys,
} from 'cc'
import FishBulletBase from '../../../fish/script/FishBulletBase'
import MathUtils from '../../engine/utils/MathUtils'
import CannonManager from './CannonManager'
import { MoveHelper } from '../../engine/utils/MoveHelper'
import FishNetManager from './FishNetManager'
import GameMusicHelper from '../utils/GameMusicHelper'
import FishUI from '../../../fish/script/FishUI'
import CommonTips from '../../engine/uicomponent/CommonTips'
import MathUtils from '../../engine/utils/MathUtils'
import { MoveHelper } from '../../engine/utils/MoveHelper'
import GameMusicHelper from '../utils/GameMusicHelper'
import CannonManager from './CannonManager'
import FishNetManager from './FishNetManager'
import WsManager from './WsManager'
const { ccclass, property } = _decorator
// 子弹管理类
@ccclass('BulletManager')
export default class BulletManager extends Component {
public static instance: BulletManager = null
@property({ type: [Prefab] })
private bulletPrefabList: Prefab[] | [] = []
private bulletPool: Array<NodePool> = []
private bulletList: Array<FishBulletBase> = []
private bulletMoveSpeed: number = 30
@@ -40,24 +47,23 @@ export default class BulletManager extends Component {
this._vec2Cache = new Vec2()
BulletManager.instance = this
this.node.on(Node.EventType.TOUCH_START, this.onShootBullet, this)
// this.node.on(Node.EventType.TOUCH_MOVE, this.onShootBullet, this)
}
start() {
}
start() {}
update() {
this.checkMoveBullet()
}
// 检测子弹是否移动完成
private checkMoveBullet() {
for (let i = this.bulletList.length - 1; i >= 0; i--) {
let bullet: FishBulletBase = this.bulletList[i]
let isMoving: boolean = MoveHelper.moveNode(
const bullet: FishBulletBase = this.bulletList[i]
const isMoving: boolean = MoveHelper.moveNode(
bullet.node,
this.bulletMoveSpeed,
bullet.targetP.x,
bullet.targetP.y
bullet.targetP.y,
)
if (!isMoving) {
bullet.node.getPosition(this._vec3Cache)
@@ -70,38 +76,31 @@ export default class BulletManager extends Component {
}
}
// 发射炮弹
private onShootBullet(event: EventTouch) {
//TOUCH_START 在Editor上连续触发2次导致发2次炮弹bug
if (sys.platform == 'EDITOR_PAGE') {
// TOUCH_START 在Editor上连续触发2次导致发2次炮弹bug
if (sys.platform === 'EDITOR_PAGE') {
this._fireTimeNew = new Date().getTime()
if (this._fireTimeNew - this._fireTime < 100) {
return
}
if (this._fireTimeNew - this._fireTime < 15000) return
this._fireTime = this._fireTimeNew
}
let tran = this.node.getComponent(UITransform)
let location = event.getUILocation()
const tran = this.node.getComponent(UITransform)
const location = event.getUILocation()
this._vec3Cache.x = location.x
this._vec3Cache.y = location.y
this._vec3Cache.z = 0
tran.convertToNodeSpaceAR(this._vec3Cache, this._vec3Cache)
let localP: Vec2 = new Vec2(this._vec3Cache.x, this._vec3Cache.y)
const localP: Vec2 = new Vec2(this._vec3Cache.x, this._vec3Cache.y)
FishUI.instance.playClickEffect(localP)
// 子弹发射
if (FishUI.instance.dz_score >= CannonManager.instance.cannonType) {
FishUI.instance.dz_score -= CannonManager.instance.cannonType
FishUI.instance.refreshScore()
// FishUI.instance.refreshScore()
this._vec3Cache = CannonManager.instance.getCannonPosition()
let rad: number = MathUtils.p2pRad(
new Vec2(this._vec3Cache.x, this._vec3Cache.y),
localP
)
let rot: number = MathUtils.radiansToDegrees(rad)
let bullet: FishBulletBase = this.createBullet(
CannonManager.instance.cannonType - 1
)
const rad: number = MathUtils.p2pRad(new Vec2(this._vec3Cache.x, this._vec3Cache.y), localP)
const rot: number = MathUtils.radiansToDegrees(rad)
const bullet: FishBulletBase = this.createBullet(CannonManager.instance.cannonType - 1)
bullet.targetP = localP
this.node.addChild(bullet.node)
bullet.node.setPosition(CannonManager.instance.getCannonPosition())
@@ -113,14 +112,14 @@ export default class BulletManager extends Component {
bullet.node.angle = rot
this.bulletList.push(bullet)
GameMusicHelper.playFire()
//旋转炮台
// 旋转炮台
CannonManager.instance.rotateCannon(location)
} else {
CommonTips.showMsg('豆子不足!')
}
}
// 创建子弹
private createBullet(bulletType: number) {
let bulletNode: Node
if (this.bulletPool[bulletType] && this.bulletPool[bulletType].size() > 0) {
@@ -133,23 +132,21 @@ export default class BulletManager extends Component {
}
public killBullet(bullet: FishBulletBase) {
let index: number = this.bulletList.indexOf(bullet)
const index: number = this.bulletList.indexOf(bullet)
if (index >= 0) {
this.bulletList.splice(index, 1)
this.destroyBullet(bullet)
}
}
// 销毁子弹
private destroyBullet(bullet: FishBulletBase) {
//临时代码,因为回收在内存卡顿。后面在优化 2023-2-10
if (sys.platform == 'EDITOR_PAGE') {
// 临时代码,因为回收在内存卡顿。后面在优化 2023-2-10
if (sys.platform === 'EDITOR_PAGE') {
bullet.node.destroy()
return
}
if (!this.bulletPool[bullet.bulletType]) {
this.bulletPool[bullet.bulletType] = new NodePool()
}
if (!this.bulletPool[bullet.bulletType]) this.bulletPool[bullet.bulletType] = new NodePool()
this.bulletPool[bullet.bulletType].put(bullet.node)
}

View File

@@ -1,15 +1,29 @@
import { _decorator, Component, EventMouse, Node, Sprite, SpriteFrame, UITransform, Vec2, Vec3 } from 'cc'
import {
Component,
EventMouse,
Node,
Sprite,
SpriteFrame,
UITransform,
Vec2,
Vec3,
_decorator,
} from 'cc'
import MathUtils from '../../engine/utils/MathUtils'
const { ccclass, property } = _decorator
// 炮塔管理类
@ccclass('CannonManager')
export default class CannonManager extends Component {
public static instance: CannonManager = null
@property({ type: Node })
private view: Node | null = null
@property({ type: [SpriteFrame] })
private cannonSpriteFrame: Array<SpriteFrame> | [] = []
// 炮塔倍数
public cannonType: number = 1
private _vec3Cache: Vec3
@@ -21,33 +35,33 @@ export default class CannonManager extends Component {
this.refreshCannon()
}
// 炮塔移动
private onMeMove(event: EventMouse) {
this.rotateCannon(event.getUILocation())
}
// 炮塔旋转
public rotateCannon(uilocation: Vec2) {
let location = uilocation
const location = uilocation
this._vec3Cache.x = location.x
this._vec3Cache.y = location.y
this._vec3Cache.z = 0
let tran = this.node.getComponent(UITransform)
const tran = this.node.getComponent(UITransform)
tran.convertToNodeSpaceAR(this._vec3Cache, this._vec3Cache)
let localTouch: Vec2 = new Vec2(this._vec3Cache.x, this._vec3Cache.y)
const localTouch: Vec2 = new Vec2(this._vec3Cache.x, this._vec3Cache.y)
this.view.getPosition(this._vec3Cache)
let rad: number = MathUtils.p2pRad(
new Vec2(this._vec3Cache.x, this._vec3Cache.y),
localTouch
)
let rot: number = MathUtils.radiansToDegrees(rad)
const rad: number = MathUtils.p2pRad(new Vec2(this._vec3Cache.x, this._vec3Cache.y), localTouch)
const rot: number = MathUtils.radiansToDegrees(rad)
this.view.angle = rot - 90
}
// 刷新炮塔
public refreshCannon() {
this.view.getComponent(Sprite).spriteFrame =
this.cannonSpriteFrame[this.cannonType - 1]
this.view.getComponent(Sprite).spriteFrame = this.cannonSpriteFrame[this.cannonType - 1]
}
// 获取炮塔位置
public getCannonPosition() {
return this.view.getPosition()
}

View File

@@ -1,210 +1,272 @@
import { _decorator, Animation, Component, game, instantiate, Node, NodePool, Prefab, Vec2, Vec3 } from 'cc'
import RandomUtil from '../../engine/utils/RandomUtil'
import {
Animation,
Component,
Node,
NodePool,
Prefab,
Tween,
Vec2,
Vec3,
_decorator,
game,
instantiate,
tween,
} from 'cc'
import FishBase from '../../../fish/script/FishBase'
import { FishPathConfig } from '../config/FishPathConfig'
import FishMover from '../../../fish/script/FishMover'
import FishUI from '../../../fish/script/FishUI'
import { Logger } from '../../engine/utils/Logger'
import { FishInfo } from '../config/FishInfo'
import RandomUtil from '../../engine/utils/RandomUtil'
import { FishConfig } from '../config/FishConfig'
import GameMusicHelper from '../utils/GameMusicHelper'
import ScoreManager from './ScoreManager'
import { FishInfo } from '../config/FishInfo'
import { FishMap } from '../config/FishMap'
import { FishMapInfo } from '../config/FishMapInfo'
import FishUI from '../../../fish/script/FishUI'
import { FishPathConfig } from '../config/FishPathConfig'
import GameMusicHelper from '../utils/GameMusicHelper'
import TimeHelper from '../utils/TimeHelper'
import ScoreManager from './ScoreManager'
import WsManager from './WsManager'
import { FishPathInfo } from '../config/FishPathInfo'
const { ccclass, property } = _decorator
interface dataType {
fisn: Array<FishType>
}
interface FishType {
fishId: string
fishInfo: FishInfo
fishType: string
isDead: number
fishPathInfo: Array<fishPathInfoType>
}
interface fishPathInfoType {
pathId: string
path: Array<PathPoint>
}
interface PathPoint {
x: number
y: number
}
// 鱼管理类
@ccclass('FishManager')
export default class FishManager extends Component {
public static instance: FishManager = null
@property({ type: Node })
private fishContainer: Node | null = null
@property({ type: [Prefab] })
public fishPrefabList: Array<Prefab> = []
private fishPool: Array<NodePool> = []
private fishList: Array<FishBase> = []
private fishList: Map<string, FishBase> = new Map()
private nextRandomFishTime: number = 0
private minRandomTime: number = 2 * (game.frameRate as number)
private maxRandomTime: number = 5 * (game.frameRate as number)
private isFishMap: boolean = false
private mapCount: number = 0
private minMapCount: number = 30 * (game.frameRate as number)
private maxMapCount: number = 60 * (game.frameRate as number)
// // private minMapCount: number = 2 * cc.game.getFrameRate();
// // private maxMapCount: number = 5 * cc.game.getFrameRate();
private _fishPosCache: Vec3
onLoad() {
WsManager.instance.on(100, this.randomFish, this)
FishManager.instance = this
this._fishPosCache = new Vec3()
Logger.log(
'maxRandomTime=',
this.minRandomTime,
this.maxRandomTime,
game.frameRate
)
Logger.log('maxRandomTime=', this.minRandomTime, this.maxRandomTime, game.frameRate)
}
start() {
this.randomFish()
// this.randomFish()
}
update() {
this.checkRandomFish()
// this.checkRandomFish()
this.checkFishMoveEnd()
this.checkFishMap()
// this.checkFishMap()
}
private checkFishMap() {
if (!this.isFishMap) {
if (this.mapCount > 0) {
this.mapCount--
if (this.mapCount <= 0) {
FishUI.instance.playWaveEffect()
}
if (this.mapCount <= 0) FishUI.instance.playWaveEffect()
}
}
}
// 检测是否随机鱼
private checkRandomFish() {
if (!this.isFishMap) {
if (this.nextRandomFishTime > 0) {
this.nextRandomFishTime--
if (this.nextRandomFishTime == 0) {
this.randomFish()
}
// if (this.nextRandomFishTime === 0) this.randomFish()
}
}
}
// 检测鱼是否移动结束
private checkFishMoveEnd() {
for (let i = this.fishList.length - 1; i >= 0; i--) {
let fish: FishBase = this.fishList[i]
this.fishList.forEach(async (item: FishBase, key: string) => {
if (this.isFishMap) {
if (!fish.isDead) {
fish.node.getPosition(this._fishPosCache)
// 鱼阵回收
if (item.isDead === 2) {
item.node.getPosition(this._fishPosCache)
this._fishPosCache.x -= 2
fish.node.setPosition(this._fishPosCache)
item.node.setPosition(this._fishPosCache)
if (this._fishPosCache.x <= -screen.width / 2) {
//winSize.width
this.destroyFish(fish)
this.fishList.splice(i, 1)
// winSize.width
await WsManager.instance.onSend({
type: 102,
fish_id: item.fishId,
})
// this.fishList.splice(index, 1)
this.destroyFish(item)
// this.fishList.delete(item.fishId)
this.checkEndFishMap()
}
}
} else if (!fish.getComponent(FishMover).isMoving) {
this.destroyFish(fish)
this.fishList.splice(i, 1)
} else if (!item.getComponent(FishMover).isMoving) {
// 普通鱼回收
await WsManager.instance.onSend({
type: 102,
fish_id: item.fishId,
})
// this.fishList.splice(index, 1)
this.destroyFish(item)
// this.fishList.delete(item.fishId)
}
}
})
}
private checkEndFishMap() {
Logger.log('checkEndFishMap==', this.isFishMap, this.fishList)
if (this.isFishMap && this.fishList.length <= 0) {
// Logger.log('checkEndFishMap==', this.isFishMap, this.fishList)
if (this.isFishMap && this.fishList.size <= 0) {
this.isFishMap = false
this.randomFish()
// this.randomFish()
}
}
private randomFish() {
if (this.isFishMap) return
let randomNum: number = RandomUtil.nextInt(1, 10)
// let randomNum: number = RandomUtil.nextInt(1, 1);
for (let i = 0; i < randomNum; i++) {
let fishType: number = RandomUtil.nextInt(1, 29)
// let fishType: number = RandomUtil.nextInt(1, 1);
let fish: FishBase = this.createFishByType(fishType)
fish.fishPathInfo = FishPathConfig.randomPathInfo()
/**
* 原:本地随机生成鱼
* 新:服务端生成鱼
*/
private async randomFish(data: dataType) {
const arr = data.fisn
const paths: Array<FishPathInfo> = []
if (!Array.isArray(arr) || this.isFishMap) return
for (let i = 0; i < arr.length; i++) {
const fish: FishBase = this.createFishByType(arr[i])
for (let k = 0; k < arr[i].fishPathInfo.length; k++) {
const path: Array<Vec2> = []
for (let j = 0; j < arr[i].fishPathInfo[k].path.length; j++) {
const p: Vec2 = new Vec2(
arr[i].fishPathInfo[k].path[j].x,
arr[i].fishPathInfo[k].path[j].y,
)
path.push(p)
}
paths.push(new FishPathInfo(arr[i].fishPathInfo[k].pathId, path))
}
fish.fishPathInfo = paths[0]
this._fishPosCache.z = 0
this._fishPosCache.x = fish.fishPathInfo.path[0].x
this._fishPosCache.y = fish.fishPathInfo.path[0].y
fish.node.setPosition(this._fishPosCache)
fish.getComponent(FishMover).bezierPList = fish.fishPathInfo.path
fish.getComponent(FishMover).startMove()
this.fishList.push(fish)
this.fishContainer.addChild(fish.node)
}
Logger.log('checkFishMoveEnd=randomFish=', this.fishList)
this.nextRandomFishTime = RandomUtil.nextInt(
this.minRandomTime,
this.maxRandomTime
)
if (this.mapCount <= 0) {
this.mapCount = RandomUtil.nextInt(this.minMapCount, this.maxMapCount)
// this.fishList.push(fish)
this.fishList.set(fish.fishId, fish)
// this.fishContainer.addChild(fish.node)
this.fishContainer.addChild(this.fishList.get(fish.fishId).node)
}
}
public createFishByType(fishType: number): FishBase {
// 创建鱼类
public createFishByType(data: FishType | any): FishBase {
let fishNode: Node
const fishType: number = Number(data.fishType)
if (this.fishPool[fishType - 1] && this.fishPool[fishType - 1].size() > 0) {
fishNode = this.fishPool[fishType - 1].get()
} else {
fishNode = instantiate(this.fishPrefabList[fishType - 1])
}
//fishNode.getComponent(Animation).play() //v3 当前帧 不能播放
TimeHelper.exeNextFrame(fishNode, () =>
fishNode.getComponent(Animation).play()
)
let fishInfo: FishInfo = FishConfig.getFishInfoByType(fishType)
TimeHelper.exeNextFrame(fishNode, () => fishNode.getComponent(Animation).play())
const fishInfo: FishInfo = FishConfig.getFishInfoByType(fishType)
fishNode.getComponent(FishBase).fishInfo = fishInfo
fishNode.getComponent(FishBase).fishType = fishType
fishNode.getComponent(FishBase).blood = fishInfo.blood
fishNode.getComponent(FishBase).isDead = false
fishNode.getComponent(FishBase).fishId = data.fishId
fishNode.getComponent(FishBase).isDead = 2
return fishNode.getComponent(FishBase)
}
public killFish(fish: FishBase) {
let index: number = this.fishList.indexOf(fish)
if (index >= 0) {
// console.log("鱼挂了")
GameMusicHelper.playFishDead(fish.fishType)
fish.node.getPosition(this._fishPosCache)
let vec2 = new Vec2(this._fishPosCache.x, this._fishPosCache.y)
ScoreManager.instance.addScore(fish.fishInfo.blood, vec2)
this.fishList.splice(index, 1)
this.destroyFish(fish)
this.checkEndFishMap()
// 销毁鱼类
public killFish(res: any) {
const fishCheck = this.fishList.get(res.fish_id)
// console.log('正在执行销毁=', fishCheck.fishId, res.fish_id, res.fish_status, fishCheck.isDead)
if (fishCheck) {
fishCheck.isDead = 1
setTimeout(() => {
GameMusicHelper.playFishDead(fishCheck.fishType)
fishCheck.node.getPosition(this._fishPosCache)
const vec2 = new Vec2(this._fishPosCache.x, this._fishPosCache.y)
ScoreManager.instance.addScore(Number(res.fish_number), vec2)
this.destroyFish(fishCheck)
// console.log('killFish=', fishCheck.fishId, fishCheck.fishInfo.name)
this.checkEndFishMap()
}, 500)
tween(fishCheck.node)
.repeatForever(tween().by(0.6, { angle: -360 }))
.start()
// this.fishList.splice(index, 1)
}
}
private destroyFish(fish: FishBase) {
if (!this.fishPool[fish.fishType - 1]) {
this.fishPool[fish.fishType - 1] = new NodePool()
const f = this.fishList.get(fish.fishId)
if (!f) return
if (!this.fishPool[f.fishType - 1]) {
this.fishPool[f.fishType - 1] = new NodePool()
}
this.fishPool[fish.fishType - 1].put(fish.node)
this.fishPool[f.fishType - 1].put(f.node)
this.fishList.delete(f.fishId)
}
public playFishMap() {
this.isFishMap = true
for (let i = this.fishList.length - 1; i >= 0; i--) {
let fish: FishBase = this.fishList[i]
this.fishList.forEach((fish: FishBase, key: string) => {
this.destroyFish(fish)
this.fishList.splice(i, 1)
}
})
}
public startFishMap() {
// this.playFishMap();
// this.fishList = [];
let map: FishMap = FishPathConfig.randomFishMap()
let fishMapInfoList: Array<FishMapInfo> = map.fishMapInfoList
const map: FishMap = FishPathConfig.randomFishMap()
const fishMapInfoList: Array<FishMapInfo> = map.fishMapInfoList
Logger.log('startFishMap==', this.isFishMap, this.fishList, map)
for (let i = 0; i < fishMapInfoList.length; i++) {
let fishMapInfo: FishMapInfo = fishMapInfoList[i]
let fish: FishBase = this.createFishByType(fishMapInfo.fishType)
const fishMapInfo: FishMapInfo = fishMapInfoList[i]
// 暂时屏蔽
// @ts-ignore
const fish: FishBase = this.createFishByType(fishMapInfo.fishType)
fish.node.angle = 0
// fish.node.setScale(fishMapInfo.scale);
this.fishContainer.addChild(fish.node)
fish.node.setPosition(fishMapInfo.x + screen.width, fishMapInfo.y)
this.fishList.push(fish)
this.fishList.set(fish.fishId, fish)
}
}
onDestroy() {
FishManager.instance = null
WsManager.instance.off(100)
}
protected onDisable(): void {}
}

View File

@@ -1,26 +1,31 @@
import { _decorator, Component, instantiate, Node, NodePool, Prefab, Vec2, Vec3 } from 'cc'
import { Component, Node, NodePool, Prefab, Vec2, Vec3, _decorator, instantiate } from 'cc'
import FishNetBase from '../../../fish/script/FishNetBase'
const { ccclass, property } = _decorator
// 鱼网管理类
@ccclass('FishNetManager')
export default class FishNetManager extends Component {
public static instance: FishNetManager = null
@property({ type: [Prefab] })
private netPrefabList: Prefab[] | [] = []
private fishNetPool: Array<NodePool> = []
onLoad() {
FishNetManager.instance = this
}
// 添加鱼网
public addFishNet(netType: number, p: Vec2) {
let fishNet: FishNetBase = this.createFishNet(netType)
const fishNet: FishNetBase = this.createFishNet(netType)
this.node.addChild(fishNet.node)
fishNet.node.setPosition(new Vec3(p.x, p.y, 0))
fishNet.playMv()
}
// 创建鱼网
private createFishNet(netType: number) {
let fishNetNode: Node
if (this.fishNetPool[netType] && this.fishNetPool[netType].size() > 0) {
@@ -28,14 +33,17 @@ export default class FishNetManager extends Component {
} else {
fishNetNode = instantiate(this.netPrefabList[netType])
}
fishNetNode.getComponent(FishNetBase).netType = netType
return fishNetNode.getComponent(FishNetBase)
}
// 销毁鱼网
public destroyFishNet(fishNet: FishNetBase) {
if (!this.fishNetPool[fishNet.netType]) {
this.fishNetPool[fishNet.netType] = new NodePool()
}
this.fishNetPool[fishNet.netType].put(fishNet.node)
}

View File

@@ -1,6 +1,7 @@
import { _decorator, Component, instantiate, Node, NodePool, Prefab, Vec2, Vec3 } from 'cc'
import ScorePrefab from '../prefab/ScorePrefab'
import { Component, Node, NodePool, Prefab, Vec2, Vec3, _decorator, instantiate } from 'cc'
import FishUI from '../../../fish/script/FishUI'
import ScorePrefab from '../prefab/ScorePrefab'
const { ccclass, property } = _decorator
@@ -9,6 +10,7 @@ export default class ScoreManager extends Component {
public static instance: ScoreManager = null
@property({ type: Prefab })
private scrorePrefab: Prefab | null = null
private scorePool: NodePool
onLoad() {
@@ -16,34 +18,35 @@ export default class ScoreManager extends Component {
this.scorePool = new NodePool()
}
// 添加积分
public addScore(score: number, p: Vec2) {
let scorePrefab: ScorePrefab = this.createScore(score)
const scorePrefab: ScorePrefab = this.createScore(score)
this.node.addChild(scorePrefab.node)
scorePrefab.node.setPosition(new Vec3(p.x, p.y, 0))
scorePrefab.init(score)
scorePrefab.playMoveEffect(new Vec2(-472.398, -547.481), () => {
this.destroyScore(scorePrefab)
FishUI.instance.jf_score += score
FishUI.instance.refreshScore()
// 本地不在添加积分
// FishUI.instance.jf_score += score
// FishUI.instance.refreshScore()
})
}
// 创建积分
private createScore(score: number): ScorePrefab {
let scoreNode: Node
if (this.scorePool && this.scorePool.size() > 0) {
scoreNode = this.scorePool.get()
} else {
scoreNode = instantiate(this.scrorePrefab)
}
if (this.scorePool && this.scorePool.size() > 0) scoreNode = this.scorePool.get()
else scoreNode = instantiate(this.scrorePrefab)
return scoreNode.getComponent(ScorePrefab)
}
// 销毁积分
private destroyScore(scorePrefab: ScorePrefab) {
this.scorePool.put(scorePrefab.node)
}
onDisable() {
}
onDisable() {}
onDestroy() {
ScoreManager.instance = null

View File

@@ -0,0 +1,137 @@
import { _decorator } from 'cc'
import CommonTips from '../../engine/uicomponent/CommonTips'
import FishUI from '../../../fish/script/FishUI'
import config from '../config/Config'
export default class WsManager {
private static _instance: WsManager = null
uid: string
message: any
t_id: any = null
public static get instance() {
if (!this._instance) {
this._instance = new WsManager()
}
return this._instance
}
private _socket: WebSocket | null = null
protected m_mapCallbackFun: Map<number, Function>
constructor() {
this.m_mapCallbackFun = new Map<number, Function>()
}
public on(msgId: number, cb: Function, target: any) {
let callback = cb.bind(target)
let fnCallback: Function = this.m_mapCallbackFun.get(msgId)
if (fnCallback) {
console.error('重复注册消息处理函数! msgId:' + msgId)
} else {
this.m_mapCallbackFun.set(msgId, callback)
}
}
public off(msgId: number) {
if (this.m_mapCallbackFun.has(msgId)) {
this.m_mapCallbackFun.delete(msgId)
}
}
public get(msgId: number) {
return this.m_mapCallbackFun.get(msgId)
}
public offAll() {
this.m_mapCallbackFun.clear()
}
// 获取url参数
public getQueryString(name: string) {
var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i')
var r = window.location.search.substr(1).match(reg)
if (r != null) {
return unescape(r[2])
}
return null
}
public init(): void {
this.uid = this.getQueryString('uid')
this._socket = new WebSocket(`wss://${config.wsUrl()}/fish/home?uid=${this.uid}`)
// 添加事件监听器
this._socket.onopen = this.onOpen.bind(this)
this._socket.onmessage = this.onMessage.bind(this)
this._socket.onclose = this.onClose.bind(this)
this._socket.onerror = this.onError.bind(this)
}
public onOpen(): void {
console.log('WebSocket connection opened.')
setInterval(() => {
this._socket.send(JSON.stringify('ping'))
}, 20000)
this.clear()
}
public async onSend(data: any): Promise<void> {
if (this._socket && this._socket.readyState === WebSocket.OPEN) {
this._socket.send(JSON.stringify(data))
} else {
console.error('消息发送失败!!!')
}
}
/**
* 处理接收到的消息
* @param event WebSocket message event
*/
public onMessage(event: MessageEvent): void {
this.message = JSON.parse(event.data)
if (this.message.code === 200 || this.message.code === 5) {
FishUI.instance.refreshScore(this.message)
}
let fnCallback: Function = this.m_mapCallbackFun.get(this.message.code)
if (fnCallback) {
fnCallback(this.message)
}
}
/**
* 关闭WebSocket连接
*/
public onClose(): void {
console.log('链接已关闭')
CommonTips.showMsg('游戏服务器中断关闭,正在重试')
// this.init()
if (this._socket) {
this._socket.close()
this._socket = null
}
this.t_id = setInterval(() => {
WsManager.instance.init()
}, 8000)
}
public onError(event: Event): void {
CommonTips.showMsg('网络连接失败,正在重试链接游戏服务器')
this.t_id = setInterval(() => {
WsManager.instance.init()
}, 8000)
}
public clear() {
if (this.t_id) {
clearInterval(this.t_id)
this.t_id = null
}
}
}

View File

@@ -2,10 +2,8 @@
"ver": "4.0.23",
"importer": "typescript",
"imported": true,
"uuid": "65ad3e01-f8b1-4160-a391-c55d6c8f366f",
"uuid": "44f1bff8-2972-4ae5-8f53-e0daaa97b92e",
"files": [],
"subMetas": {},
"userData": {
"simulateGlobals": []
}
"userData": {}
}

View File

@@ -1,4 +1,5 @@
import { _decorator, Component, instantiate, Node, Prefab } from 'cc'
import { Component, Node, Prefab, _decorator, instantiate } from 'cc'
import PrefabLoader from '../../engine/utils/PrefabLoader'
import { GameConfig } from '../config/GameConfig'
@@ -6,29 +7,30 @@ const { ccclass, property } = _decorator
@ccclass('ResourcePrefab')
export default class ResourcePrefab extends Component {
private static prefab: Prefab | null = null
public static instance: Node
@property({ type: Prefab })
private scorePrefab: Prefab | null = null
public static preLoad(): Promise<void> {
return new Promise((resolve, reject) => {
PrefabLoader.loadPrefab(
GameConfig.GameName + '/' + 'game/prefab/ResourcePrefab',
(loadedResource: Prefab) => {
ResourcePrefab.prefab = loadedResource
ResourcePrefab.instance = instantiate(loadedResource)
resolve()
}
)
})
}
private static prefab: Prefab | null = null
public static instance: Node
@property({ type: Prefab })
private scorePrefab: Prefab | null = null
public static clear() {
ResourcePrefab.instance = null
ResourcePrefab.prefab = null
}
public static preLoad(): Promise<void> {
return new Promise((resolve, reject) => {
PrefabLoader.loadPrefab(
`${GameConfig.GameName}/game/prefab/ResourcePrefab`,
(loadedResource: Prefab) => {
ResourcePrefab.prefab = loadedResource
ResourcePrefab.instance = instantiate(loadedResource)
resolve()
},
)
})
}
public static getScorePrefab() {
return ResourcePrefab.instance.getComponent(ResourcePrefab).scorePrefab
}
public static clear() {
ResourcePrefab.instance = null
ResourcePrefab.prefab = null
}
public static getScorePrefab() {
return ResourcePrefab.instance.getComponent(ResourcePrefab).scorePrefab
}
}

View File

@@ -1,31 +1,27 @@
import { _decorator, Component, Label, tween, Tween, Vec2, Vec3 } from 'cc'
import { Component, Label, Tween, Vec2, Vec3, _decorator, tween } from 'cc'
const { ccclass, property } = _decorator
@ccclass('ScorePrefab')
export default class ScorePrefab extends Component {
@property({ type: Label })
private txtScore: Label | null = null
public init(score: number) {
if (score <= 0) {
this.txtScore.string = 'Miss'
} else {
this.txtScore.string = score + ''
}
}
@property({ type: Label })
private txtScore: Label | null = null
public playMoveEffect(p: Vec2, callback: Function = null) {
tween(this.node)
.to(0.5, { scale: new Vec3(3, 3, 3), position: new Vec3(p.x, p.y, 0) })
.call(() => {
if (callback) {
callback()
}
})
.start()
}
public init(score: number) {
if (score <= 0) this.txtScore.string = 'Miss'
else this.txtScore.string = `${score}`
}
onDisable() {
Tween.stopAllByTarget(this.node)
}
public playMoveEffect(p: Vec2, callback: Function = null) {
tween(this.node)
.to(0.5, { scale: new Vec3(3, 3, 3), position: new Vec3(p.x, p.y, 0) })
.call(() => {
if (callback) callback()
})
.start()
}
onDisable() {
Tween.stopAllByTarget(this.node)
}
}

View File

@@ -1,4 +1,5 @@
import { _decorator, Component, instantiate, Material, Node, Prefab } from 'cc'
import { Component, Material, Node, Prefab, _decorator, instantiate } from 'cc'
import PrefabLoader from '../../engine/utils/PrefabLoader'
import { GameConfig } from '../config/GameConfig'
@@ -13,29 +14,36 @@ export default class ShaderMaterialPrefab extends Component {
@property({ type: Material })
public grayMaterial: Material | null = null
@property({ type: Material })
public oldPhoto: Material | null = null
@property({ type: Material })
public glowInner: Material | null = null
@property({ type: Material })
public mosaic: Material | null = null
@property({ type: Material })
public roundCornerCrop: Material | null = null
@property({ type: Material })
public flashLight: Material | null = null
@property({ type: Material })
public flag: Material | null = null
@property({ type: Material })
public gaussian: Material | null = null
public static preLoad(): Promise<void> {
return new Promise((resolve, reject) => {
PrefabLoader.loadPrefab(
GameConfig.GameName + '/' + 'game/prefab/ShaderMaterialPrefab',
`${GameConfig.GameName}/game/prefab/ShaderMaterialPrefab`,
(loadedResource: Prefab) => {
ShaderMaterialPrefab.instance = instantiate(loadedResource)
resolve()
}
},
)
})
}

View File

@@ -1,37 +1,63 @@
import { _decorator, instantiate, Node, Prefab, Sprite, Tween, Vec3 } from 'cc'
import SceneBase from './SceneBase'
import TextureMgr from '../../engine/uicomponent/TextureMgr'
import RandomUtil from '../../engine/utils/RandomUtil'
import {
Component,
Game,
Node,
Prefab,
Sprite,
Tween,
Vec3,
_decorator,
director,
game,
instantiate,
} from 'cc'
import FishMover from '../../../fish/script/FishMover'
import { FishPathInfo } from '../config/FishPathInfo'
import { FishPathConfig } from '../config/FishPathConfig'
import { Logger } from '../../engine/utils/Logger'
import FishWiki from '../../../fish/script/FishWiki'
import TextureMgr from '../../engine/uicomponent/TextureMgr'
import { Logger } from '../../engine/utils/Logger'
import RandomUtil from '../../engine/utils/RandomUtil'
import { FishPathConfig } from '../config/FishPathConfig'
import { FishPathInfo } from '../config/FishPathInfo'
import WsManager from '../manager/WsManager'
import GameMusicHelper from '../utils/GameMusicHelper'
import CommonTips from '../../engine/uicomponent/CommonTips'
const { ccclass, property } = _decorator
@ccclass('FishGameScene')
export default class FishGameScene extends SceneBase {
export default class FishGameScene extends Component {
@property(Sprite)
private bg: Sprite | null = null
@property({ type: [Prefab] })
private fishPrefabList: Array<Prefab> | null = []
private showNode: Node | null = null
onLoad() {
this.onLoadMe()
}
onDestroy() {
this.onDestroyMe()
}
onLoadMe() {
WsManager.instance.init()
GameMusicHelper.playBg()
FishPathConfig.init()
this.initBg()
WsManager.instance.on(400, this.showMsg, this)
// FishPathConfig.init()
// this.initBg()
// this.testPathPlay()
game.on(Game.EVENT_HIDE, this.onHide, this)
game.on(Game.EVENT_SHOW, this.onAppShow, this)
}
private initBg() {
let textureMgr: TextureMgr = this.bg.getComponent(TextureMgr)
const textureMgr: TextureMgr = this.bg.getComponent(TextureMgr)
this.bg.spriteFrame =
textureMgr.Spriteset[
RandomUtil.nextInt(0, textureMgr.Spriteset.length - 1)
]
textureMgr.Spriteset[RandomUtil.nextInt(0, textureMgr.Spriteset.length - 1)]
}
private initShowNode() {
@@ -39,10 +65,9 @@ export default class FishGameScene extends SceneBase {
this.showNode.destroy()
this.showNode = null
}
let fishType: number = 29
if (fishType < 1 || fishType > 29) {
return
}
const fishType: number = 29
if (fishType < 1 || fishType > 29) return
this.showNode = instantiate(this.fishPrefabList[fishType - 1])
this.showNode.getComponent(FishMover).speed = 2
this.showNode.getComponent(FishMover).node.setScale(new Vec3(2, 2, 1))
@@ -51,10 +76,10 @@ export default class FishGameScene extends SceneBase {
private testPathPlay() {
this.initShowNode()
let pathInfo: FishPathInfo = FishPathConfig.getPathInfo(3)
const pathInfo: FishPathInfo = FishPathConfig.getPathInfo(3)
Logger.log('testPathPlay=pathInfo=', pathInfo)
let params = pathInfo.path
let param0 = params[0]
const params = pathInfo.path
const param0 = params[0]
Logger.log('testPathPlay=11=', param0)
this.showNode.setPosition(new Vec3(param0.x, param0.y, 0))
this.showNode.getComponent(FishMover).bezierPList = params
@@ -65,9 +90,22 @@ export default class FishGameScene extends SceneBase {
FishWiki.show()
}
private showMsg(res: any) {
Logger.log('showMsg=res=', res)
CommonTips.showMsg(res.msg)
}
onDestroyMe() {
this.unscheduleAllCallbacks()
//this.node.stopAllActions();
// this.node.stopAllActions();
Tween.stopAllByTarget(this.node)
}
onHide() {
director.pause()
}
onAppShow() {
director.resume()
}
}

View File

@@ -1,4 +1,14 @@
import { _decorator, DynamicAtlasManager, Node, PhysicsSystem2D, profiler, sys } from 'cc'
import {
_decorator,
Node,
sys,
profiler,
DynamicAtlasManager,
PhysicsSystem2D,
Component,
} from 'cc'
const { ccclass, property } = _decorator
import MusicConfig from '../../engine/config/MusicConfig'
import CommonTips from '../../engine/uicomponent/CommonTips'
import Progress from '../../engine/uicomponent/Progress'
@@ -7,74 +17,69 @@ import HotUpdate from '../../engine/utils/HotUpdate'
import { Logger } from '../../engine/utils/Logger'
import VersionManager from '../../engine/utils/VersionManager'
import ResourcePreload from '../utils/ResourcePreload'
import SceneBase from './SceneBase'
import SceneManager from './SceneManager'
const { ccclass, property } = _decorator
import { FishConfig } from '../config/FishConfig'
@ccclass('LoadingScene')
export default class LoadingScene extends SceneBase {
export default class LoadingScene extends Component {
public static scriptName: string = 'LoadingScene'
@property({ type: Node })
private progressNode: Node | null = null
async onLoadMe() {
protected onLoad(): void {
this.onLoadMe()
}
protected onDestroy(): void {
this.onDestroyMe()
}
onLoadMe() {
this.baseInit()
EventManager.instance.addListener(
HotUpdate.Event_On_NeedUpdate,
this.onNeedUpdate,
this
)
EventManager.instance.addListener(
HotUpdate.Event_On_Progress,
this.onUpdateProgress,
this
)
EventManager.instance.addListener(
HotUpdate.Event_On_Fail_Update,
this.onUpdateFail,
this
)
EventManager.instance.addListener(
HotUpdate.Event_Finish_Update,
this.onUpdateFinish,
this
)
EventManager.instance.addListener(HotUpdate.Event_On_NeedUpdate, this.onNeedUpdate, this)
EventManager.instance.addListener(HotUpdate.Event_On_Progress, this.onUpdateProgress, this)
EventManager.instance.addListener(HotUpdate.Event_On_Fail_Update, this.onUpdateFail, this)
EventManager.instance.addListener(HotUpdate.Event_Finish_Update, this.onUpdateFinish, this)
EventManager.instance.addListener(
HotUpdate.Event_On_ALREADY_UP_TO_DATE,
this.onUpdateFinish,
this
this,
)
if (sys.isNative && VersionManager.instance.isOpenHotUpdate) {
this.checkUpdate()
} else {
await this.preLoadRes()
this.preLoadRes()
}
}
private baseInit() {
profiler.hideStats() //showStats
//let collisionManager:cc.CollisionManager = director.getCollisionManager();
PhysicsSystem2D.instance.enable = true
private async baseInit() {
try {
await FishConfig.init()
profiler.hideStats() //showStats
//let collisionManager:cc.CollisionManager = director.getCollisionManager();
PhysicsSystem2D.instance.enable = true
// PhysicsSystem2D.instance.debugDrawFlags = EPhysics2DDrawFlags.Aabb |
// EPhysics2DDrawFlags.Pair |
// EPhysics2DDrawFlags.CenterOfMass |
// EPhysics2DDrawFlags.Joint |
// EPhysics2DDrawFlags.Shape;
// PhysicsSystem2D.instance.debugDrawFlags = EPhysics2DDrawFlags.Aabb |
// EPhysics2DDrawFlags.Pair |
// EPhysics2DDrawFlags.CenterOfMass |
// EPhysics2DDrawFlags.Joint |
// EPhysics2DDrawFlags.Shape;
//if(collisionManager){
//collisionManager.enabled = true;
// collisionManager.enabledDebugDraw = true;
// collisionManager.enabledDrawBoundingBox = true;
//}
//if(collisionManager){
//collisionManager.enabled = true;
// collisionManager.enabledDebugDraw = true;
// collisionManager.enabledDrawBoundingBox = true;
//}
if (DynamicAtlasManager.instance) {
DynamicAtlasManager.instance.enabled = false
if (DynamicAtlasManager.instance) {
DynamicAtlasManager.instance.enabled = false
}
MusicConfig.init()
// cc.director.getCollisionManager().enabled=true;//这是一个全局属性,开启后就代表碰撞检测组件可以进行检测了
// cc.director.getCollisionManager().enabledDebugDraw = true; //绘制碰撞区域
} catch (error) {
Logger.error(this, error)
}
MusicConfig.init()
// cc.director.getCollisionManager().enabled=true;//这是一个全局属性,开启后就代表碰撞检测组件可以进行检测了
// cc.director.getCollisionManager().enabledDebugDraw = true; //绘制碰撞区域
}
private checkUpdate() {
@@ -89,13 +94,10 @@ export default class LoadingScene extends SceneBase {
}
}
private onUpdateProgress(event: Function, loadedFiles: number, totalFiles: number, key: string) {
private onUpdateProgress(event, loadedFiles, totalFiles, key) {
if (key == VersionManager.Config_Key[0]) {
let msg: string =
Math.min(100, (loadedFiles / totalFiles) * 100).toFixed(2) + '%'
this.progressNode
.getComponent(Progress)
.updateProgress(loadedFiles, totalFiles, msg)
let msg: string = Math.min(100, (loadedFiles / totalFiles) * 100).toFixed(2) + '%'
this.progressNode.getComponent(Progress).updateProgress(loadedFiles, totalFiles, msg)
}
}
@@ -126,25 +128,10 @@ export default class LoadingScene extends SceneBase {
}
onDestroyMe() {
EventManager.instance.removeListener(
HotUpdate.Event_On_NeedUpdate,
this.onNeedUpdate
)
EventManager.instance.removeListener(
HotUpdate.Event_On_Progress,
this.onUpdateProgress
)
EventManager.instance.removeListener(
HotUpdate.Event_On_Fail_Update,
this.onUpdateFail
)
EventManager.instance.removeListener(
HotUpdate.Event_Finish_Update,
this.onUpdateFinish
)
EventManager.instance.removeListener(
HotUpdate.Event_On_ALREADY_UP_TO_DATE,
this.onUpdateFinish
)
EventManager.instance.removeListener(HotUpdate.Event_On_NeedUpdate, this.onNeedUpdate)
EventManager.instance.removeListener(HotUpdate.Event_On_Progress, this.onUpdateProgress)
EventManager.instance.removeListener(HotUpdate.Event_On_Fail_Update, this.onUpdateFail)
EventManager.instance.removeListener(HotUpdate.Event_Finish_Update, this.onUpdateFinish)
EventManager.instance.removeListener(HotUpdate.Event_On_ALREADY_UP_TO_DATE, this.onUpdateFinish)
}
}

View File

@@ -1,31 +0,0 @@
import { _decorator, Component } from 'cc'
import AdapterHelper from '../../engine/utils/AdapterHelper'
const { ccclass, property } = _decorator
@ccclass('SceneBase')
export default class SceneBase extends Component {
public static scriptName: string = 'SceneBase'
onLoad() {
AdapterHelper.fixApdater()
this.onLoadMe()
}
onLoadMe() {
}
start() {
this.onStartMe()
}
onStartMe() {
}
onDestroy() {
this.onDestroyMe()
}
onDestroyMe() {
}
}

View File

@@ -1,11 +0,0 @@
{
"ver": "4.0.23",
"importer": "typescript",
"imported": true,
"uuid": "544253ea-8aa0-4349-9d6c-efb97841d976",
"files": [],
"subMetas": {},
"userData": {
"simulateGlobals": []
}
}

View File

@@ -1,9 +1,10 @@
import { director, SceneAsset, sys } from 'cc'
import { Logger } from '../../engine/utils/Logger'
import LoadingScenePrefab from '../../engine/uicomponent/LoadingScenePrefab'
import CommonTips from '../../engine/uicomponent/CommonTips'
import EventManager from '../../engine/utils/EventManager'
import { SceneAsset, director, sys } from 'cc'
import CommonEvent from '../../engine/config/CommonEvent'
import CommonTips from '../../engine/uicomponent/CommonTips'
import LoadingScenePrefab from '../../engine/uicomponent/LoadingScenePrefab'
import EventManager from '../../engine/utils/EventManager'
import { Logger } from '../../engine/utils/Logger'
export default class SceneManager {
public static instance: SceneManager = new SceneManager()
@@ -23,7 +24,7 @@ export default class SceneManager {
}
public async sceneSwitch(name: string, showProgress: boolean = false) {
if (this.loadingSceneName == name) return
if (this.loadingSceneName === name) return
Logger.log(this, 'sceneSwitch==', name)
if (sys.isBrowser) {
// showProgress = true;
@@ -42,13 +43,13 @@ export default class SceneManager {
Logger.warn(this, 'preloadScene=error', error.message)
CommonTips.showMsg('加载场景失败')
} else {
//director.getScene().destroy();//director.getScene().cleanup();
// director.getScene().destroy();//director.getScene().cleanup();
director.loadScene(name, this.loadSceneOK.bind(this))
}
}
},
)
} else {
//director.getScene().destroy();//director.getScene().cleanup();
// director.getScene().destroy();//director.getScene().cleanup();
director.loadScene(name, this.loadSceneOK.bind(this))
}
}
@@ -65,7 +66,7 @@ export default class SceneManager {
public preloadScene(
sceneName: string,
onProgressCallback: any = null,
onLoadedCallback: any = null
onLoadedCallback: any = null,
) {
director.preloadScene(sceneName, onProgressCallback, onLoadedCallback)
}

View File

@@ -1,18 +0,0 @@
import { _decorator } from 'cc'
import SceneBase from './SceneBase'
const { ccclass, property } = _decorator
@ccclass('StartScene')
export default class StartScene extends SceneBase {
public static scriptName: string = 'StartScene'
onLoadMe() {
}
update() {
}
onDestroyMe() {
}
}

View File

@@ -1,11 +1,11 @@
import { _decorator, Component, Vec2 } from 'cc'
import { Component, Vec2, _decorator } from 'cc'
const { ccclass, property } = _decorator
export enum AstarGridType {
Hider = 0, //不能走
Normal = 1, //能走
End = 2, //终点
Hider = 0, // 不能走
Normal = 1, // 能走
End = 2, // 终点
}
@ccclass('Astar')
@@ -28,8 +28,7 @@ export class Astar extends Component {
private path: Array<AstarGrid> = []
private gridsList: Array<Array<AstarGrid>> = []
onLoad() {
}
onLoad() {}
/**
* @param mapW 宽格子数
@@ -51,15 +50,12 @@ export class Astar extends Component {
this.closeList = []
this.path = []
// 初始化格子二维数组
this.gridsList = new Array(this.mapW + 1)
for (let col = 0; col < this.gridsList.length; col++) {
this.gridsList[col] = new Array(this.mapH + 1)
}
for (let col = 0; col <= this.mapW; col++) {
for (let row = 0; row <= this.mapH; row++) {
this.addGrid(col, row, AstarGridType.Normal)
}
}
this.gridsList = Array.from({ length: this.mapW + 1 })
for (let col = 0; col < this.gridsList.length; col++)
this.gridsList[col] = Array.from({ length: this.mapH + 1 })
for (let col = 0; col <= this.mapW; col++)
for (let row = 0; row <= this.mapH; row++) this.addGrid(col, row, AstarGridType.Normal)
}
/**
@@ -69,7 +65,7 @@ export class Astar extends Component {
* @param type
*/
private addGrid(x: number, y: number, type: number = AstarGridType.Hider) {
let grid = new AstarGrid()
const grid = new AstarGrid()
grid.x = x
grid.y = y
grid.type = type
@@ -83,7 +79,7 @@ export class Astar extends Component {
* @param type
*/
public setGridType(x: number, y: number, type: number) {
let curGrid: AstarGrid = this.gridsList[x][y]
const curGrid: AstarGrid = this.gridsList[x][y]
curGrid.type = type
}
@@ -94,70 +90,59 @@ export class Astar extends Component {
* @param callback
*/
public findPath(startPos: Vec2, endPos: Vec2, callback: Function = null) {
let startGrid = this.gridsList[startPos.x][startPos.y]
const startGrid = this.gridsList[startPos.x][startPos.y]
this.openList.push(startGrid)
let curGrid: AstarGrid = this.openList[0]
while (this.openList.length > 0 && curGrid.type != AstarGridType.End) {
while (this.openList.length > 0 && curGrid.type !== AstarGridType.End) {
// 每次都取出f值最小的节点进行查找
curGrid = this.openList[0]
if (curGrid.type == AstarGridType.End) {
if (curGrid.type === AstarGridType.End) {
// Logger.log(this,"find path success.");
this.generatePath(curGrid)
if (callback) {
callback(this.path)
}
if (callback) callback(this.path)
return
}
for (let i: number = -1; i <= 1; i++) {
for (let j: number = -1; j <= 1; j++) {
if (i != 0 || j != 0) {
let col = curGrid.x + i
let row = curGrid.y + j
if (i !== 0 || j !== 0) {
const col = curGrid.x + i
const row = curGrid.y + j
if (
col >= 0 &&
row >= 0 &&
col <= this.mapW &&
row <= this.mapH &&
this.gridsList[col][row].type != AstarGridType.Hider &&
this.closeList.indexOf(this.gridsList[col][row]) < 0
col >= 0
&& row >= 0
&& col <= this.mapW
&& row <= this.mapH
&& this.gridsList[col][row].type !== AstarGridType.Hider
&& !this.closeList.includes(this.gridsList[col][row])
) {
if (this.is8dir) {
// 8方向 斜向走动时要考虑相邻的是不是障碍物
if (
this.gridsList[col - i][row].type == AstarGridType.Hider ||
this.gridsList[col][row - j].type == AstarGridType.Hider
) {
this.gridsList[col - i][row].type === AstarGridType.Hider
|| this.gridsList[col][row - j].type === AstarGridType.Hider
)
continue
}
} else {
// 四方形行走
if (Math.abs(i) == Math.abs(j)) {
continue
}
if (Math.abs(i) === Math.abs(j)) continue
}
// 计算g值
let g =
curGrid.g +
Math.floor(Math.sqrt(Math.pow(i * 10, 2)) + Math.pow(j * 10, 2))
if (
this.gridsList[col][row].g == 0 ||
this.gridsList[col][row].g > g
) {
const g = curGrid.g + Math.floor(Math.sqrt((i * 10) ** 2) + (j * 10) ** 2)
if (this.gridsList[col][row].g === 0 || this.gridsList[col][row].g > g) {
this.gridsList[col][row].g = g
// 更新父节点
this.gridsList[col][row].parent = curGrid
}
// 计算h值 manhattan估算法
this.gridsList[col][row].h =
Math.abs(endPos.x - col) + Math.abs(endPos.y - row)
this.gridsList[col][row].h = Math.abs(endPos.x - col) + Math.abs(endPos.y - row)
// 更新f值
this.gridsList[col][row].f =
this.gridsList[col][row].g + this.gridsList[col][row].h
this.gridsList[col][row].f = this.gridsList[col][row].g + this.gridsList[col][row].h
// 如果不在开放列表里则添加到开放列表里
if (this.openList.indexOf(this.gridsList[col][row]) < 0) {
if (!this.openList.includes(this.gridsList[col][row]))
this.openList.push(this.gridsList[col][row])
}
// // 重新按照f值排序升序排列)
}
}
@@ -170,9 +155,8 @@ export class Astar extends Component {
if (this.openList.length <= 0) {
// Logger.log(this,"find path failed.");
this.path = []
if (callback) {
callback(this.path)
}
if (callback) callback(this.path)
break
}
// 重新按照f值排序升序排列)
@@ -195,6 +179,5 @@ export class Astar extends Component {
return this.path
}
onDestroy() {
}
onDestroy() {}
}

View File

@@ -1,15 +1,15 @@
import SoundPrefab from '../../engine/uicomponent/SoundPrefab'
import MusicPrefab from '../../engine/uicomponent/MusicPrefab'
import SoundPrefab from '../../engine/uicomponent/SoundPrefab'
import RandomUtil from '../../engine/utils/RandomUtil'
export default class GameMusicHelper {
public static playBg() {
let randomIndex: number = RandomUtil.nextInt(1, 3)
MusicPrefab.play('background_' + randomIndex)
const randomIndex: number = RandomUtil.nextInt(1, 3)
MusicPrefab.play(`background_${randomIndex}`)
}
public static playFishDead(fishType: number) {
SoundPrefab.play('deadfish_' + fishType)
SoundPrefab.play(`deadfish_${fishType}`)
}
public static playFire() {

View File

@@ -1,4 +1,5 @@
import { error, game } from 'cc'
import DarkLayer from '../../engine/uicomponent/DarkLayer'
import LoadingPrefab from '../../engine/uicomponent/LoadingPrefab'
import LoadingScenePrefab from '../../engine/uicomponent/LoadingScenePrefab'
@@ -22,29 +23,28 @@ export default class ResourcePreload {
}
this.isPreloaded = true
this.progress = progress
if (this.progress) {
if (this.progress)
progress.updateProgress(this.nowIndex, this.totalNum)
}
await LoadingPrefab.preLoad() //1
await LoadingPrefab.preLoad() // 1
this.finishOneItemLoad()
await DarkLayer.preLoad() //2
await DarkLayer.preLoad() // 2
this.finishOneItemLoad()
await MusicPrefab.preLoad() //3
await MusicPrefab.preLoad() // 3
this.finishOneItemLoad()
await SoundPrefab.preLoad() //4
await SoundPrefab.preLoad() // 4
this.finishOneItemLoad()
await ResourcePrefab.preLoad() //5
await ResourcePrefab.preLoad() // 5
this.finishOneItemLoad()
await ShaderMaterialPrefab.preLoad() //6
await ShaderMaterialPrefab.preLoad() // 6
this.finishOneItemLoad() //
callback()
}
private finishOneItemLoad() {
this.nowIndex++
if (this.progress) {
if (this.progress)
this.progress.updateProgress(this.nowIndex, this.totalNum)
}
}
public restartGame() {
@@ -53,7 +53,7 @@ export default class ResourcePreload {
LoadingScenePrefab.clear()
LoadingPrefab.clear()
error('需要获取游戏里所有的AudioSource停止音乐')
//audioEngine.stopAll();
// audioEngine.stopAll();
// VersionManager.instance.releaseAll();
MusicPrefab.destory()

View File

@@ -1,14 +1,16 @@
import { _decorator, Component } from 'cc'
import { Component, _decorator } from 'cc'
const { ccclass, property } = _decorator
@ccclass('UIRoot')
export class UIRoot extends Component {
public static Instance: UIRoot
onLoad() {
UIRoot.Instance = this
}
onDestroy() {
UIRoot.Instance = null
}
public static Instance: UIRoot
onLoad() {
UIRoot.Instance = this
}
onDestroy() {
UIRoot.Instance = null
}
}