【Cocos2d-x】Cocos2d-x 3.0 区域裁切 的具体应用之游戏公告显示
发布日期:2021-06-28 22:16:24 浏览次数:2 分类:技术文章

本文共 4988 字,大约阅读时间需要 16 分钟。

// on "init" you need to initialize your instancebool HelloWorld::init(){    // 1. super init first    if ( !Layer::init() )    {        return false;    }        Size visibleSize = Director::getInstance()->getVisibleSize();    Point origin = Director::getInstance()->getVisibleOrigin();    // add "HelloWorld" splash screen"    auto sprite = Sprite::create("HelloWorld.png");    sprite->setPosition(Point(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));    this->addChild(sprite, 0);    glEnable(GL_SCISSOR_TEST);// 开启显示指定区域    return true;}
void HelloWorld::visit(Renderer *renderer, const kmMat4& parentTransform, bool parentTransformUpdated){        float x = 100;    float y = 100;    float n_width = Director::getInstance()->getWinSize().width;    float n_height = Director::getInstance()->getWinSize().height/2;    log("x = %f,y = %f,w = %f,h = %f",x,y,n_width,n_height);    glScissor(x, y, n_width, n_height);     // 只显示当前窗口的区域    Layer::visit(renderer, parentTransform, parentTransformUpdated);//显示父类的内容    //glDisable(GL_SCISSOR_TEST);             // 禁用            return;	}
glScissor 显示当前窗口的区域
利用这个函数可以实现 类似游戏公告的显示
// on "init" you need to initialize your instancebool HelloWorld::init(){    // 1. super init first    if ( !Layer::init() )    {        return false;    }        Size visibleSize = Director::getInstance()->getVisibleSize();    Point origin = Director::getInstance()->getVisibleOrigin();    // add "HelloWorld" splash screen"    auto sprite = Sprite::create("HelloWorld.png");    sprite->setPosition(Point(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));    this->addChild(sprite, 0);    sprite->setTag(1000);    return true;}void HelloWorld::visit(Renderer *renderer, const kmMat4& parentTransform, bool parentTransformUpdated){        this->beforeDraw(renderer, parentTransform, parentTransformUpdated);    Node::visit(renderer, parentTransform, parentTransformUpdated);//显示父类的内容    this->afterDraw(renderer, parentTransform, parentTransformUpdated);    	}void HelloWorld::setNeedClip(bool need){	mIsNeedClip=need;}bool HelloWorld::isNeedClip(){	return mIsNeedClip;}void HelloWorld::beforeDraw(Renderer *renderer, const kmMat4& parentTransform, bool parentTransformUpdated){    _beforeDrawCommand.init(_globalZOrder);    _beforeDrawCommand.func = CC_CALLBACK_0(HelloWorld::onBeforeDraw, this,parentTransform, parentTransformUpdated);    renderer->addCommand(&_beforeDrawCommand);}static Rect mClip;static int mClipCounter=0;float math_abs(float v){	if(v>0){		return v;	}	return 0-v;}float math_max(float v1,float v2){	if(v1>v2){		return v1;	}	return v2;}float math_min(float v1,float v2){	if(v1>v2){		return v2;	}	return v1;}void HelloWorld::onBeforeDraw(const kmMat4& parentTransform, bool parentTransformUpdated){        int clipW=1024;    int clipH=768/4;        bool needClip=clipW>0&&clipH>0;        if(isNeedClip()&&needClip){        glEnable(GL_SCISSOR_TEST);        Point selfPos =Point(790,500);//this->getPosition();                float scaleX = 1;        float scaleY = 1;                Rect viewPortRect =  Director::getInstance()->getOpenGLView()->getViewPortRect();        float clipX=selfPos.x *scaleX  +  viewPortRect.origin.x;        float clipY=selfPos.y * scaleY  +  viewPortRect.origin.y;        clipW*=scaleX;        clipH*=scaleX;        if(mClipCounter>0){            saveOldRect=mClip;            float right=math_min(clipX+clipW,mClip.origin.x+mClip.size.width);            float top=math_min(clipY+clipH,mClip.origin.y+mClip.size.height);            clipX=math_max(clipX,mClip.origin.x);            clipY=math_max(clipY,mClip.origin.y);            clipW=right-clipX;            clipH=top-clipY;            if(clipW<0){                clipW=0;            }            if(clipH<0){                clipH=0;            }        }        if(clipW>0&&clipH>0){            //glScissor(clipX  ,clipY ,clipW, clipH);            Director::getInstance()->getOpenGLView()->setScissorInPoints(clipX  ,clipY ,clipW, clipH);//设定裁切区域大小            mClip=Rect(clipX,clipY,clipW,clipH);        }        mClipCounter++;    }}void HelloWorld::afterDraw(Renderer *renderer, const kmMat4& parentTransform, bool transformUpdated){    _afterDrawCommand.init(_globalZOrder);    _afterDrawCommand.func = CC_CALLBACK_0(HelloWorld::onAfterDraw, this,parentTransform, transformUpdated);    renderer->addCommand(&_afterDrawCommand);    }void HelloWorld::onAfterDraw(const kmMat4& parentTransform, bool parentTransformUpdated){    int clipW=1024;    int clipH=768/4;    bool needClip=clipW>0&&clipH>0;    if(isNeedClip()&&needClip){        mClipCounter--;        if(mClipCounter<=0){            glDisable(GL_SCISSOR_TEST);        }else{            mClip=saveOldRect;            //glScissor(mClip.origin.x  ,mClip.origin.y ,mClip.size.width, mClip.size.height);            Director::getInstance()->getOpenGLView()->setScissorInPoints(mClip.origin.x  ,mClip.origin.y ,mClip.size.width, mClip.size.height);//设定裁剪显示区域        }    }}

转载地址:https://blog.csdn.net/yhhwatl/article/details/23532533 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【cocos2d-x】cocoStdio帧事件
下一篇:【IOS】IOS 获取当前内存使用情况

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月23日 23时12分35秒