前几天更新了3.3引擎代码 和 2.0.5的 Cocostudio
工程文件重新做了一下, 但发现之前的 自定义的shader没效果了, 后来发现是 编辑器内部实现将部分节点类型 改成了 Scale9Sprite ,之前的pWidge->getVirtualRenderer()->setGLProgram(pGLProgram)没效果了,
后来修改为如下代码:
Node* pNode = pWidge->getVirtualRenderer();
Scale9Sprite* pS9Sprite = dynamic_cast<Scale9Sprite*>(pWidgetIconImage->getVirtualRenderer());
if (pS9Sprite)
{
pS9Sprite->getSprite()->setGLProgram(pGlProgram);
}
else
{
pNode->setGLProgram(pGlProgram);
}
效果恢复,
但这个设计还是比较危险的, 上述代码只处理了Scale9Sprite的shader问题, 如果官方哪一天 又搞了个新控件 getVirtualRenderer()->setGLProgram(pGLProgram) 这样设置还是有问题的话, 我们的效果就又不对了
所以个人建议 如果Scale9Sprite的setGLProgram没有冲突的话, setGLProgram修改为虚方法, Scale9Sprite 重写一个setGLProgram 实现类似 getSprite()->setGLProgram的方法,
这样 我们上层逻辑就不关心 是不是Scale9Sprite或者其他节点类型, 直接调用pWidge->getVirtualRenderer()->setGLProgram(pGLProgram) 就OK了, 安全保险
漂亮,我也因为这个scale9sprite 的改动,导致一些bug