3.8.3升级3.8.4多游戏横竖屏适配策略不起作用了

  • Creator 版本: 3.8.4

  • 目标平台: web

  • 重现方式:项目设置1280*720,高适配
    进入游戏,由于包含既有横屏和竖屏的游戏,重新动态调整游戏适配策略:
    在场景启动后,执行了以下代码apadtSuitScreen

下面的变量designSize内容大概是这个游戏的分辨率:
designSize: {
                width: 640,
                height: 1138
            }

 //屏幕适配
    apadtSuitScreen(gameId?: number) {
        LogWrap.Instance.warn("适配策略:",view.getResolutionPolicy().getContentStrategy(),view.getDesignResolutionSize());
        if (gameId) {
            let gameDesignSize = SubGameCfg[gameId].designSize as Size;
            this.initDir(gameId);
            // if (sys.os == sys.OS.ANDROID)
            //     jsb.reflection.callStaticMethod('com/cocos/game/AppActivity', 'setOrientation', '(Ljava/lang/String;)V', this._dir)
            // else if (sys.os == sys.OS.IOS)
            //     jsb.reflection.callStaticMethod('AppDelegate', 'setOrientation:', this._dir)
            let curWindowSize = screen.windowSize;
            let visibleSize = view.getVisibleSize();

            LogWrap.Instance.log('curWindowSize: ' + curWindowSize.width + '   ' + curWindowSize.height)
            LogWrap.Instance.log('visibleSize: ' + visibleSize.width + '   ' + visibleSize.height)
            // return
            if (this._dir == 'V') {
                view.setOrientation(macro.ORIENTATION_PORTRAIT)
                if (curWindowSize.width > curWindowSize.height)
                    screen.windowSize = new Size(curWindowSize.height, curWindowSize.width)
            }
            else {
                view.setOrientation(macro.ORIENTATION_LANDSCAPE)
                if (curWindowSize.height > curWindowSize.width)
                    screen.windowSize = new Size(curWindowSize.height, curWindowSize.width)
            }

            const designWidth = gameDesignSize.width;
            const designHeight = gameDesignSize.height;

            const windowWidth = screen.windowSize.width;
            const windowHeight = screen.windowSize.height;

            LogWrap.Instance.log("designSize:", designWidth, designHeight);
            LogWrap.Instance.log("new windowSize:", windowWidth, windowHeight);

            LogWrap.Instance.log("designWidth / designHeight: ", designWidth / designHeight);
            LogWrap.Instance.log("windowWidth / windowHeight: ", windowWidth / windowHeight);
            if (designWidth / designHeight < windowWidth / windowHeight) {
                LogWrap.Instance.log("FIXED_HEIGHT");
                this._resolutionPolicy = ResolutionPolicy.FIXED_HEIGHT;
            } else {
                LogWrap.Instance.log("FIXED_WIDTH");
                this._resolutionPolicy = ResolutionPolicy.FIXED_WIDTH;
            }
            view.setDesignResolutionSize(designWidth,designHeight,this._resolutionPolicy);
            // view.getResolutionPolicy().setContentStrategy(ResolutionPolicy.ContentStrategy.FIXED_WIDTH);
            // view.getResolutionPolicy().setContainerStrategy(ResolutionPolicy.ContainerStrategy.PROPORTION_TO_FRAME);
            LogWrap.Instance.warn("适配策略:",view.getResolutionPolicy().getContentStrategy(),view.getDesignResolutionSize());
                // 手机浏览器切换
            if (sys.platform == sys.Platform.MOBILE_BROWSER) {
                window.dispatchEvent(new Event('resize'));
            }

        }
    }

    initDir(gameId){
        let gameDesignSize = SubGameCfg[gameId].designSize as Size;
        if (gameDesignSize.width > gameDesignSize.height) {
            this._dir = 'H'
        } else {
            this._dir = 'V'
        }
        LogWrap.Instance.log("gameDesignSize:", gameDesignSize);
        LogWrap.Instance.log("this.Dir:", this._dir);
    }
  • 之前哪个版本是正常的:3.8.3

  • 重现概率:100%

看了3.8.4新增:

查阅了3.8的文档官方的git https://github.com/cocos/cocos-test-projects.git 没有合适的解决方案。
如果项目设置为640,1138可以解决,但是对于另外要给横屏游戏却无法解决~

@minggo 大佬麻烦看下


在3.8.5里修复了,参考下这个PR 试试

好的,谢谢大佬,我先看看 :grinning:

不想改源码 在 view.setResolutionPolicy 后面加上 view.emit(‘canvas-resize’)

1赞

这个问题,我早在社区3.8.4反映了,直到3.8.4正式发布都还有这问题,然后居然在3.8.5才修复。神操作,明知道有这问题,今天发布时,不能合进去再发吗。

我直接改源码了。就好了。你这个方案试了吗?也可以吗? :laughing:
回头3.8.5也得升,我就可以把修改的引擎部分去掉了。

我就这样改的

1赞