我终于升级了一个非常古老的通用游戏应用程序我必须适应更新的操作系统和设备大小 - 我已经更新了一切,并将iOS 6.1定位到正确的位置现在,但是当我在iPhone 5上运行它时,我的实际游戏视图(使用开放式GL渲染到EAGLView中)非常奇怪,显示了很多剪辑(请参见屏幕截图)。将旧应用程序升级到iOS 6 - 在iPhone 5上打开GL问题
在保留它们在我们第一次创造了这个时候,“正常”的设备,如预期出现的一切。
在我的视图控制器,我基本上加载笔尖与不同设备设置正确的大小 - 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);
这是不我所知最强的区域,所以让我知道如果我错过了一些东西,我可以给你更多的信息,如果需要。如果任何人有“一哈”或类似的经验,我会感激一些正确的方向提示。
谢谢
我注意到你的第一个代码块中的WideScreen情况的'setCenter'调用不符合其他情况下的模式:你有我认为应该是的CGPointMake(160,293)案例)CGPointMake(160,284)。这可能是问题吗? – GuyRT
不幸的是,@GuyRT,这没有效果。尽管如此,赶上! – Mustafakidd