3.x版本为实现遮罩层是重写visit这个虚函数么?无法达到效果,问题出在哪?

看了网上的“遮罩层实现捕鱼达人滚动数字表盘 ”,并按照例子敲了一遍代码。
原文代码如下:

void ScrollLabel::visit(){
    //启动遮罩效果
    glEnable(GL_SCISSOR_TEST);
    
    CCPoint  pos=CCPointZero;
    pos=visibleNode->getParent()->convertToWorldSpace(pos);
    CCRect rect =CCRectMake(pos.x, pos.y, 20, 20);
    //设置遮罩效果
    glScissor(rect.origin.x, rect.origin.y, rect.size.width, rect.size.height);

    CCNode::visit();
    
    //关闭遮罩效果
    glDisable(GL_SCISSOR_TEST);
}


```


我写的时候发现visit是final的,无法重写,所以改成重写visit(Renderer *renderer, const Mat4& parentTransform, uint32_t parentFlags)这个虚函数
代码如下
void ScrollLabel::visit(Renderer *renderer, const Mat4& parentTransform, uint32_t parentFlags)
{
    glEnable(GL_SCISSOR_TEST);
    Point pos = Point::ZERO;
    pos = visibleNode->getParent()->convertToWorldSpace(pos);
    Rect rect = Rect::Rect(pos.x, pos.y, 20, 20);
    glScissor(rect.origin.x, rect.origin.y, rect.size.width, rect.size.height);
    Node::visit(renderer, parentTransform, parentFlags);
    glDisable(GL_SCISSOR_TEST);
}


```


  

cocos2dx版本3.2 RC0
请问我写的哪里出错了?

没用过3.x的,在2.2.3里这个滚动数表盘是可以正常用的,不过要修改一些代码

请大家再帮忙看看,谢谢。

我也遇到同样的问题,请问楼主解决了吗?

把visit函数里面最后一段代码关闭遮罩 glDisable(GL_SCISSOR_TEST);去掉

我还没再3.2下用过这个特性,最近在学习3.2, 感觉
void ScrollLabel::visit(Renderer *renderer, const Mat4& parentTransform, uint32_t parentFlags)
{
glEnable(GL_SCISSOR_TEST);
Point pos = Point::ZERO;
pos = visibleNode->getParent()->convertToWorldSpace(pos);
Rect rect = Rect::Rect(pos.x, pos.y, 20, 20);
glScissor(rect.origin.x, rect.origin.y, rect.size.width, rect.size.height);
Node::visit(renderer, parentTransform, parentFlags);
glDisable(GL_SCISSOR_TEST);
}
用的有问题,现在3.x的渲染方式和以前不一样了,不在visit里直接写了,应该把这些放在CustomCommand 里使用,在渲染时候才会调用到

http://blog.csdn.net/u012945598/article/details/38340845 参考这篇文章吧

正解,说明管理OpenGL的状态方式变了

可参考 scrollview 把这几个函数拷贝到你自己的类里 修改下应该可以 我的scrollLayer就是这样改的
virtual void visit(Renderer *renderer, const Mat4 &parentTransform, uint32_t parentFlags)override;
void beforeDraw();
void onBeforeDraw();
void afterDraw();
void onAfterDraw();