一、接口清单
// SceneUtil
static async reloadScene():Promise
static async loadScene(scene: ISceneInfo):Promise
// AudioMgr
resume()
pause()
stop()
play(sound: AudioClip | string, volume: number = 1.0, bundleName: string = 'resources')
playOneShot(sound: AudioClip | string, volume: number = 1.0, bundleName: string = 'resources')
musicVolume
soundVolume
inst
// ModuleContext
static attachModule(cls, moduleName)
static getClassModule(cls)
static attachImplClass(cls,implCls)
static createFromModule(cls)
// ResolutionAutoFit
adjustResolutionPolicy()
// ResourceMgr
loadRes()
二、AudioMgr
2.1 AudoMgr初始化逻辑
- 新建一个节点
node = new Node()
,节点名字被设置位__audioMgr__
- 添加到场景中
director.getScene().addChild(node)
- 设置位常驻节点
- 给这个节点挂载
AudioSource
组件
2.2 播放声效/声音 逻辑:
playOneShot(sound: AudioClip | string, volume: number = 1.0, bundleName: string = 'resources') {
if (sound instanceof AudioClip) {
this._audioSource.playOneShot(sound, volume * this._soundVolume);
}
else {
let bundle = assetManager.getBundle(bundleName);
bundle.load(sound, (err, clip: AudioClip) => {
....;
this._audioSource.volume = 1.0;
this._audioSource.playOneShot(clip, volume * this._soundVolume);
});
}
}
- 参数是AudioClip类型: 直接调用AudioSource相关方法
- 参数是String类型:根据资源路径,获取资源,再调用AudioSource
2.3 InputMgr
看不懂,完全看不懂。。。
三、 ModuleContext
存放子模块信息,包括子模块名称,UIController
的实现类
3.1 ModuleContext拥有的JS属性
const PROP_MODULE = '__module__name__';
const PROP_IMPL_CLASS = '__impl__class__';
let defaultModule = 'resources';
resources
对应我们新建项目后,初始的资源文件
3.2 ModuleContext拥有的 静态属性
defaultModule:
3.3 ModuleContext拥有的静态方法
attachModule():
// ModuleContext
public static attachModule(cls, moduleName) {
cls[PROP_MODULE] = moduleName;
}
// UITankGameRank 调用示例
tgxModuleContext.attachModule(UITankGameRank,ModuleDef.TANK);
目前只能确定可以通过这个方法给子模块的某个UIController
挂载一个属性,属性的值是子模块的名称
getClassModule(cls)
public static getClassModule(cls) {
return cls[PROP_MODULE] || defaultModule;
}
目前只能确定可以通过这个方法获取子模块名称
3.4 attachImplClass(cls,implCls)
public static attachImplClass(cls, implCls) {
cls[PROP_IMPL_CLASS] = implCls;
}
与attchModule()
相同的代码逻辑,在项目中负责的功能还不清楚
3.5 attachModuleAndImplClass(cls, moduleName, implCls)
no reference found for attachModuleAndImplClass
, 暂时不做了解
3.6 createFromModule(cls)
public static createFromModule(cls) {
let implCls = this.getImplClass(cls) || cls;
return new implCls();
}
- 在
easy_ui_controller
模块中,cls
是UIController的实现类。不了解``easy_ui_controller
模块的同学可以看我的另一篇文章TGX联机对战框架 子模块easy_ui_framwork - 还没由看到其他用处, 后面学习到再补
3.7 ResolutionAutoFit
是一个组件:
class ResolutionAutoFit extends Component
调整频率:
update(deltaTime: number) {
this.lastCheckTime+=deltaTime;
if(this.lastCheckTime < CHECK_INTERVAL){
return;
}
this.lastCheckTime = 0;
this.adjustResolutionPolicy();
}
- 通过
CHECK_INTERVAL
设置响应的速度
分辨率适配策略:
adjustResolutionPolicy(){
let winSize = screen.windowSize;
if(!this._oldSize.equals(winSize)){
// 长宽比
let ratio = winSize.width / winSize.height;
// 窗口分辨率
let drs = view.getDesignResolutionSize();
let drsRatio = drs.width / drs.height
if(ratio > drsRatio){
//wider than desgin. fixed height
view.setResolutionPolicy(ResolutionPolicy.FIXED_HEIGHT);
}
else{
//
view.setResolutionPolicy(ResolutionPolicy.FIXED_WIDTH);
}
this._oldSize.set(winSize);
}
}
- 还不清楚窗口分辨率和窗口大小的关系,这里放在以后讲解。有懂哥的话,还请指教
3.8 ResourceMgr
loadRes()代码逻辑
-
let cache = resources.get(url,type) as any
先从缓存中取 -
let loadingItem:ResItem = this.loadingQueue[url]
:缓存中没有则从工作队列中取 -
后面的流程看起来不太流畅,后来发现
no reference found for loadRes
,就不去深究了if(!loadingItem){ loadingItem = this.loadingQueue[url] = new ResItem(); loadingItem.url = url; } loadingItem.callbackArr.push(callback); if(!loadingItem.isLoading){ loadingItem.isLoading = true; resources.load(url, type, (err,asset:Asset)=>{ delete this.loadingQueue[url]; for(let k in loadingItem.callbackArr){ let cb = loadingItem.callbackArr[k]; if(cb){ cb(err,asset); } } }); }
ResourceMgr在项目中没有使用到
3.9 SceneUtil
loadScene()
let bundle = assetManager.getBundle(scene.bundle);
if (bundle) {
// 直接加载场景
}
else{
// 先加载分包
// 再加载场景
}
reloadScene()
// 直接加载场景
// 确认分包已经加载了,则使用该方法
director.loadScene(director.getScene().name