Как исключить позиции в поле в SpriteKit?

У меня есть функция, которая порождает на экране случайным образом расположенные маленькие шарики. Проблема, с которой я сталкиваюсь, заключается в том, что я хочу распределить шары случайным образом, но когда я это делаю, некоторые шары появляются друг на друге. Я хочу исключить все уже занятые позиции (и, возможно, буфер из нескольких пикселей вокруг шаров), но я не знаю, как это сделать. Я работал над этим, придавая шарам Physicsbody, чтобы они отодвигались друг от друга, если они появляются друг над другом. Но я хочу, чтобы они изначально не появлялись друг на друге. Мой код сейчас следующий:

          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)
            
        }
        
    }

Я не знаю, следует ли решать эту проблему с помощью массива, в котором хранятся все занятые позиции, или мне следует использовать какой-то FiledNode, где занимаемое пространство можно как бы вычесть, но, к сожалению, я не знаком с FieldNodes, поэтому я не знаю, правильный ли это способ решить проблему.

1 ответ

Шаг 1) Заменить

      let randomPosition = ....

с участием

      let randomPosition = randomPositionInOpenSpace()

Шаг 2) Напишите randomPositionInOpenSpace функция:

Идея: а) генерировать случайную позицию б) находится ли она в открытом космосе? если да, верните это c) повторяйте до ОК

Затем шаг 3) напишите ' is it in open spaceфункция

Для этого вам нужно знать, находится ли предложенная координата рядом с другими шарами. Для кругов вы можете проверить, что расстояние между их центрами больше, чем (радиусы + поля). Расстояние между центрами равно пифагору: квадрат дельты x в квадрате плюс дельта y в квадрате.

Другие вопросы по тегам