TGX联机对战框架 base子模块

一、接口清单

// 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初始化逻辑

  1. 新建一个节点 node = new Node(),节点名字被设置位__audioMgr__
  2. 添加到场景中 director.getScene().addChild(node)
  3. 设置位常驻节点
  4. 给这个节点挂载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()代码逻辑

  1. let cache = resources.get(url,type) as any 先从缓存中取

  2. let loadingItem:ResItem = this.loadingQueue[url]:缓存中没有则从工作队列中取

  3. 后面的流程看起来不太流畅,后来发现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
  • 21
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值