分辨率有三个相关的东西:resourceSize资源尺寸,designSize设计尺寸,screenSize屏幕尺寸。
假如屏幕尺寸为800*1200,而设计尺寸为320*480(cocos默认都是这个值),而提供的资源没有800*1200,假设使用640*960的资源。
ContentScaleFactor 则为640/320=2,存储在CCDirector中,资源到设计尺寸的缩放时使用的宏CC_RECT_POINTS_TO_PIXELS转换的。
在显示的时候,又将设计尺寸转换为屏幕尺寸,CC_RECT_PIXELS_TO_POINTS进行转换。在CCEGLViewProtocol::setDesignResolutionSize中保存由设计尺寸到屏幕尺寸的缩放。最后一个参数的意义为:
kResolutionNoBorder:超出屏幕的部分会被裁剪,两侧没有黑边,铺满屏幕,按图片原始比例显示,图片不变形。
kResolutionShowAll:整个游戏界面是可见的,会按原始比例进行缩放,图片不变形,但两侧可能会留有黑边,不铺满屏幕。
kResolutionExactFit:整个游戏界面是可见的,图片可能会进行拉伸或者压缩处理,铺满屏幕,图片会变形。
曾遇到的bug:在以上参数下,我用ccbi创建了一个menuImage,然后,使用js脚本cc.TextureCache.getInstance().addImage("buttonUI/page-0001.png");加载Texture,然后以大小cc.rect(0,0, selected.getContentSizeInPixels().width, selected.getContentSizeInPixels().height),创建SpriteFrame,然后传入setNormalSpriteFrame接口,结果发现创建的menu总是比图片大了许多(2.5倍),原来在创建SpriteFrame的时候,CC_RECT_POINTS_TO_PIXELS将传入的图片大小,放大到屏幕尺寸,导致图片跑到了menu的左上角。menu创建的时候再次将放大到屏幕尺寸,导致显示的menu比预期大了2.5倍,而图片显示正常,只是位置错乱(思考为啥)。