我终于升级了一个非常旧的通用游戏应用程序我必须在更新的操作系统和设备尺寸上玩得很好 - 我现在已经更新了所有内容并针对 iOS 6.1 但是当我在 iPhone 5 上运行它时,我的实际游戏视图,它是使用 open GL 渲染到 EAGLView 中的,它的位置非常奇怪,并且显示了很多剪辑(见截图)。
在我们第一次创建它时周围的“普通”设备上,一切都按预期显示。
在我的视图控制器中,我基本上加载了一个为不同设备设置了正确尺寸的笔尖——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);
这不是我最擅长的知识领域,所以如果我遗漏了什么,请告诉我,如果需要,我可以为您提供更多信息。如果有人有“哈哈”或类似的经历,我会很感激一些正确方向的提示。
谢谢