请问cocos2d-x的适配方案中,引擎底层缩放精灵的代码在哪个位置。

在cocos2d-x默认的适配方案下,一般是调这个方法设置:

pEGLView->setDesignResolutionSize(w,h,kResolutionxxxx);

这个方法里面计算了缩放值,比如一张背景图480x320。但是在指定适配模式下,如setDesignResolutionSize(480,320,kResolutionShowAll),我拿到分辨率为960x640的设备上显示,这个图片还是占满全屏幕的。
很明显这个精灵在底层绘制的时候就已经进行了2倍的缩放。执行这个缩放的代码在哪儿呢。。。找了一下午都没找到。。。求指导。。。。

底层是对整个GLView进行了缩放,哎。精灵只是一个子节点,根节点是GLView。

是对整个GLView缩放的啊。那这个代码在哪儿呢。。。GLView的相关代码也找过,还是没找到,可能是漏掉了哪儿。这个GLView各平台是分开实现的。IOS 和Android的对应缩放代码在哪儿呢。求指导。。。

请把你delegete里面的bool AppDelegate::applicationDidFinishLaunching() {

}

函数里面的所有代码发给我一下。我帮你看看。show all 的话是不会出现这个问题的

— Begin quote from ____

引用楼主冬燚于2014-01-20 16:09发表的 请问cocos2d-x的适配方案中,引擎底层缩放精灵的代码在哪个位置。 :
在cocos2d-x默认的适配方案下,一般是调这个方法设置:

pEGLView->setDesignResolutionSize(w,h,kResolutionxxxx);
http://www.cocoachina.com/bbs/job.php?action=topost&tid=181985&pid=tpc

— End quote

:12: 代码没什么问题。。。。
我是想问下引擎自己做缩放的底层代码在哪个位置。。。。

查看这个
Node::transform

— Begin quote from ____

引用第4楼冬燚于2014-01-20 17:12发表的 回 3楼(yuye-chukong) 的帖子 :
:12: 代码没什么问题。。。。
我是想问下引擎自己做缩放的底层代码在哪个位置。。。。 http://www.cocoachina.com/bbs/job.php?action=topost&tid=181985&pid=877912

— End quote

额,可能是我问题没写清楚,我指的缩放不是精灵直接setScale那个缩放,不是操作矩阵进行变换的。
我说的是在适配模式下,引擎进行在绘制图片的时候 应该是进行了缩放的。比如我1楼说的那个例子。
像在这种情况下获取精灵的scale值是为1的。所以我想这并不是通过矩阵变换来缩放的吧,也就是应该不是Node里面的transform控制吧。

参考下 CCEGLViewProtocol 这个类。

:9: CCEGLViewProtocol这个类 翻来覆去看了几遍啊。没找到有缩放EGLView的相关代码啊。
设置适配模式的函数setDesignResolutionSize里面有一些缩放值的计算。计算出来的缩放值用来计算viewPort之类的。
有个这个函数:setViewPortInPoints 计算Opengl需要绘制的窗口大小。这个函数在CCDirector的setViewPort里面有调。传的点就是零点和winSize的尺寸。viewPort的大小计算出来的尺寸就等于实际屏幕大小的尺寸左右(屏幕比例等于winSize的比例 算出来的尺寸就等于实际分辨率大小。比例不等,根据showAll和Noborder的不同计算出来的Viewport尺寸相应偏小或偏大)。
也就是说Opengl最终要绘制的窗口大小基本上是和实际屏幕分辨率尺寸相近的一个大小。回到1楼的例子。假如在showAll模式下(Noborder也可,这个模式不是重点。)
屏幕实际分辨率为960x640. showAll模式下winSize设置的是480x320. 因为适配模式的关系。我显示一张480x320的背景图肯定是占满全屏的。但这个时候,程序计算出来的,Opengl需要绘制的窗口大小实际是960x640的。一张背景图实际大小才480x320,能占满全屏,肯定是进行缩放了的。这段的缩放代码在哪儿呢。。。因为缩放值是在设置适配模式的时候计算出来了的,我之前觉得可能是每个精灵单独绘制上去的时候都有相应的缩放。2楼说是直接缩放的根节点,EGLView。这也很有道理,估计也是直接缩放EGLView的。可是缩放EGLView的代码又在哪儿呢。。。
不知道这么说 大家看明白问题没。。。:12:

视口大小是用glViewport设置的,可以理解为先按designResolution去画,然后将整个画面映射到glViewport指定的范围和大小。

也就是说把GLView渲染在设定好的视口中,这个GLView全屏拉伸铺满这个视口,整个游戏画面就被一起缩放了么。这么说好像是这样的。
能找出具体代码在哪个位置么。比如把GLView渲染到屏幕上的代码。。。。不看代码心不死啊。。:12:

CCEGLViewProtocol类中,把代码改了部分验证了下GLView全屏拉伸来铺满整个Opengl的视口。
void CCEGLViewProtocol::setViewPortInPoints(float x , float y , float w , float h)
{
if (m_eResolutionPolicy == kResolutionShowAll)
{
glViewport((GLint)(0),
(GLint)(0),
(GLsizei)(w * m_fOldScaleX),
(GLsizei)(h * m_fOldScaleY));//m_fOldScaleX和m_fOldScaleY是winSize和frameSize的对应长宽比例,计算后就等于framesize,即屏幕的实际分辨率
}else
{
glViewport((GLint)(x * m_fScaleX + m_obViewPortRect.origin.x),
(GLint)(y * m_fScaleY + m_obViewPortRect.origin.y),
(GLsizei)(w * m_fScaleX),
(GLsizei)(h * m_fScaleY));
}
}
原来的函数中仅else部分代码。改了后。在showAll的模式下,我直接把视口设置成framesize的大小,起点为(0,0)(就是屏幕的左下角)。也就是现在视口大小正好是屏幕的大小。
因为是showAll的模式,在setDesignResolutionSize这个函数里最终有这个 m_fScaleX = m_fScaleY = MIN(m_fScaleX, m_fScaleY);也就是按原来的猜想,如果在绘制的时候单独缩放每个精灵,或者最后缩放GLView 都应该使用这个缩放值(即MIN(m_fScaleX, m_fScaleY))。
可是运行结果,背景图占满了整个屏幕,并且被拉伸了。所以我觉得MIN(m_fScaleX, m_fScaleY)得到的缩放值 并没有用于缩放精灵或者说缩放GLView。有缩放的效果 仅仅因为是把GLView平铺在视口中,而这个视口是按等比例来算的。所以铺出来不会变形。
其实代码这么改了后设置视口就和kResolutionExactFit这个适配模式一样 设置为屏幕实际分辨率的大小,仅仅因为是ShowAll多计算了一个缩放比,可这个缩放比除了用在计算视口 并没有用在其他地方。
现在基本确定是GLView平铺在视口中来缩放的。不知道这么说对不。
如果有大神来解释下这个GLView拉伸平铺在视口中的过程就好了。。。Opengl了解的不是很多。希望有大牛指点指点。。。:14:

在CCEGLViewProtocol::setDesignResolutionSize函数中计算了三个量m_fScaleX,m_fScaleY,m_obViewPortRect。
然后在CCDirector::setProjection里调用setViewport,setViewport里调用setViewportInPoints,setViewportInPoints里调用glViewport,而glViewport的参数就是由m_fScaleX,m_fScaleY,m_obViewPortRect这三个量来提供的。

哦,从楼主上面帖子来看已经注意到这些了。不好意思我没好好看帖。