【Cocos2d-x】3.3 ClippingRectangleNode与ClippingNode 以及 ClippingRectangleNode BUG

来源:互联网 发布:侠客风云传 战斗数据 编辑:程序博客网 时间:2024/06/04 18:58

在Cocos2d-x 的3.3 版本中,添加了一个新类 ClippingRectangleNode,此类与ClippingNode,均有裁剪作用。两个类做裁剪时有不同的适用背景。区别如下:


 

  ClippingRectangleNode

  ClippingNode

  裁剪区域

  只能为矩形

  任意图形

  效率

  高

  低,使用较多时,容易导致低端机掉帧

  适用场景  

  出现数量较多,且对裁剪图形要求不高时  

  出现数量少,对裁剪区域要求较高时。(例如游戏新手引导)

  灵活性

  使用简单,灵活性低

  较为灵活


在使用过程中,发现一个ClippingRectangleNode的bug,该bug导致ClippingRectangleNode或是其上层节点有进行缩放时,会使ClippingRectangleNode的裁剪区域变得异常。

相关代码如下:

void ClippingRectangleNode::onBeforeVisitScissor(){    if (_clippingEnabled) {        glEnable(GL_SCISSOR_TEST);                float scaleX = _scaleX;        float scaleY = _scaleY;        Node *parent = this->getParent();        while (parent) {            scaleX *= parent->getScaleX();            scaleY *= parent->getScaleY();            parent = parent->getParent();        }                const Point pos = convertToWorldSpace(Point(_clippingRegion.origin.x, _clippingRegion.origin.y));<span style="white-space:pre"></span>// 将裁剪区域的原点转为世界坐标系        GLView* glView = Director::getInstance()->getOpenGLView();        glView->setScissorInPoints(pos.x * scaleX,                                   pos.y * scaleY,                                   _clippingRegion.size.width * scaleX,                                   _clippingRegion.size.height * scaleY);    }}


开发人员在将裁剪区域的原点正确的转为世界坐标系之后, 又乘了scaleX 和 scaleY, 这就导致裁剪区域的原点变得不正常了。 (converToWorldSpace在转换pos时用的变化矩阵已将scale值计算过一次)

修改方法即将

     glView->setScissorInPoints(pos.x * scaleX,                                pos.y * scaleY,                                _clippingRegion.size.width * scaleX,                                _clippingRegion.size.height * scaleY);
改为

 glView->setScissorInPoints(pos.x,                            pos.y,                            _clippingRegion.size.width * scaleX,                            _clippingRegion.size.height * scaleY);

裁剪区域就正常了。


0 0
原创粉丝点击