Как исключить позиции в поле в 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 в квадрате.