我终于升级了一个非常古老的通用游戏应用程序,我必须使用更新的操作系统和设备尺寸 - 我已经更新了所有内容并立即定位到iOS 6.1但是当我在iPhone 5上运行它时,我的实际在游戏视图中,使用开放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);
这是不是我最强大的知识领域,所以如果我错过了某些内容,请告诉我,如果需要,我可以为您提供更多信息。如果有人有“哈哈”或类似的经历,我会欣赏一些正确方向的提示。
由于
答案 0 :(得分:2)
简短回答,开始使用GLKView
代替EAGLView
。
首先,了解设置的最佳做法的好方法,例如最新版本的iOS中的OpenGL上下文是使用“OpenGL游戏”模板创建一个新项目,并查看参考。
最重要的区别是GLKView
(在iOS 5.0中引入),它极大地简化了您的工作。它将处理您现在手动执行的大部分操作,包括设置视口。
EAGLView
替换为GLKView
(确保在项目中引用GLKit.framework
)。setFramebuffer
方法的调用。 GLKit会为您解决这个问题。[self.view setTransform:]
电话。如果您的应用是全屏OpenGL,则无需使用视图转换。 (事实并非如此,可能仍然不需要它。)[context setCurrentContext]
的某个地方拨打viewDidLoad
。context
的{{1}}属性设置为OpenGL上下文,就像GLKView
一样。答案 1 :(得分:1)
我建议确保您的发布图片是最新的。
OpenGL绝对不是我的专业领域,但在将Flash游戏升级到iOS 6时我遇到了类似的问题。我没有为新iPhone等的视网膜显示提供适当的launch images和我的应用程序在“兼容模式”下运行,屏幕顶部和底部有边距。不可否认,你没有这些利润,但它可能会弄乱你的应用程序认为它的屏幕有多大。可能值得一试。
答案 2 :(得分: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)。
答案 3 :(得分:0)
看起来你正在进行的转换是在设置视图的框架之后,因此可以改变边界。我建议打破你的draw方法并检查视图及其图层的界限。
请记住,框架是从父级的角度设置的,而边界是在本地坐标中。来自UIView.h:
如果视图被转换,不使用frame,因为它不正确 反映视图的实际位置。使用bounds + center。