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);
}