cocos2dx 屏幕自适应

首先要明白,自适应经过两次缩放,一次是通过引擎方法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; //屏幕的画布大小, 就是EF
	screenRect.size.height  *= scaleY; //就是FG
	screenRect.origin		 = ccpCompMult(screenRect.origin,ccp(scaleX,scaleY));//屏幕的画布原点,就是点H
 
	s_screenRect.setRect(screenRect);
 
	/* 画布大小 */
	CCSize worldWinSize		 = WinEnv::worldWinSize();//画布大小,就是ABCD
	s_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);//就是点L
	s_originRect.setRect(CCRectMake(originWinOrigin.x,originWinOrigin.y,originWinSize.width,originWinSize.height));
那么在游戏中,如果是窗口模式的话,就把L点当成参考点,如果是全屏模式,就把H点当成参考点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值