Swift 如何在SpriteKit中排除字段中的位置?

Swift 如何在SpriteKit中排除字段中的位置?,swift,xcode,skfieldnode,Swift,Xcode,Skfieldnode,我有一个在屏幕上随机放置小球的功能。我面临的问题是,我想随机分配球,但当我这样做时,一些球会相互叠加。我想排除所有已经采取的位置(可能还有球周围几个像素的缓冲区),但我不知道如何做到这一点。我通过给这些球一个物理体来解决这个问题,所以如果它们碰巧在彼此上面产卵,它们就会彼此移动。但我希望它们一开始不要在彼此的上面产卵。我现在的代码如下: spawnedBalls = [Ball]() level = Int() func setupLevel() {

我有一个在屏幕上随机放置小球的功能。我面临的问题是,我想随机分配球,但当我这样做时,一些球会相互叠加。我想排除所有已经采取的位置(可能还有球周围几个像素的缓冲区),但我不知道如何做到这一点。我通过给这些球一个物理体来解决这个问题,所以如果它们碰巧在彼此上面产卵,它们就会彼此移动。但我希望它们一开始不要在彼此的上面产卵。我现在的代码如下:

    spawnedBalls = [Ball]()
    level = Int()
    
    func setupLevel() {
            
        let numberOfBallsToGenerate = level * 2
        let boundary: CGFloat = 26
        let rightBoundary = scene!.size.width  - boundary
        let topBoundary   = scene!.size.height - boundary
        
        while spawnedBalls.count < numberOfBallsToGenerate {
            
            let randomPosition = CGPoint(x: CGFloat.random(in: boundary...rightBoundary), y: CGFloat.random(in: boundary...topBoundary))
            
            let ball = Ball()
            ball.position = randomPosition
            ball.size = CGSize(width: 32, height: 32)
            
            ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.size.width)
            ball.physicsBody?.affectedByGravity = false
            ball.physicsBody?.allowsRotation = false
            ball.physicsBody?.categoryBitMask = 1
            ball.physicsBody?.collisionBitMask = 1
            
            spawnedBalls.append(ball)
            self.addChild(ball)
            
        }
        
    }
sprownedballs=[Ball]()
级别=Int()
func setupLevel(){
让numberOfBallsToGenerate=级别*2
让边界:CGFloat=26
设rightBoundary=scene!.size.width-boundary
让topBoundary=场景!.size.height-边界
而sprownedballs.count
我不知道这个问题是否应该通过使用一个存储所有位置的数组来解决,或者我是否应该使用某种FiledNode来解决,在这种情况下,占用的空间可以被减去,但遗憾的是,我不熟悉FieldNodes,所以我不知道这是否是解决问题的正确方法。

步骤1)替换

步骤2)编写
randomPositionInOpenSpace
函数:

这个想法是: a) 生成一个随机位置 b) 是在开阔地吗?如果是的话,请返回 c) 重复上述步骤,直到确定

然后,第3步)编写“
是否在开放空间中”
”函数

为此,您需要知道建议的坐标是否靠近任何其他球。对于圆,可以测试其中心之间的距离是否大于(半径+边距)。中心之间的距离是毕达哥拉斯:xδ的平方加上yδ的平方的平方

let randomPosition = ....
let randomPosition = randomPositionInOpenSpace()