首页 > Personal > cocos2d-x > cocos2d-x: 屏幕和分辨率
2013
12-13

cocos2d-x: 屏幕和分辨率

今天为了修改android上面的分辨率和屏幕方向,研究了一下cocos2d-x的屏幕相关的问题。

AppDelegate上面的applicationDidFinishLaunching会把CCDirector::sharedDirector()上的OpenGLView设为CCEGLView::sharedOpenGLView(),这个CCEGLView类里有几个屏幕相关的接口,
FrameSize是分辨率相关的接口,windows会默认设为480*320,android和ios会设置为设备分辨率,这个就是游戏中用到的分辨率,比如在android设备里如果设置了一个比系统分辨率小的分辨率的话,会看到整个游戏只占屏幕的一部分,所有cocos2d-x绘制的物体都不会在这个分辨率之外,有点类似windows中的窗口了。
DesignResolutionSize就想他的名字一样,就是说实际游戏设计的时候分辨是多少。他的设置接口setDesignResolutionSize前面就是这个分辨率,后边就是相对于这个分辨率的处理策略。
如果不设置的话,默认就是不做任何处理,就像我做的Demo一样,所有的物体都是安真实分辨率绘制,没有缩放。但是可以单独修改背景sprite的scale来保证屏幕上没有黑边。
kResolutionExactFit,是全屏的填充屏幕,把画面进行拉伸缩放,相对会改变横纵比降低画面品质。优势就是降低了因为横纵比不同所带来的游戏设计和实现的复杂度,简化了游戏设计。
kResolutionShowAll,是在不改变横纵比的前提下,在设备上显示所有游戏设计的分辨率,好像缩小了画面来适应屏幕一样,所以如果横纵比不同的话,会在左右或者上下产生黑边。
kResolutionNoBorder,也不改变设计的横纵比,但是和ShowAll相反,好像放大了画面来填满屏幕,所有会有部分画面已经在屏幕之外了。
kResolutionFixedHeight和kResolutionFixedWidth,顾名思义就是固定横向或者固定纵向,然后改变设计分辨率来适应屏幕分辨率的横纵比,再伸缩相应的横向或者纵向填满屏幕,屏幕外不会有画面,但是修改后的设计分辨率有可能会大于原来的设计分辨率,所以可能会出现黑边。
setDesignResolutionSize一定要在CCDirector::sharedDirector()设置好setOpenGLView之后调用,不然程序crash。

CCDirector里也有一些相关的接口,
WinSize,数值就是DesignResolutionSize,基本游戏中所有设计都需要考虑这个分辨率来进行。
VisibleSize和VisibleOrigin,VisibleSize就是目前显示的分辨率,kResolutionNoBorder会使VisibleSize不等于WinSize,因为有部分size在屏幕以外了,VisibleOrigin就是这部分可见部分的原点在WinSize中的位置。
ContentScaleFactor,通过缩放资源来适应屏幕的大小,如果没有修改过DesignResolutionSize,WinSize和VisibleSize都等于屏幕大小。该值越大,图片显示的越小。

屏幕方向的话,android默认是横向的。之前版本的setDeviceOrientation已经被取消了,如果需要修改的话,只需要修改proj.android目录下的AndroidManifest.xml文件把android:screenOrientation=”landscape”改为”portrait”。ios的默认方向也是纵向,修改的话在ios目录下的RootViewController.mm里将函数shouldAutorotateToInterfaceOrientation中的return UIInterfaceOrientationIsLandscape( interfaceOrientation );修改为return UIInterfaceOrientationIsPortrait( interfaceOrientation );然后将函数supportedInterfaceOrientations中的return UIInterfaceOrientationMaskAllButUpsideDown;修改为return UIInterfaceOrientationMaskPortrait;再将函数shouldAutorotate的return YES;修改为return NO;,最后把xcode工程配置的Deployment Info的Device Oriantation勾选从Landscape Left和Landscape Right改为Portrait,其实这个就相当于修改了Info.plist中的UISupportedInterfaceOrientations从UIInterfaceOrientationLandscapeLeft和UIInterfaceOrientationLandscapeRight变为UIInterfaceOrientationPortrait。
修改屏幕分辨率,mac的话在AppController.mm中,applicationDidFinishLaunching函数里修改rect的值,前两位是窗口在屏幕中的位置,后两位是窗口大小,如(500, 200, 480, 800)。windows的话在main.cpp中,修改setFrameSize的大小,如(480, 800)。

最后编辑:
作者:wy182000
这个作者貌似有点懒,什么都没有留下。

留下一个回复