首页 > 代码库 > Cocos2d-x 3.1.1 学习日志15--getContentSize和getContentSizeInPixels区别

Cocos2d-x 3.1.1 学习日志15--getContentSize和getContentSizeInPixels区别

cocos2d-x中使用getContentSize获得的就是逻辑点的大小,而getContentSizeInPixels获得的就是像素点的大小。 像素点和逻辑点的对应关系为:逻辑点的大小 = 像素大小 / contentScaleFactor。 

如果在高分辨率的平台上(如Iphone4),使用非高分辨率的图片资源,且设置contentScaleFactor为1.0,则IOS的Core Animation compositor 会自动拉伸非高分辨率的资源来适配, 使其在非高分辨率和高分辨率设备上的视觉效果是一样的。 

如果用户设置contentScaleFactor 为(1.0,2.0]之间的值,系统会使用用户设置的拉伸值。 

cocos2d-x提供了接口来设置contentScaleFactor, 接口为:CCDirector::setContentScaleFactor。 

了解了IOS分辨率的内幕后,再来解释一下问题产生的原因。 

问题1: 因为设置enableRetinaDisplay(false),contentScaleFactor为1.0,所以图片会被当成非高清资源,在显示的时候水平和竖直的分辨率都会被拉伸2倍。 

问题2:因为设置enableRetinaDisplay(true), contentScaleFactor为2.0,所以图片会显示成原有的像素大小。但是设置位置是使用setPosition,该接口设置的是逻辑位置。因为之前的位置是参考800*480的屏幕大小来设置的,所以当contentScaleFactor为2.0时,就相当于参考屏幕的像素大小为1600*960, 所以精灵的位置等都出现了错误。 


建议使用逻辑点 


下面解析一下坐标转换,直接贴源码: 
CCPoint CCDirector::convertToGL(const CCPoint& uiPoint) 

    CCSize s = m_obWinSizeInPoints; 
    float newY = s.height - uiPoint.y; 
    
    return ccp(uiPoint.x, newY); 


CCPoint CCDirector::convertToUI(const CCPoint& glPoint) 

    CCSize winSize = m_obWinSizeInPoints; 
    float oppositeY = winSize.height - glPoint.y; 
    
    return ccp(glPoint.x, oppositeY); 


两种坐标的X方向没有变,只变了Y方向。cocos2d里面默认的是GL坐标系,即左下角为原点ccp(0.0f.0.0f),在Y方向上向上增加,X横向增加。