场景中的physicsWorld对象支持Raycast ,方法是
func enumerateBodies(alongRayStart start: CGPoint, end: CGPoint, using block: @escaping (SKPhysicsBody, CGPoint, CGVector, UnsafeMutablePointer<ObjCBool>) -> Void)
你可以这样使用:
self.physicsWorld.enumerateBodies(alongRayStart: playerPosition, end: clickPosition) { body, point, vector, object in
if let node = body.node as? SKSpriteNode {
node.color = SKColor.red.withAlphaComponent(0.2)
let pointNode = SKSpriteNode(color: .cyan, size: CGSize(width: 5, height: 5))
pointNode.position = point
let path = CGMutablePath()
path.move(to: playerPosition)
path.addLine(to: clickPosition)
path.closeSubpath()
let line = SKShapeNode(path: path)
line.strokeColor = .green
line.fillColor = .green
self.addChild(line)
self.addChild(pointNode)
}
}
并在每次点击时获得此结果:
完整的例子在这里:https ://github.com/Maetschl/SpriteKitExamples/blob/master/Raycast2dLinesVsObjects/Raycast2dLinesVsObjects/GameScene.swift