1

我终于升级了一个非常旧的通用游戏应用程序我必须在更新的操作系统和设备尺寸上玩得很好 - 我现在已经更新了所有内容并针对 iOS 6.1 但是当我在 iPhone 5 上运行它时,我的实际游戏视图,它是使用 open GL 渲染到 EAGLView 中的,它的位置非常奇怪,并且显示了很多剪辑(见截图)。

4

在我们第一次创建它时周围的“普通”设备上,一切都按预期显示。

3.5

在我的视图控制器中,我基本上加载了一个为不同设备设置了正确尺寸的笔尖——iPad 和非 4" 设备获得 1024x768 视图,而 4" 设备获得新的 1136x640 视图。

然后,在我的 中viewDidLoad,我将我的视图设置self.view.contentScaleFactor[UIScreen mainsScreen] scale],然后我像这样(大致)进行一些视图大小调整:

if(iPad){
    [self.view setFrame:CGRectMake(0, 0,1024,768)];
    [self.view setCenter:CGPointMake(384,512)];
    DefaultViewScale=1.2;
}else if(WideScreen){
    [self.view setFrame:CGRectMake(0, 0, 568, 320)];
    [self.view setCenter:CGPointMake(160, 293)];
    DefaultViewScale = 1.0f;
}else{
    [self.view setFrame:CGRectMake(0, 0,480,320)];
    [self.view setCenter:CGPointMake(160,240)];
    DefaultViewScale=1.0f;;
}

最后,我应用一个变换来按上面定义的一个因子缩放视图,我刚刚手动调整然后旋转它,因为应用程序只是横向左。

 [self.view
    setTransform:
        CGAffineTransformConcat(CGAffineTransformMakeScale(DefaultViewScale,DefaultViewScale),
                                CGAffineTransformMakeRotation(-M_PI_2))];

然后我初始化一个新的 EAGLContext (openGL ES 1),

[(EAGLView *)self.view setContext:context];
[(EAGLView *)self.view setFramebuffer];

setFramebuffer 主要是:

[EAGLContext setCurrentContext:context];

// Create default framebuffer object.
glGenFramebuffers(1, &defaultFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);

glGenRenderbuffers(1, &colorRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer];
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &framebufferWidth);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &framebufferHeight);

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer);

glViewport(0, 0, framebufferWidth, framebufferHeight);

还有一些样板 EAGLView 代码,但请注意,我将 glViewport 设置为 gl 告诉我它的宽度和高度是从 UIView 的层大小中获取的。

最后建立投影矩阵:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

glOrthof(0, self.view.frame.size.width , 0, self.view.frame.size.height, -1, 1);

glMatrixMode(GL_MODELVIEW);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND_SRC);

glEnableClientState(GL_VERTEX_ARRAY);



glDisable(GL_DEPTH_TEST);

// Set the colour to use when clearing the screen with glClear
glClearColor(51.0/255.0,135.0/255.0,21.0/255.0, 1.0f);

glBlendFunc(GL_ONE,GL_ONE_MINUS_SRC_ALPHA);

不是我最擅长的知识领域,所以如果我遗漏了什么,请告诉我,如果需要,我可以为您提供更多信息。如果有人有“哈哈”或类似的经历,我会很感激一些正确方向的提示。

谢谢

4

4 回答 4

2

简短的回答,开始使用GLKView而不是EAGLView.

首先,了解在最新版本的 iOS 中设置例如 OpenGL 上下文的最佳实践的一个好方法是使用“OpenGL 游戏”模板创建一个新项目并查看以供参考。

最显着的区别是GLKView(在 iOS 5.0 中引入),它为您大大简化了事情。它将处理您现在手动执行的大部分操作,包括设置视口。

  • 首先将使用替换EAGLViewGLKView(确保GLKit.framework在您的项目中引用)。
  • 删除对setFramebuffer方法的调用。GLKit 会为您解决这个问题。
  • 删除[self.view setTransform:]呼叫。如果您的应用是全屏 OpenGL,则无需使用视图变换。(它不是,很可能仍然不需要它)。
  • 将视图的框架设置为屏幕的边界(例如,通过让它自动调整大小)。您可能可以在 XIB 中执行此操作。
  • 确保[context setCurrentContext]在你的viewDidLoad某个地方打电话。
  • 或多或少应该是这样。还要确保将 的context属性设置GLKView为 OpenGL 上下文,就像EAGLView.
于 2013-06-30T07:35:46.467 回答
1

我建议确保您的启动图像是最新的。

OpenGL 绝对不是我的专业领域,但我在将 Flash 游戏升级到 iOS 6 时遇到了类似的问题。我没有为新 iPhone 等的视网膜显示器提供适当的启动图像,我的应用程序在“兼容模式”下运行' 在屏幕的顶部和底部有边距。诚然,您并不完全拥有这些边距,但它可能会影响您的应用程序认为其屏幕的大小。可能值得一试。

于 2013-07-01T23:12:43.333 回答
0

为什么 iPad 上的“DefaultViewScale=1.2”?如果应用程序是全屏的,则不应再缩放,因为它是 1024x768。你在那里重新调整一些东西吗?

在我的 OpenGL 应用程序中,我只有一个始终全屏的 EAGLView,然后从帧缓冲区宽度/高度读取大小。

如果你有一个 UIViewController,并且正确设置了 HUD 元素,你就不需要做任何 [self.view setTransform..]。我有一种感觉,你让自己的生活变得更加复杂,那么它应该是!
只需添加带有“UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth”的 EAGLView 作为 ViewControllers 主视图的最低子视图。并正确设置旋转代码(请记住 iOS5 调用,因此 shouldAutoRotateToInterfaceOrientation:.. 已弃用)。

于 2013-06-29T06:43:25.727 回答
0

看起来您正在进行的转换是在设置视图框架之后进行的,因此可能会更改边界。我建议打破你的绘图方法并检查视图及其图层的边界。

请记住,框架是从父级的角度设置的,而边界是在本地坐标中。从 UIView.h:

如果视图被转换,请不要使用框架,因为它不会正确反映视图的实际位置。改用边界+中心。

于 2013-06-30T07:09:23.163 回答