Cocos Cerator调整节点顺序后获取节点位置信息

    阅读前,建议学习下皮佬的文章 — Cocos Creator 源码解读:siblingIndex 与 zIndex

解决

    通过setSiblingIndex改变节点在父节点中的顺序,即node.parent.chindren[index],想拿到某个节点排序后的坐标,监听事件就行了。注意: 按你需求on+ off监听或once监听

 // 当节点在兄弟节点中的顺序发生变化时触发的事件。
 cc.Node.EventType.SIBLING_ORDER_CHANGED
node.on(cc.Node.EventType.SIBLING_ORDER_CHANGED, () => {
    cc.log("排序后的位置:", JSON.parse(JSON.stringify(node.position)));
}, this);

demo

   节点结构

节点顺序结构
   container节点上的Layout组件(水平排列)
container节点Layout组件

   测试代码

   先在container中放4个节点(0~3),再在开头处<container.chindren[0]>添加3个节点(添加0、添加1、添加2)。current指向第一次添加后的children[0],即添加后的children[3]

start(){
	this.testOrderChildren();
}
/**测试指定位置添加子节点,获取排序后的位置 */
testOrderChildren() {
	let root_ = cc.find("Canvas/ViewRoot/testOrderChildren");
	root_.active = true;
    let root = cc.find("case1", root_);
    if (root) {
		 root.active = true;
         let container = cc.find("container", root);
         let item__ = cc.find("item", root);

         Array(4).fill(0).forEach((_, index) => {
			let item = cc.instantiate(item__);
            // item.setScale(0.5);
            let i = index;
            // if (i >= 2) {
            //     i++;
            // }
            item.name = "item" + i;
            cc.find("label", item).getComponent(cc.Label).string = item.name;
            item.active = true;
            // item.zIndex = i;
            item.parent = container;
		});
        let current = container.children[0];
        cc.log("添加前的位置:", JSON.parse(JSON.stringify(current.position)));

		Array(3).fill(0).forEach((_, index) => {
        	let pos = 0;// 在指定索引处插入元素
            let item = cc.instantiate(item__);
            // item.setScale(0.5);
            let i = index;
            // if (i >= 2) {
            //     i++;
            // }
            item.name = "添加" + i;
            cc.find("label", item).getComponent(cc.Label).string = item.name;
            item.active = true;
            item.parent = container;
            item.setSiblingIndex(pos + index);
            // item.zIndex = i;
        });
        cc.log("添加后的位置:", JSON.parse(JSON.stringify(current.position)));

        current.on(cc.Node.EventType.SIBLING_ORDER_CHANGED, () => {
            cc.log("排序后的位置:", JSON.parse(JSON.stringify(current.position)));
        }, this);
	}
}
   浏览器预览

浏览器预览

   控制台打印

console

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值