cocos2d-x中的尺寸之一

cocos2d-x中的尺寸函数繁多,官方文档对各种尺寸没有很好的描述,网上文章更加寥寥,对尺寸和位置的理解如果不到位,写代码就非常困难,需要猜测尝试,效率低下。这个文章我将研究一些我所迷惑的尺寸函数,记录在此。

先看如下代码:

bool AppDelegate::applicationDidFinishLaunching() {
    // initialize director
    CCDirector* pDirector = CCDirector::sharedDirector();
    CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();
	pDirector->setOpenGLView(pEGLView);

	pDirector->getWinSize();
	pDirector->getWinSizeInPixels();
	pDirector->getVisibleSize();

	pEGLView->getFrameSize();
	pEGLView->getDesignResolutionSize();
	pEGLView->getVisibleSize();

在applicationDidFinishLaunching中,我们上面函数调用分别是什么意思呢,粗略的说是窗口大小呗,通过CCLOG我们把调试信息打印出来,代码变成如下:

CCSize size;
	size = pDirector->getWinSize();
	CCLOG("width = %f height = %f, pDirector->getWinSize", size.width, size.height);
	size = pDirector->getWinSizeInPixels();
	CCLOG("width = %f height = %f, pDirector->getWinSizeInPixels", size.width, size.height);
	size = pDirector->getVisibleSize();
	CCLOG("width = %f height = %f, pDirector->getVisibleSize", size.width, size.height);

	size = pEGLView->getFrameSize();
	CCLOG("width = %f height = %f, pEGLView->getFrameSize", size.width, size.height);
	size = pEGLView->getDesignResolutionSize();
	CCLOG("width = %f height = %f, pEGLView->getDesignResolutionSize", size.width, size.height);
	size = pEGLView->getVisibleSize();
	CCLOG("width = %f height = %f, pEGLView->getVisibleSize", size.width, size.height);

打印出来调试信息如下:


从调试信息看,默认的程序,这些尺寸都是一样的,是有点头疼吧,都是一样的,你搞那么多尺寸干嘛呢.......

为了让这些值不一样,我们试着加一些代码。加一行代码如下:


bool AppDelegate::applicationDidFinishLaunching() {
    // initialize director
    CCDirector* pDirector = CCDirector::sharedDirector();
    CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();
	pDirector->setOpenGLView(pEGLView);

	pDirector->setContentScaleFactor(2.0f);

	CCSize size;
	size = pDirector->getWinSize();
	CCLOG("width = %f height = %f, pDirector->getWinSize", size.width, size.height);
	size = pDirector->getWinSizeInPixels();
	CCLOG("width = %f height = %f, pDirector->getWinSizeInPixels", size.width, size.height);
	size = pDirector->getVisibleSize();
	CCLOG("width = %f height = %f, pDirector->getVisibleSize", size.width, size.height);

	size = pEGLView->getFrameSize();
	CCLOG("width = %f height = %f, pEGLView->getFrameSize", size.width, size.height);
	size = pEGLView->getDesignResolutionSize();
	CCLOG("width = %f height = %f, pEGLView->getDesignResolutionSize", size.width, size.height);
	size = pEGLView->getVisibleSize();
	CCLOG("width = %f height = %f, pEGLView->getVisibleSize", size.width, size.height);
	

增加了一行代码 pDirector->setContentScaleFactor(2.0f);这个函数从字面上的解释是设置缩放因子,参数为2,输出调试信息如下:


这个函数影响了pDirector->getWinSizeInPixels也就是说,让窗口的分辨率变大了,其他没变,这里的分辨率是cocos2dx自定义的这种分辨率,和屏幕分辨率没有关系

这样的话,程序运行的结果也变化了


对比以前没有这句话的程序结果:


我们发现480x320的图片,在setContentScaleFactor之后变小了,事实上不是图片变小了,而是窗口的分辨率变大了而已。

按钮之类的也变小了,都变成了一半大小,所以getWinSizeInPixels返回的是窗口的分辨率大小,而这个分辨率大小受

setContentScaleFactor影响。


其实我们通过cocos2dx源代码也可以看到这点:

CCSize CCDirector::getWinSize(void)
{
    return m_obWinSizeInPoints;
}

CCSize CCDirector::getWinSizeInPixels()
{
    return CCSizeMake(m_obWinSizeInPoints.width * m_fContentScaleFactor, m_obWinSizeInPoints.height * m_fContentScaleFactor);
}



posted on 2014-03-23 10:00  三少爷的剑123  阅读(197)  评论(0编辑  收藏  举报

导航