将Sprite添加到Layer后显示在画布顶部而非对应层级的问题求助
问题描述
将Sprite添加到Group后,预期backObjects组内的Sprite显示在后方,frontObjects组内的Sprite显示在前方,但实际两个Sprite都显示在画布顶部。相关代码如下:
this.backObjects.add(this.target); //supposed to be in back this.targetClone = this.add.sprite(this.target.x, this.target.y, this.target.texture.key); this.targetClone.setScale(3); this.frontObjects.add(this.targetClone); //supposed to be in front //both are in the front […] //puts backObjects in back when player is below it this.backObjects.getChildren().forEach(function(object){ if(object.y>this.player.y){ object.visible = false; } else if (object.y <= this.player.y){ object.visible = true; } }, this); //puts frontObjects in front when player is above it this.frontObjects.getChildren().forEach(function(object){ if(object.y>this.player.y){ object.visible = true; } else if (object.y <= this.player.y){ object.visible = false; } }, this);
效果如图:
解决方法
1. 明确设置Group的层级深度
Phaser中显示对象的层级由depth属性决定,数值越大显示层级越高。给两个Group设置明确的depth值,确保后方组的深度低于前方组:
// 后方组设置更低的depth,显示在底层 this.backObjects.setDepth(0); // 前方组设置更高的depth,显示在顶层 this.frontObjects.setDepth(1);
如果是初始化Group时,也可以按先创建后方组、再创建前方组的顺序,默认前方组的深度会更高。
2. 确保Sprite归属于目标Group
使用this.add.sprite创建的Sprite默认父容器是场景本身,后续添加到Group时可能出现层级继承问题。建议直接通过Group的create方法创建Sprite,确保它从属于目标Group:
// 直接在frontObjects组内创建Sprite this.targetClone = this.frontObjects.create(this.target.x, this.target.y, this.target.texture.key); this.targetClone.setScale(3);
3. 排查Sprite单独设置的depth
检查项目中是否有其他代码给this.target或this.targetClone单独设置了setDepth,如果存在过高的depth值,会覆盖Group的层级设置,导致Sprite强制显示在顶部。
4. 验证可见性逻辑的正确性
当前逻辑通过visible属性切换显示状态,可在循环内添加日志,确认object.y与this.player.y的比较结果是否符合预期,避免因为坐标判断错误导致两组Sprite同时显示。
内容的提问来源于stack exchange,提问作者LeftClickMage
相关产品推荐
相关产品推荐

