CocosCreator-2d场景遮挡

cocos-2d场景遮挡

cocos练习记录

背景与目的

使用Tiled制作地形,场景中存在柱子之类的内容,需要实现玩家在柱子前后移动时,与柱子成正常的遮挡关系。

思路

尝试过使用unity那样的sortinglayer,添加sorting组件,但是并不起效,又尝试改layer,也不起效。如果有大佬有方便的实现效果欢迎指点

目前主要使用思路是将所有需要动态比对的个体存入一个节点中,通过修改节点的渲染顺序来达到前后遮挡,使用Node.setSiblingIndex方法去修改节点顺序。

代码

  1. 创建动态遮挡根节点,将柱子等物传入,有新实体添加进去时通过方法移到该节点下
this.DynamicLayersRoot = new Node('DynamicLayers'); //添加存放动态遮挡根节点
this.node.addChild(this.DynamicLayersRoot);
this.DynamicLayersRoot.setSiblingIndex(this.node.children.length -1);

// 先将所有柱子节点添加到DynamicLayersRoot中
// 渲染优先度越高越排前
this.pillars.sort((a,b)=>a.getChildByName('coordY').worldPosition.y-b.getChildByName('coordY').worldPosition.y);
for(let i = 0;i < this.pillars.length;i++){
    this.pillars[i].setParent(this.DynamicLayersRoot);
}

...

addDynamicLayersNode(node:Node){
    this.DynamicLayersRoot.addChild(node);
    this.DynamicLayers.push(node);
}

removeDynamicLayersNode(node:Node){
    this.DynamicLayersRoot.removeChild(node);
    this.DynamicLayers.splice(this.DynamicLayers.indexOf(node),1);
}
  1. 根据他们的y轴进行排序,然后进行编排(要注意各个节点的y值应该取什么,我对柱子新建了一个节点标在底端来确定y值)
checkPlayerLayer():void{
    let layerYArr : {node : Node,y:number}[] = [];

    for(let i = 0;i < this.pillarsInfo.length;i++){
        layerYArr.push({node : this.pillarsInfo[i].node, y:this.pillarsInfo[i].y});
    }
    for(let i = 0;i < this.DynamicLayers.length;i++){
        layerYArr.push({node : this.DynamicLayers[i], y:this.DynamicLayers[i].worldPosition.y});
    }
    
    // 根据实际y值排序
    layerYArr.sort((a,b)=>b.y-a.y);
    for(let i = 0;i < layerYArr.length;i++){
        layerYArr[i].node.setSiblingIndex(i);
    }
}

写起来挺简单,场景中的静态物需要在Tiled中分一个层来画,这样会分一个Node出来,可以对所有动态层实时更新
效果:
前
后

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值