热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

cocos2dx初探学习笔记(30)2.1新特性之CCClippingNode

从本篇起介绍一些cocos2d-x的新功能,包括CocosBuilder动画等功能,还包括从2.1版本添加的一些新特性,本篇文章就介绍一下2.1中我非常喜欢

从本篇起介绍一些cocos2d-x的新功能,包括CocosBuilder动画等功能,还包括从2.1版本添加的一些新特性,本篇文章就介绍一下2.1中我非常喜欢的一个新特性--可以根据一个模板切割图片的节点--CCClippingNode。这个类提供了一种不规则切割图片的方式,在这种方式以前,我们可以使用纹理类自带的setTextureRect函数来切割矩形区域,这种方式就像是J2me的setClip方法一样整块的切割图片,比如我们要实现一个血条的时候,就可以使用这种方式进行切割,切掉我们不想显示的部分,而新特性中提供的CCClippingNode最大的不同之处就是裁减将不仅仅局限于矩形,可以根据任何形状进行裁减,而你要做的只是给一个“裁减模板”,这就好比是我们用剪刀剪形状,需要一个模具类的东西,然后我们拿着模具和要被裁减的纸顺着模具的边缘用剪刀剪就可以剪出一个模具的样子一样,首先来看这个类的常用函数(需要说明的是,这里介绍的函数只是这个类独有的,这个类继承自CCNode节点类,因此节点类有的函数也就不做介绍了):

getStencil:返回一个节点对象,这个对象就是之前提到的“裁减模板”。

setStencil:设置“裁减模板”。

getAlphaThreshold::这种裁减是可以改变裁减的透明度的,修改这个透明度就是通过设置这个阈值。

setAlphaThreshold:获得这个透明度阈值。

isInverted:之前说过的剪刀剪形状的例子,剪完形状以后,是显示被剪掉的部分,还是显示剩余的部分呢,默认isInverted值是false,是显示被剪掉的部分,设置为true则是显示剩余的部分。这个函数获得这个值。

setInverted:设置isInverted值。

       使用这个效果,一般的过程是这样的:

       

//创建裁减模板

    CCNode*stencil = this->stencil();

    stencil->setTagkTagStencilNode);

    stencil->setPositionccp(50,50) );

    //创建裁减节点类

    CCClippingNode*clipper = this->clipper();

    clipper->setTagkTagClipperNode);

    clipper->setAnchorPoint(ccp(0.5,0.5));

    clipper->setPositionccp(s.width / 2 -50, s.height/ 2 - 50) );

    //为设置裁减节点类设置裁减模板

    clipper->setStencil(stencil);

    this->addChild(clipper);

    //设置裁减节点类所放的内容

    CCNode*content = this->content();

    content->setPositionccp(50,50) );

    clipper->addChild(content);

        通过这个新特性可以实现出很多有意思的效果,首先来学习一下cocos2D-x中的testApp的使用实例首先是一个类似ScrollView的滚动效果,在这之前,介绍cocos2D-x的另一个新特性—CCDrawNode,这个类不是一个新的功能,而是对原来功能的封装,在这之前,如果我们需要绘制矩形,圆形,点等形状,需要重新写一个类继承自节点或布景层,然后重写draw函数,现在使用CCDrawNode,可以直接使用这个类来绘制相应图形,相关函数如下所示:

     drawDot:绘制点,参数给出坐标位置。

    drawSegment:绘制片断,给出起始点,结束点,半径等参数。

     drawPolygon:绘制矩形,可以分别给出填充颜色和边框颜色,还可以设置边框宽度。

     实现类似ScrollView的滚动效果的代码如下:

   //创建裁减节点类

    CCClippingNode *clipper= CCClippingNode::create();

    clipper->setTagkTagClipperNode);

    clipper->setContentSizeCCSizeMake(200, 200) );

    clipper->setAnchorPointccp(0.5, 0.5) );

    clipper->setPositionccp(this->getContentSize().width / 2, this->getContentSize().height/ 2) );

    clipper->runAction(CCRepeatForever::create(CCRotateBy::create(1, 45)));

    this->addChild(clipper);

    //创建裁减模板

    CCDrawNode*stencil = CCDrawNode::create();

    CCPointrectangle[4];

    rectangle[0]= ccp(0, 0);

    rectangle[1]= ccp(clipper->getContentSize().width,0);

    rectangle[2]= ccp(clipper->getContentSize().width,clipper->getContentSize().height);

    rectangle[3]= ccp(0, clipper->getContentSize().height);

    //绘制一个矩形

    ccColor4Fwhite = {1, 1, 1, 1};

    stencil->drawPolygon(rectangle,4, white, 1, white);

    //为设置裁减节点类设置裁减模板

    clipper->setStencil(stencil);

    //设置裁减节点类所放的内容

    CCSprite*content = CCSprite::create(s_back2);

    content->setTagkTagContentNode);

    content->setAnchorPointccp(0.5, 0.5) );

    content->setPositionccp(clipper->getContentSize().width / 2, clipper->getContentSize().height/ 2) );

    clipper->addChild(content);

之后使用触摸控制的三个函数设置content的位置就可以了,效果如图所示:


如果说关于ScrollView是一个已经有解决方案的办法了,那么下面这个效果将更加体现这个新效果的作用,实现一个子弹打孔的效果:

void HoleDemo::setup()

{

    //子弹击穿的图片,很多地方都用到的ABCD图

    CCSprite*target = CCSprite::create(s_pPathBlock);

    target->setAnchorPoint(CCPointZero);

    target->setScale(3);

    //创建CCClippingNode,这个CCClippingNode并不是负责切割弹孔的,负责切割出“ABCD图”的

    m_pOuterClipper= CCClippingNode::create();

    m_pOuterClipper->retain();

    CCAffineTransformtranform = CCAffineTransformMakeIdentity();

    tranform= CCAffineTransformScale(tranformtarget->getScale(), target->getScale());

   

    m_pOuterClipper->setContentSizeCCSizeApplyAffineTransform(target->getContentSize(),tranform));

    m_pOuterClipper->setAnchorPointccp(0.5,0.5) );

    m_pOuterClipper->setPositionccpMult(ccpFromSize(this->getContentSize()), 0.5f) );

    m_pOuterClipper->runAction(CCRepeatForever::create(CCRotateBy::create(1, 45)));

   

    m_pOuterClipper->setStenciltarget);

    //负责弹孔切割的CCClippingNode

    CCClippingNode *holesClipper= CCClippingNode::create();

    //显示切割后剩余部分

    holesClipper->setInverted(true);

   //设置alpha阈值

    holesClipper->setAlphaThreshold( 0.05f );

    holesClipper->addChild(target);

    //弹孔层,所有弹孔都在这个节点中

    m_pHoles= CCNode::create();

    m_pHoles->retain();

   

    holesClipper->addChild(m_pHoles);

    //负责切割弹孔的裁减模板

    m_pHolesStencil= CCNode::create();

    m_pHolesStencil->retain();

    holesClipper->setStencilm_pHolesStencil);

   

    m_pOuterClipper->addChild(holesClipper);

   

    this->addChild(m_pOuterClipper);

       

     this->setTouchEnabled(true);

   }

    点击某一点后,该点出现击穿效果:

    //大小旋转随机

    float scale= CCRANDOM_0_1() * 0.2 + 0.9;

    floatrotation = CCRANDOM_0_1()* 360;

    //弹孔上的效果图片,只是作为装饰

    CCSprite*hole = CCSprite::create("Images/hole_effect.png");

    hole->setPositionpoint);

    hole->setRotationrotation);

    hole->setScalescale);

   

    m_pHoles->addChild(hole);

    //真正的弹孔切割

    CCSprite*holeStencil = CCSprite::create("Images/hole_stencil.png");

    holeStencil->setPositionpoint);

    holeStencil->setRotationrotation);

    holeStencil->setScalescale);

   

    m_pHolesStencil->addChild(holeStencil);

    //被“击打”的“abcd图”缩放一下,效果更真实

     m_pOuterClipper->runAction(CCSequence::createWithTwoActions(CCScaleBy::create(0.05f,0.95f),CCScaleTo::create(0.125f,1)));

效果如图所示:


我觉得这个功能很有意思,打算写个游戏实例,过一段时间会发在博客上。


推荐阅读
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
author-avatar
快乐天使小可爱66
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有