SpriteKit中编程添加的SKSpriteNode堆叠粘连如何解决
解决方案
- 核心原因是代码新增的节点未配置与.sks节点一致的物理体属性,导致碰撞规则不匹配产生粘连,可按以下步骤修复:
- 补全新增节点的物理体配置,所有参数需和.sks中球员节点的物理体参数完全对齐,修改后的代码示例如下:
func addDiagonal(image : UIImage, name : String){ let arrowNode = SKSpriteNode() arrowNode.texture = SKTexture(image: image) arrowNode.size = CGSize(width: 65, height: 65) arrowNode.position = CGPoint(x: 153, y: 267) arrowNode.zPosition = 4 arrowNode.name = name // 新增物理体配置,参数需和.sks中球员节点配置保持一致 // 如果.sks用的是纹理匹配物理体则替换为SKPhysicsBody(texture: arrowNode.texture!, size: arrowNode.size) arrowNode.physicsBody = SKPhysicsBody(rectangleOf: arrowNode.size) arrowNode.physicsBody?.isDynamic = true arrowNode.physicsBody?.affectedByGravity = false arrowNode.physicsBody?.friction = 0.2 // 替换为你.sks中设置的摩擦系数 arrowNode.physicsBody?.restitution = 0.1 // 替换为你.sks中设置的回弹系数 arrowNode.physicsBody?.mass = 1 // 替换为你.sks中设置的质量 // 三个碰撞掩码必须和.sks球员节点的配置完全一致 arrowNode.physicsBody?.categoryBitMask = 0x1 << 1 arrowNode.physicsBody?.collisionBitMask = 0x1 << 0 arrowNode.physicsBody?.contactTestBitMask = 0x1 << 0 arrowNode.physicsBody?.zPosition = 4 // 和渲染层级保持一致 myTrainigArr?.append(arrowNode) self.addChild(arrowNode) }
修正拖拽逻辑:如果当前拖拽是直接修改节点的
position属性,会导致物理引擎无法正确计算碰撞,出现重叠粘连。建议改为用物理速度控制位移,或者创建临时隐形锚点节点,通过SKPhysicsJointPin将拖拽节点和锚点绑定,由物理引擎驱动节点移动,避免强行改位置导致的碰撞异常。检查初始位置:确保新增节点的初始坐标不会和现有节点重叠,避免刚添加就触发持续碰撞判定。
内容的提问来源于stack exchange,提问作者danTheMan
相关产品推荐
相关产品推荐

