【深入了解cocos2d-x 3x】一步一步通过ClippingNode实现一个功能

发布日期:2019-09-15 16:04   来源:未知   阅读:

  这篇文章主要是通过一步一步实现一个功能完善的跑马灯公告来展示ClippingNode的用法并且最终深入ClippingNode的源码,了解其实现原理。

  首先,先介绍一下ClippingNode,ClippingNode也叫裁剪节点,能将一些内容通过使用模板裁剪出来显示在界面上,可以实现一些很炫酷的效果。来看看今天要实现的效果

  首先是create,这个方法是用于创建一个ClippingNode,这个就不多做赘述了,第二个create是创建一个带遮罩模板的裁剪节点。

  接下来的getStencil和setStencil分别是获取和设置一个遮罩模板,裁剪物体方法就是通过这个遮罩模板的,遮罩模板只要是基于Node的对象都可以(非常重要)。

  接下来的hasContent返回其是否有需要绘制的内容,如果没有绘制的内容则返回false,有则返回true。

  getAlphaThreshold和setAlphaThreshold分别是获取和设置一个像素的透明度值,取值范围从0-1,其中0表示都不绘制,1表示都绘制。0.5表示透明度在0.5以上的都绘制,这个函数涉及到opengl的Alpha测试的相关概念,Alpha测试的作用通过一句话解释就是:所有像素的透明度值低于某个阀值的统统抛弃,不绘制到屏幕上。

  最后的isInverted和setInverted分别表示绘制的内容是模板内的还是模板外的,其效果如下:

  上节简单介绍了一下ClippingNode的函数,这节就通过实现一个简易的跑马灯功能来直观的了解。首先介绍一下制作跑马灯的思路。

  首先我们需要将跑马灯中的一部分超出的字裁剪掉,不让他显示在界面上。这就需要用到ClippingNode,现在先来做第一步。实现的代码如下:

  上述的每一句代码都有注释,就不再多解释了,这一步实现出来的效果如下图,但是跑马灯还不能动起来,待会我们就将跑马灯动起来。

  现在我们就设计一个Action将跑马灯动起来,跑马灯一般需要先将文字左移,移动到文字看不见的时候再将文字移除或者隐藏,代码如下(为了简便,就直接设置隐藏了):

  现在跑马灯的样子就如同开篇展示的那样了,可是这样还不能直接使用,因为这只是一串代码,还需要对其进行一定的封装,然后提供一个非常简便的方法给别的类调用。

  现在我们从便捷性的角度考虑如何将跑马灯功能封装成一个函数供其他类调用。首先提取出函数的参数,分别是:显示区域,跑马灯文字,字体字号,跑马灯位置,跑马灯的父节点。下面是初步封装好的一套跑马灯函数的声明:

  看参数是不是有些略多,每次调用这个函数是不是非常的不方便,那么我们现在来看看究竟有那些参数是必须要传入的吧。每次调用跑马灯显示的文字都会改变,其他的参数在一个游戏中是不会改变的。那么就有必要做一个类来保证使用方法的便捷性了。

  看上去,此前的步骤我们已经完成了一个跑马灯的功能,实际上这个类距离真正能使用还差那么一点点,因为传入跑马灯的消息的传入时机是不确定的,可能这一条消息还没有播放完成下一条就要开始播放了。这样就需要实现一个播放等待队列,将需要播放的消息加入播放队列,然后跑马灯自动判断是否需要显示。下面是改进后的类声明文件以及实现文件。

  此处将show方法隐藏,并且提供了addMessage方法,内部实现了一个有限状态机,根据状态来显示剩余的消息,其使用方法与此前相似:

  在游戏的某些场合,需要展现一些如圆形、椭圆形以及特定形状的图片,如果使用的地方比较多,需要美术逐个出图的话难免会造成空间浪费,如果使用ClippingNode剪裁节点,那么只需要特定形状的模板,那么便...博文来自:forestsenlin的博客

  新手教程是游戏开发必须的一部分,cocos2dx中也为我们提供了节点裁剪的类ClippingNode,在实际使用中还是有点麻烦,所以我自己包装了个类。我是基于cocos2dx3.3的lua框架,其他版...博文来自:DLKan的博客

  最近很火的房卡麻将什么的就做了个闪光特效,类似于下面这张只要使用clippingnode就能实现,网上搜了下有很多cocos2dx的版本,但是没有lua的版本,就翻译了一下最终实现的效果跟图上一样就不...博文来自:菜鸟的学习之路

  ClippingNode是Node的一个子类。它使用一个模板来裁剪绘制内容。模板是一个其他节点,不会被绘制。使用模板的alpha部分来进行裁剪(通过调整alphaThreshold)。简介如图:实现思...博文来自:一只程序猿

  2016年5月11日下午2:14一.基本定义ClippingNode(裁剪节点)可以用来对节点进行裁剪,可以根据一个模板切割图片的节点,生成任何形状的节点显示。ClippingNode是利用模板遮罩来...博文来自:WADE

  3.x节点裁剪还是很有作用的,很多功能都可以用上;节点裁剪功能简介:ClippingNode(裁剪节点)可以用来对节点进行裁剪,可以根据一个模板切割图片的节点,生成任何形状的节点显示。Clipping...博文来自:lingtingmuse的专栏

  问题描述:实现一个类似跑马灯的效果。问题解决:1) 需要一个GameObject对象数组pathGameObject,命名为,用来作为“灯”;2) 声明一个float类型的变量timer作为每一次灯闪...博文来自:Winner_2012的专栏

  第000篇-一步一步了解区块链技术来源:春哥个人博客作者:©黎跃春:JS全栈工程师,区块链、高可用架构技术爱好者版权声明:本文版权归©黎跃春所有,仅供区块链技术爱好者免费学习,未经许可,禁止转载和改编...博文来自:孔壹学院

  区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法含义比特币(BitCoin)的概念最初由中本聪在...博文来自:jwter的博客

  最近看到一篇有关promise的文章还不错,想着翻译过来看看,顺便也算是对promise作个总结。好了,开门见山,跟着我的脚步一起来学习吧。一、最简单的例子1、先看例子1:functiondoSom...博文来自:weixin_33889665的博客

  上文描述了服务端的实现,下面进行客户端的实现。 客户端由于不能直接通过new进行服务端调用,需要使用服务端的代理类,而代理对象为服务端的接口,在demo中将服务端的接口类IHgHello拷贝一份到客...博文来自:弈缘人生

  说起handler,相信大家一定都不陌生,因为太常用了,而关于handler的机制,现在网上也是一大堆,但是我还是要在这里讲一遍,毕竟知识这个东西是要自己讲出来才能表示自己已经理解了嘛!概念handl...博文来自:你缺少想象力的博客

  clippingNode是利用opengl的裁剪缓冲区实现的,因为最近有使用这个功能需要,顺便把这部分实现看看了看。  opengl的裁剪主要有以下几个步骤:1、开启裁剪缓冲区2、设置裁剪缓冲区中的m...博文来自:sydnash的专栏

  本文部分代码来自,在此基础上稍作修改,并添加了详细注释。1、ScrollText类...博文来自:yuxikuo_1的专栏

  在游戏界面中经常遇到规则的图形显示,如用户头像是圆的,但是原始图片却是方的,这时需要使用clippingnode进行裁剪,就可以显示出任何想要的形状。显示圆形的代码如下://要显示的圆形模板varsh...博文来自:9527的专栏

  有个小需求,需要实现一个圆形的头像。要ui设计直接给圆形的png当然可以,但这种解决方式总是不优雅。然后就在网上查了半天,最终找到了使用ClippingNode来实现的方法。关于ClippingNod...博文来自:pur_e的专栏

  公司项目中使用了分布式,采用的是猎聘网的一套框架,并未使用Dubbo,SpringCloud等流行的技术框架。在使用过程中,仅仅会常用的jar包升级、服务调用等,对具体的RPC实现原理没有真正...博文来自:弈缘人生

  前言:在自己还没有机房重构的时候,通过看别人的博客,就开始初步的了解了泛型,从最开始的登录,就开始使用的泛型,直到自己做到退卡的窗体时候,发现之前的自己的泛型并不对,但是找不到错误的原因,后来看了一个...博文来自:展翅的雄鹰

  目录初识Python正则表达式正则表达式是一个特殊的字符序列,用于判断一个字符串是否与我们所设定的字符序列是否匹配,也就是说检查一个字符串是否与某种模式匹配。Python自1.5版本起增加了re模块,...博文来自:weixin_34380296的博客

  java是半编译半解释语言编译与解释是两个过程,编译是在编译器中,而解释在jvm中。从图中java先由源文件(java文件)编译生成相应的字节码文件(class文件)。调用时jvm装载相应的字节码文件...博文来自:xiangluping的专栏

  关于裁剪,这个我有遇到一个坑(3.4)的,在做裁剪的时候,整个背景色都是灰色,没有裁剪效果,C++上是可以正常运行,显示裁剪效果,但是用Lua就没有,我找了半天也没有找到原因,。最后在一片文章中看到了...博文来自:专注,努力,勤奋

  以前利用过ScrollView设置跑马灯效果。现在利用博文来自:风无定人无常

  授予每个自然周发布1篇到3篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。

  【unity】动态图集 dynamic atlas (runtime atlas)

  【面经】腾讯U3d面试面经 帧同步方向 (一)帧同步如何解决不同步的问题?

  q8547957:试了只能裁剪在原点的scrollView,不过用了你链接的那个方法倒是可以实现所有位置的裁剪~~~

  ABigDeal:书看到一半,看到书皮上有作者邮箱,看到包含1992的时候赶紧百度了下作者。。瞬间五体投地了。。。王中王论坛高手榜www27792.com