cocos新手引导的遮罩组件

首先先明确下需求,新手引导一般会屏蔽了除期望操作组件之外的所有ui的操作。也就是说,除了指定的组件,你不可以点击其他的组件。然后直接上代码吧:

cc.Class({
    extends: cc.Component,

    properties: {
        targetNodePath: ''
    },

    onLoad () {
        let touchListener = cc.EventListener.create({
            event: cc.EventListener.TOUCH_ONE_BY_ONE,
            swallowTouches: true,
            owner: this.node,
            onTouchBegan: (touch, event)=>{
                const node = cc.find(this.targetNodePath);
                if(!(node && cc.isValid(node))){
                    console.warn("can't find node by path:", this.targetNodePath);
                    return false;
                }
                const box = node.getBoundingBoxToWorld();
                return !box.contains(touch.getLocation());
            }
        });
        cc.eventManager.addListener(touchListener, this.node);
    }

});

基本思路就是在最上层监听TOUCH_BEGAN事件,并且指定放行的组件路径(使用路径而不是节点是为了方便读取配置表),屏蔽除指定组件之外的ui。以上代码仅能在creator 1.x上运行,因为使用了eventManager,在2.x中将会被移除。目前项目使用1.9.3,计划升级1.10,因此暂无问题。 那么我们思考下在2.x中,这个接口被移除了,我们因该如何处理呢。我想了下,其实也很好解决。以下是我的思路(懒得写代码了):

  • 首先在最上层用一个Button或者BlockInputEvent组件遮蔽所有的用户输入
  • 然后指定放行的组件,在遮罩上方同位置创建一个等大小的button,执行对应组件的Component.EventHandler,至于缩放什么的表现可能需要自己手动弄个动画了,想来也是很方便的

转载于:https://my.oschina.net/ForeverZi/blog/1923528

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Cocos2d-x是一个开源的跨平台游戏开发框架,它提供了丰富的功能和工具来帮助开发者创建游戏。在Cocos2d-x中,可以使用动态创建的方式来创建Animation组件。 动态创建Animation组件的步骤如下: 1. 创建一个Animation对象:可以使用Animation类的create方法来创建一个Animation对象,需要传入一个动画帧的数组和每帧的时间间隔作为参数。 2. 创建一个Animate对象:使用Animate类的create方法,将Animation对象作为参数传入,创建一个Animate对象。 3. 创建一个Sprite对象:使用Sprite类的create方法创建一个Sprite对象,作为动画的显示对象。 4. 将Animate对象添加到Sprite对象上:使用Sprite对象的runAction方法,将Animate对象作为参数传入,将动画添加到Sprite对象上。 5. 将Sprite对象添加到场景中:使用Director类的getInstance方法获取Director对象,然后调用其getRunningScene方法获取当前运行的场景对象,最后调用场景对象的addChild方法,将Sprite对象添加到场景中显示。 下面是一个示例代码,演示了如何动态创建Animation组件: ```cpp // 创建动画帧数组 Vector<SpriteFrame*> frames; for (int i = 1; i <= 8; i++) { char frameName[100]; sprintf(frameName, "frame%d.png", i); SpriteFrame* frame = SpriteFrameCache::getInstance()->getSpriteFrameByName(frameName); frames.pushBack(frame); } // 创建Animation对象 Animation* animation = Animation::createWithSpriteFrames(frames, 0.1f); // 创建Animate对象 Animate* animate = Animate::create(animation); // 创建Sprite对象 Sprite* sprite = Sprite::create(); // 将Animate对象添加到Sprite对象上 sprite->runAction(animate); // 将Sprite对象添加到场景中 Director::getInstance()->getRunningScene()->addChild(sprite); ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值