ClippingNode 实现类似子弹打穿纸片效果

这篇博客介绍如何利用ClippingNode在Cocos2d-x中实现类似子弹打穿纸片的效果。通过创建和操纵不同节点,设置剪裁区域,并结合触摸事件动态添加洞口,实现了视觉上的穿透动画。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



auto target = Sprite::create("Images/blocks.png");
 target->setAnchorPoint(Vec2::ZERO);
 target->setScale(3);

 _outerClipper = ClippingNode::create();
 _outerClipper->retain();
 AffineTransform tranform = AffineTransform::IDENTITY;
 tranform = AffineTransformScale(tranform,target->getScale(),target->getScale());

 _outerClipper->setContentSize(SizeApplyAffineTransform(target->getContentSize(),tranform));
 _outerClipper->setAnchorPoint(Vec2(0.5,0.5));
 _outerClipper->setPosition(Vec2(300,300));
 _outerClipper->runAction(RepeatForever::create(RotateBy::create(1,45)));

 _outerClipper->setStencil(target);

 auto holesClipper = ClippingNode::create();
 holesClipper->setInverted(true);
 holesClipper->setAlphaThreshold(0.05f);
 holesClipper->addChild(target);

 _holes = Node::create();
 _holes->retain();

 holesClipper->addChild(_holes);

 _holesStencil = Node::create();
 _holesStencil->retain();

 holesClipper->setStencil(_holesStencil);
 _outerClipper->addChild(holesClipper);

 this->addChild(_outerClipper);

 auto listener = EventListenerTouchAllAtOnce::create();
 listener->onTouchesBegan = CC_CALLBACK_2(HelloWorld::onTouchesBegan,this);
 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener,this);



void HelloWorld::onTouchesBegan(const std::vector<Touch*>& touches,Event* event){
 Touch* touch = (Touch*)touches[0];
 Vec2 point = _outerClipper->convertToNodeSpace(Director::getInstance()->convertToGL(touch->getLocationInView()));
 auto rect = Rect(0,0,_outerClipper->getContentSize().width,_outerClipper->getContentSize().height);
 if (!rect.containsPoint(point))
 {
  return;
 }
 this->pokeHoleAtPoint(point);

}


void HelloWorld::pokeHoleAtPoint(Vec2 point){
 float scale = CCRANDOM_0_1()*0.2 + 0.9;
 float rotation = CCRANDOM_0_1() * 360;
 auto hole = Sprite::create("Images/hole_effect.png");
 hole->setPosition(point);
 hole->setRotation(rotation);
 hole->setScale(scale);

 _holes->addChild(hole);

 auto holeStencil = Sprite::create("Images/hole_stencil.png");
 holeStencil->setPosition(point);
 holeStencil->setRotation(rotation);
 holeStencil->setScale(scale);

 _holesStencil->addChild(holeStencil);

 _outerClipper->runAction(Sequence::createWithTwoActions(ScaleBy::create(0.05f,0.95f),ScaleTo::create(0.125f,1)));

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值