cocos2dx 屏幕自适应

来源:互联网 发布:我的淘宝回收站在哪里 编辑:程序博客网 时间:2024/05/17 10:04

首先要明白,自适应经过两次缩放,一次是通过引擎方法CCEGLView::sharedOpenGLView()->setDesignResolutionSize()来缩放,另一次是游戏里面由开发人员控制的,这也是本文章的讨论终点。

以下讨论的假如以960*640为设计分辨率,且手机屏幕分辨率为1280*720

下图各个矩形表示的意思:

ABCD: 设计分辨率程序缩放后的大小,也就是setDesignResolutionSize(AB,CDkResolutionNoBorder)

IJKL: 设计分辨率大小,这里为960*640

EFGH:手机屏幕分辨率(1280*720)经过引擎缩放前的尺寸

E1F1G1H1:手机屏幕分辨率1280*720

A1B1C1D1:ABCD经过引擎setDesignResolutionSize()缩放后的大小。

尺寸ABCD —> A1B1C1D1 就是通过setDesignResolutionSize()缩放的,    这个过程不用管,我们要控制的就是怎么从       IJKL—>ABCD.

首先确定要往X还是Y方向缩放,由于1280/960 = 1.33, 720/640 = 1.125,所以是偏宽的,由于手机屏幕内不能不限黑色区域,所以游戏内容要比手机屏幕EFGH大,如图中的ABCD,这个就是目标分辨率,

EF/E1F1 = FG/F1G1 且 E1F1=1280, FG=JK=640, F1G1=720, =>EF=1137.77

又由于

AB/IJ = BC/JK 且AB=EF=1137.77, JK=640, IJ=960 => BC=758.

到此已经算出设计分辨率缩放大小了,setDesignResolutionSize()设置即可。

CCEGLView* pEGLView= CCEGLView::sharedOpenGLView();CCRect screenRect;CCRect viewRect= pEGLView->getViewPortRect();//OpenGL视口大小screenRect.origin= ccpSub(CCPointZero,viewRect.origin);//屏幕的视口原点,就是上图H1点screenRect.size= pEGLView->getFrameSize();//屏幕的视口大小,就是上图矩形E1F1G1H1 float scaleX = 1.0f/pEGLView->getScaleX(); //就是A1B1C1D1->ABCD的缩放比float scaleY = 1.0f/pEGLView->getScaleY(); //同上 screenRect.size.width   *= scaleX; //屏幕的画布大小, 就是EFscreenRect.size.height  *= scaleY; //就是FGscreenRect.origin = ccpCompMult(screenRect.origin,ccp(scaleX,scaleY));//屏幕的画布原点,就是点H s_screenRect.setRect(screenRect); /* 画布大小 */CCSize worldWinSize = WinEnv::worldWinSize();//画布大小,就是ABCDs_worldRect.setRect(CCRectMake(0.0f,0.0f,worldWinSize.width,worldWinSize.height)); /* 原始窗口 */CCSize  originWinSize = ccSize(960, 640);CCPoint originWinOrigin = ccpMult(ccpSub(ccpFromSize(worldWinSize),ccpFromSize(originWinSize)),0.5f);//就是点Ls_originRect.setRect(CCRectMake(originWinOrigin.x,originWinOrigin.y,originWinSize.width,originWinSize.height));
那么在游戏中,如果是窗口模式的话,就把L点当成参考点,如果是全屏模式,就把H点当成参考点。

0 1
原创粉丝点击