如何在移动SKEmitterNode时让SKEmitter粒子相对背景保持静止?
解决方案
核心原因是SKEmitterNode默认将生成的粒子作为自身子节点管理,粒子坐标基于发射器父节点坐标系,所以发射器移动时已发射的粒子会同步位移。你只需要给发射器设置targetNode属性即可解决问题,该属性可以指定粒子生成后归属的坐标系节点。
修改你的addBoostBubbles函数,增加一行配置:
func addBoostBubbles(){ boostBubbles = SKEmitterNode(fileNamed: "bubbleBoost")! boostBubbles.particlePositionRange = CGVector(dx: player.frame.size.width, dy: player.frame.size.height) boostBubbles.position = player.position boostBubbles.zPosition = 0 // 新增这行,指定粒子的坐标基于当前场景,不受发射器移动影响 boostBubbles.targetNode = self self.addChild(boostBubbles) }
设置后你后续在didSimulatePhysics里更新发射器位置的逻辑不需要改动,新生成的粒子会跟随发射器位置生成,已发射的粒子会保持在场景坐标系里相对背景静止、按你预设的粒子运动参数上浮,就可以实现正常的拖尾效果。
如果配置后效果不符合预期,可以额外检查两个粒子发射器的参数配置:
- 确认
particleLifetime参数设置合理,数值过大会导致气泡存留时间过长,过小会导致还没上浮就消失 - 确认
particleVelocity等运动参数没有设置和玩家移动方向相反的负值,避免气泡出现跟随玩家移动的视觉错觉
内容的提问来源于stack exchange,提问作者Kylan O'Connor
相关产品推荐
相关产品推荐

