我的游戏仅适用于横向(屏幕分辨率1024 * 768-iPad分辨率)。

我的游戏场景在PlayN支持的每个平台(Android,html等)上都能正确呈现。仅iOS的问题。

我已经为iPad屏幕分辨率,设置info.plist文件,使用IOSPlatform.register(app, IOSPlatform.SupportedOrients.LANDSCAPES);注册的平台准备了所有资源。

当我运行我的应用程序时,关于设备方向的所有信息都是正确的,但是游戏场景并未完全渲染。它以768 * 768的分辨率渲染(并非所有场景对象都是可见的-仅可见属于768 * 768 rect的对象),而剩余的屏幕空间为黑色。

我已通过以下方式调查了此问题:

  • 将比例转换应用于rootLayer(以确保渲染整个场景)。 PlayN.graphics().rootLayer().setScale(0.75f, 0.75f);结果-游戏场景适合768 * 768矩形,我可以看到所有游戏场景对象。
  • 将转换转换应用于rootLayer(以确保PlayN不会渲染768 * 768 rect以外的场景)。 PlayN.graphics ().rootLayer().setTranslation(1024.0f - 768.0f, 0.0f);结果-游戏场景已翻译,但不属于768 * 768屏幕矩形的对象不可见。

  • 我的猜测是PlayN为768 * 1024屏幕分辨率(默认的iPad方向分辨率)准备了其绘制上下文。渲染屏幕时,位于768 * 1024矩形外部的对象将被裁剪(不渲染)。

    任何能引起这种奇怪行为的帮助或想法,将不胜感激。

    谢谢!

    最佳答案

    问题出在以下方面:

  • 设备旋转后,iOS不会更改主窗口框架和根视图框架(而Android会更改-我已经检查过)。
  • PlayN代码期望旋转后的视图大小应从768 * 1024(默认方向)更改为1024 * 768。

  • 实际结果:PlayN使用变换矩阵变换游戏场景,但不更改OpenGL帧缓冲区大小(帧缓冲区大小仍为768 * 1024)

    我通过将下一段代码添加到IOSGLContext中来解决此问题:
    @Override
    public void setSize (int width, int height)
    {
        if (UIDeviceOrientation.LandscapeLeft == orient || UIDeviceOrientation.LandscapeRight == orient)
        {
            Console.WriteLine("Swap IOSGLContext width and height for " + UIDeviceOrientation.wrap(orient));
            viewWidth = height;
            viewHeight = width;
        }
        else
        {
            viewWidth = width;
            viewHeight = height;
        }
        super.setSize(viewWidth, viewHeight);
    }
    

    现在一切都按预期工作!

    如果您还有其他解决方法,请与我讨论。

    谢谢!

    09-15 16:48