【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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月23日 23时12分35秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
C# richTextBox显示不同颜色文字
2019-04-29
C#连接ACCESS
2019-04-29
c#richtextbox的内容保存为TXT文本
2019-04-29
Windows.old可以删除吗?
2019-04-29
VS2012类视图查看函数
2019-04-29
VS项目添加附加目录
2019-04-29
VS找到汇编指令对应的16进制字符
2019-04-29
VS生成依赖项关系图
2019-04-29
VC6.0栈回溯
2019-04-29
VS2010:Tips
2019-04-29
VS改项目名称
2019-04-29
ArcMap加载SHP文件
2019-04-29
arcgis如何导出属性表为excel
2019-04-29
nextcloud 修改 logo
2019-04-29
nextcloud通过不被信任的域名访问
2019-04-29
Nextcloud使用手册
2019-04-29
HDFS操作命令
2019-04-29
SQL排序问题
2019-04-29