文档章节

cocos2d-x 3.x UILayout里的裁剪bug

 为往圣继绝学
发布于 2016/05/17 12:49
字数 503
阅读 66
收藏 0
点赞 2
评论 0

我们项目有个需求,实行任意形状的遮罩,并且可能有多层叠加,嵌套,blendmode无法实现这么复杂的功能,而如果使用rendertexture呢,效率会变得很低,失帧严重,所以最终决定使用stencil这个opengl的功能。

这样的话跟UIListView里的stencil就有冲突了,然而,UIListView里的裁剪都是矩形,所以用stencil来实现未免大材小用,于是决定将UIListView里的裁剪修改为SCISSOR。

本以为直接将构造函数里的setClippingType改成ClippingType::SCISSOR就行了,可是,改完了发现两个问题,1位置不对,2,有时候多层嵌套,显示不对。

可能是官方默认用了stencil之后没有测试过SCISSOR的显示,其实修改Layout:getClippingRect()方法就行了,这里要考虑的是如果父节点或者更上层的节点也带了裁剪,那么计算时,这个rect就不能超出父节点的裁剪范围。

主要修改如下


const Rect& Layout::getClippingRect() 
{
    if (_clippingRectDirty)
    {
        Vec2 worldPos = convertToWorldSpace(Vec2::ZERO);
        AffineTransform t = getNodeToWorldAffineTransform();
        float scissorWidth = _contentSize.width*t.a;
        float scissorHeight = _contentSize.height*t.d;
        Rect parentClippingRect;
        Node* parent = this;//这里的原来是Layout* parent,当然这么改之后,Node也要改,加一个isClippingEnabled()函数

        while (parent)
        {
//这里原来是转换为Layout,这样的问题是如果中间有一个节点不是Layout的话,嵌套关系就会中断,裁剪区域就会有问题
            parent = dynamic_cast<Node*>(parent->getParent());

            if(parent && parent->isClippingEnabled())
			{
				Layout * layoutP = dynamic_cast<Layout*>(parent);
				if (layoutP != nullptr)
				{
					_clippingParent = layoutP;
					break;
				}
            }
        }
        
        if (_clippingParent)
        {
            parentClippingRect = _clippingParent->getClippingRect();
            //以下也是重写了的,原来的区域计算完全不对
			float finalX = worldPos.x;
			float finalY = worldPos.y;
			float finalWidth = scissorWidth;
			float finalHeight = scissorHeight;
			if (finalX < parentClippingRect.origin.x) finalX = parentClippingRect.origin.x;
			if (finalY < parentClippingRect.origin.y) finalY = parentClippingRect.origin.y;
			if (worldPos.x + scissorWidth>parentClippingRect.origin.x + parentClippingRect.size.width)
				finalWidth = parentClippingRect.origin.x + parentClippingRect.size.width - worldPos.x ;
			if (worldPos.y+scissorHeight>parentClippingRect.origin.x+parentClippingRect.size.height)
				finalHeight=parentClippingRect.origin.y+parentClippingRect.size.height-worldPos.y;

            _clippingRect.origin.x = finalX;
            _clippingRect.origin.y = finalY;
            _clippingRect.size.width = finalWidth;
            _clippingRect.size.height = finalHeight;
        }
        else
		{
			_clippingRect.origin.x = worldPos.x;
			_clippingRect.origin.y = worldPos.y;
            _clippingRect.size.width = scissorWidth;
            _clippingRect.size.height = scissorHeight;
        }
        _clippingRectDirty = false;
    }
    return _clippingRect;
}

 

© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 4
码字总数 2798
作品 0
朝阳
高级程序员
谈一谈Cocos2d-x中的某些“大小”

[Cocos2d-x相关教程来源于红孩儿的游戏编程之路 CSDN博客地址:http://blog.csdn.net/honghaier] 红孩儿Cocos2d-X学习园地QQ群:249941957加群写:Cocos2d-x 谈一谈Cocos2d-x中的某些“大小”...

长平狐 ⋅ 2013/03/19 ⋅ 0

谈一谈Cocos2d-x中的某些“大小”

[Cocos2d-x相关教程来源于红孩儿的游戏编程之路 CSDN博客地址:http://blog.csdn.net/honghaier] 红孩儿Cocos2d-X学习园地QQ群:249941957加群写:Cocos2d-x 谈一谈Cocos2d-x中的某些“大小”...

长平狐 ⋅ 2012/11/19 ⋅ 1

移动应用和游戏开发两个阶段在线视频培训的未来计划

在51CTO学院开线上视频课程已经3个多月了,也上了不少课。不过发现还有很多课没有开。现在就将未来的开课计划公布一下。计划分为两个阶段。第一阶段主要是Cocos2d-x和Cocos2d-js的游戏开发培...

androidguy ⋅ 2014/08/12 ⋅ 0

游戏示例的源码有错误

我按《cocos2d-x 3.x 游戏开发之旅》这本书的一个游戏示例敲的代码,也从作者的网站上下了示例源码看了,没有发现代码的问题。 我是Xcode7.3,cocos2d-x3.x但是编译的时候出现了问题,开始的...

光明使者___ ⋅ 2016/06/05 ⋅ 0

Cocos2d-js中使用纹理对象创建Sprite对象

本节我们会通过一个实例介绍纹理对象创建Sprite对象使用,这个实例如图5-2所示,其中地面上的草是放在背景(如下图所示)中的,场景中的两棵树是从后图所示的“树”纹理图片中截取出来的,图...

智捷课堂 ⋅ 2015/03/28 ⋅ 0

Cocos2d-x 脚本语言Lua的使用

前面几篇博客已经把Lua的相关基础知识介绍了,本篇博客就来介绍一下,如何在Cocos2d-x项目中使用Lua这门脚本语言进行开发。由于笔者使用的时Mac系统,所以演示给大家的时在XCode当中运行我们...

tropicofcancer9 ⋅ 04/19 ⋅ 0

quick-2.x.x触摸管理机制

lua 代码写起来真的很快,项目开发速度要快不少;开始用quick也快半年了,一直在赶项目内容;也没怎么花时间去看quick-2.x.x和cocos2d-x-2.x.x有什么区别……; 今天碰到一个touch事件问题,...

熊友良 ⋅ 2015/03/23 ⋅ 0

Cocos2d-x 3.x中Draw calls与ZOrder和纹理材质的关系

在Cocos2d-x 3.x中官方优化了引擎渲染的过程 例子 假如有A,B,C三个在不同plist的纹理,且他们的材质不相同,如果程序中 A-1 (表示 addChild(A,1),以下一样) B-1 C-1 Cocos2d-x引擎首先会根...

贺路的路 ⋅ 2016/10/20 ⋅ 0

Cocos开发中Visual Studio下libcurl库开发环境设置

我们介绍一下win32中Visual Studio下libcurl库开发环境设置。 Cocos2d-x引擎其实已经带有为Win32下访问libcurl库,Cocos2d-x 3.x中libcurl库文件所在位置是<工程目录>cocos2dexternalcurlpre...

智捷课堂 ⋅ 2014/10/31 ⋅ 0

Cocos2d-x Lua中Sprite精灵类

精灵类是Sprite,它的类图如下图所示。 Sprite类图 Sprite类直接继承了Node类,具有Node基本特征。此外,我们还可以看到Sprite类的子类有:PhysicsSprite和Skin。PhysicsSprite是物理引擎精灵...

智捷课堂 ⋅ 2015/05/11 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

如何解决s权限位引发postfix及crontab异常

一、问题现象 业务反馈某台应用服务器,普通用户使用mutt程序发送邮件时,提示“postdrop warning: mail_queue_enter: create file maildrop/713410.6065: Permission denied”,而且普通用法...

问题终结者 ⋅ 29分钟前 ⋅ 0

Unable to load database on disk

由于磁盘空间满了以后,导致zookeeper异常退出,清理磁盘空间后,zk启动报错,信息如下: 2018-06-25 17:18:46,904 INFO org.apache.zookeeper.server.quorum.QuorumPeerConfig: Reading co...

刀锋 ⋅ 48分钟前 ⋅ 0

css3 box-sizing:border-box 实现div一行多列

<!DOCTYPE html><html><head><style> div.container{ background:green; padding:10px 10px;}div.box{box-sizing:border-box;-moz-box-sizing:border-box; /* Fir......

qimh ⋅ 53分钟前 ⋅ 0

Homebrew简介和基本使用

一、Homebrew是什么 Homebrew是一款Mac OS平台下的软件包管理工具,拥有安装、卸载、更新、查看、搜索等很多实用的功能。简单的一条指令,就可以实现包管理,而不用你关心各种依赖和文件路径...

说回答 ⋅ 今天 ⋅ 0

文件压缩和打包zip、tar

第六章 文件压缩和打包 6.5 zip压缩工具 zip命令可以用来解压缩文件,或者对文件进行打包操作。zip是个使用广泛的压缩程序,文件经它压缩后会另外产生具有“.zip”扩展名的压缩文件。 注意:...

弓正 ⋅ 今天 ⋅ 0

vuex

一、状态对象如何赋值给内部对象。三种方式: 1、使用computed赋值,一定要写this,不然找不到$store。 computed:{ count(){ return this.$store.state.count; }} 2、通...

大美琴 ⋅ 今天 ⋅ 0

javaScript 设计模式

1、构造函数模式 ` /** 构造一个动物的函数 */ function Animal(name, color){ this.name = name; this.color = color; this.getName = function(){ return this.name; } } // 实例一个对象 ......

fangPeng_ ⋅ 今天 ⋅ 0

日常嘚瑟:TeamCity构建中解压和打包tar

要弄一个新的构建,很简单,从两个构建的tar格式Artifact中分别取一部分,重新打一个tar。 所以,我去写个脚本用curl下载两个依赖的Artifact,然后解压移动重新打个tar? 开什么玩笑,我的技...

谷永权 ⋅ 今天 ⋅ 0

Istio官方文档中文版

阅读目录 Istio官方文档中文版 回到目录 Istio官方文档中文版 http://istio.doczh.cn/ https://istio.io/docs/concepts/what-is-istio/goals.html 为什么要使用Istio? 在从单体应用程序向分...

xiaomin0322 ⋅ 今天 ⋅ 0

CentOS 7 Omnibus 包安装 GitLab 并汉化记录

系统环境 操作系统:CentOS 7GitLab:gitlab-ce-10.8.4-ce.0.el7.x86_64.rpm 下载Omnibus安装包 使用国内镜像加速下载地址 # wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el......

admin_qing ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部