2013-06-23 72 views
0

我终于升级了一个非常古老的通用游戏应用程序我必须适应更新的操作系统和设备大小 - 我已经更新了一切,并将iOS 6.1定位到正确的位置现在,但是当我在iPhone 5上运行它时,我的实际游戏视图(使用开放式GL渲染到EAGLView中)非常奇怪,显示了很多剪辑(请参见屏幕截图)。将旧应用程序升级到iOS 6 - 在iPhone 5上打开GL问题

4" retina simulator screenshot

在保留它们在我们第一次创造了这个时候,“正常”的设备,如预期出现的一切。

3.5" retina simulator

在我的视图控制器,我基本上加载笔尖与不同设备设置正确的大小 - iPad和非4" 的设备得到了1024×768视图和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;; 
} 

最后,我申请通过转换来缩放视图上面定义的因素,我只是手动调整,然后旋转它,因为该应用程序仅适用于Landscape-Left。

[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代码,但请注意,我设置无论gl的glViewport告诉我它的宽度和高度是从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); 

这是我所知最强的区域,所以让我知道如果我错过了一些东西,我可以给你更多的信息,如果需要。如果任何人有“一哈”或类似的经验,我会感激一些正确的方向提示。

谢谢

+0

我注意到你的第一个代码块中的WideScreen情况的'setCenter'调用不符合其他情况下的模式:你有我认为应该是的CGPointMake(160,293)案例)CGPointMake(160,284)。这可能是问题吗? – GuyRT

+0

不幸的是,@GuyRT,这没有效果。尽管如此,赶上! – Mustafakidd

回答

0

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

在我的OpenGL应用程序中,我只有一个始终全屏的EAGLView,然后从framebufferWidth/height读取大小。

如果你有一个UIViewController,HUD-Elements正确设置,你不需要做任何[self.view setTransform ..]。我有这样的感觉,你让生活变得更加复杂,那应该是!
只需将带有“UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth”的EAGLView添加为ViewControllers主视图的最低子视图。并正确设置旋转代码(keep in mind the iOS5 calls so shouldAutoRotateToInterfaceOrientation:.. are deprecated)。

0

看起来您正在做的转换是在设置视图的框架之后,并可能因此改变界限。我建议打破你的绘制方法并检查视图和图层的边界。

请记住,框架是从父视角设置的,而界限是在本地坐标中。来自UIView.h:

不使用帧如果视图被转换,因为它不会正确 反映视图的实际位置。改用bounds + center。

1

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

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

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

  • 开始通过与GLKView更换使用EAGLView的(确保在你的项目中引用GLKit.framework)。
  • 删除对setFramebuffer方法的调用。 GLKit为您处理此事。
  • 删除[self.view setTransform:]呼叫。如果您的应用程序是全屏OpenGL,则无需使用视图转换。 (而不是,它是可能,它仍然不需要)。
  • 将视图的框架设置为屏幕边界(例如,通过让它自动调整大小)。你可以在XIB中做这个。
  • 请务必在viewDidLoad的某处拨打[context setCurrentContext]
  • 这应该或多或少。还请确保将GLKViewcontext属性设置为OpenGL上下文,就像EAGLView一样。
1

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

OpenGL绝对不是我的专业领域,但是在将Flash游戏升级到iOS 6时,我遇到了类似的问题。我没有为新iPhone的视网膜显示器提供合适的launch images,我的应用程序运行在'兼容模式',在屏幕的顶部和底部留有边距。诚然,你并没有太大的利润空间,但它可能会让你的应用认为它的屏幕有多大。可能值得一试。

相关问题