2

我的游戏专为横向设计(屏幕分辨率 1024*768 - iPad 分辨率)。

我的游戏场景在 PlayN 支持的每个平台(Android、html 等)上都能正确渲染。只有iOS的问题。

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

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

我通过以下方式调查了这个问题:

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

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

任何可能导致这种奇怪行为的帮助或想法将不胜感激。

谢谢!

4

2 回答 2

1

The problem is in the following:

  • iOS doesn't change main window frame and root view frame after device rotation (while Android does - I've checked).
  • PlayN code expects that view size after rotation should be changed from 768*1024 (default orientation) to 1024*768.

Actual result: PlayN transforms game scene using transform matrix but doesn't change OpenGL framebuffer size (framebuffer size is still 768*1024)

I've fixed this issue by adding the next piece of code to 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);
}

Now everything work as expected!

If you have any other ideas how to fix this issue I will be glad to discuss them)

Thanks!

于 2012-10-22T09:51:08.833 回答
0

下载最新的 PlayN-1.5 快照(来自 -> https://github.com/threerings/playn而不是来自谷歌代码)。此问题已在该版本中修复

于 2012-10-23T18:51:20.757 回答