cocos2d-x初探学习笔记(30)2.1新特性之CCClippingNode

        从本篇起介绍一些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->setTag( kTagStencilNode);

    stencil->setPosition( ccp(50,50) );

    //创建裁减节点类

    CCClippingNode*clipper = this->clipper();

    clipper->setTag( kTagClipperNode);

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

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

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

    clipper->setStencil(stencil);

    this->addChild(clipper);

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

    CCNode*content = this->content();

    content->setPosition( ccp(50,50) );

    clipper->addChild(content);

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

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

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

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

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

   //创建裁减节点类

    CCClippingNode *clipper= CCClippingNode::create();

    clipper->setTag( kTagClipperNode);

    clipper->setContentSizeCCSizeMake(200, 200) );

    clipper->setAnchorPointccp(0.5, 0.5) );

    clipper->setPosition( ccp(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->setTag( kTagContentNode);

    content->setAnchorPointccp(0.5, 0.5) );

    content->setPosition( ccp(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(tranform, target->getScale(), target->getScale());

   

    m_pOuterClipper->setContentSize( CCSizeApplyAffineTransform(target->getContentSize(),tranform));

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

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

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

   

    m_pOuterClipper->setStencil( target);

    //负责弹孔切割的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->setStencil( m_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->setPosition( point);

    hole->setRotation( rotation);

    hole->setScale( scale);

   

    m_pHoles->addChild(hole);

    //真正的弹孔切割

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

    holeStencil->setPosition( point);

    holeStencil->setRotation( rotation);

    holeStencil->setScale( scale);

   

    m_pHolesStencil->addChild(holeStencil);

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

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

效果如图所示:


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

 

如有错误,请多多指教,欢迎大牛拍砖


  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: cocos2d-x 4. 学习之路 cocos2d-x是一款开源的跨平台游戏引擎,支持多种平台,包括iOS、Android、Windows、Mac OS X等。cocos2d-x 4.是最新版本,相比之前版本,它有很多新特性和改进,如增强的渲染性能、更好的3D支持、更好的物理引擎等。 如果你想学习cocos2d-x 4.,可以从以下几个方面入手: 1. 学习基础知识:了解cocos2d-x的基本概念、架构和工作原理,掌握cocos2d-x的编程语言和开发环境。 2. 学习API:熟悉cocos2d-x的API,包括场景管理、精灵、动画、音频、物理引擎等。 3. 学习示例代码:通过阅读和分析cocos2d-x的示例代码,了解如何使用cocos2d-x开发游戏。 4. 学习实践:通过实践开发小游戏,掌握cocos2d-x的开发流程和技巧,提高自己的编程能力。 总之,学习cocos2d-x 4.需要一定的时间和耐心,但只要你有兴趣和热情,相信你一定能够掌握它。 ### 回答2: cocos2d-x是一个强大的游戏引擎,可用于开发移动和桌面游戏。随着cocos2d-x更新至4.0版本,它的功能得到了大幅升级。如果你想学习cocos2d-x 4.0,以下是一些重要的步骤和建议。 1. 更改代码结构 cocos2d-x 4.0中启用了新的代码结构,旨在更好地实现模块化和解耦。新代码结构包括Core、Renderer、2d等模块,使代码更易于维护和升级。要理解新代码结构,请先阅读cocos2d-x官方文档,并针对各个模块学习和熟悉其API。 2. 学习新功能 cocos2d-x 4.0中引入了许多新功能,例如Shader、Render Queue等。学习新功能是非常必要的,因为它们将改变以前的游戏开发模式。了解这些新功能的实现原理,并在自己的项目中应用它们,有助于提高游戏性能和质量。 3. 学习C++11 cocos2d-x 4.0开始支持C++11标准,这意味着你可以使用C++11的新特性来编写更好的代码。要理解C++11的特性,建议通读一遍C++11的官方标准,并尝试在cocos2d-x项目中使用这些新特性。 4. 实战练习 最后,实战练习是学习任何技能的关键。为了更好地学习cocos2d-x 4.0,建议你尝试开发自己的游戏项目。通过尝试解决实际问题,你能更好地理解cocos2d-x的API,并在实践中掌握游戏开发的技术。 总而言之,学习cocos2d-x 4.0需要掌握新的代码结构、新的功能和C++11标准,并通过实际项目实战练习来加深理解。这需要一定的时间和耐心,但只要你认真学习、实践和不断尝试,必定能够取得成功。 ### 回答3: cocos2d-x 4.0是目前市面上非常流行的开源游戏开发引擎,在游戏开发领域有着较为广泛的应用。然而,学习cocos2d-x 4.0需要付出一定的努力和时间。以下是我对cocos2d-x 4.0学习之路的一些经验和建议。 1. 学习基础知识 在开始学习cocos2d-x 4.0之前,我们需要了解一些基础知识,比如C++语言、OpenGL ES等,这些都是cocos2d-x 4.0的底层实现技术。掌握这些基础知识会让我们从事游戏开发时更加得心应手。 2. 学习文档 学习cocos2d-x 4.0需要阅读官方文档,这些文档详细介绍了引擎的各个方面,而且是学习的最佳资料。文档里包括了引擎的安装、使用、开发以及调试等。建议大家先从官网下载文档,并且仔细阅读。 3. 实践和开发 掌握了基础知识以及学习了文档之后,最好的方式就是通过实践和开发来加深对cocos2d-x 4.0的理解。通过实际开发游戏来体验引擎的使用,这样能够更深刻的理解引擎的机制以及遇到的各种问题该如何解决。同时,通过找到一些相近的问题,并通过查阅文档、代码实现等方式来解决问题,可以增强自己的技术水平。 4. 参与社区 cocos2d-x 4.0的官方论坛以及社区非常活跃,里面的开发者也有着丰富的经验和技术,在学习中可以多向论坛、社区里的大牛请教,获得更多的技术指导,同时也可以参与讨论,提出自己的问题和思考来获得反馈,这样可以更快地提高自己的技术。 总之,学习cocos2d-x 4.0需要耐心和对游戏开发的热情。只有通过不断的学习与实践,我们才能最终掌握这个优秀的游戏开发引擎,从而创建属于自己的游戏作品。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值