Чтобы вызвать узел в случайной точке внутри данного прямоугольника вы можете использовать этот метод (ы):
func randomBetweenNumbers(firstNum: CGFloat, secondNum: CGFloat) -> CGFloat{
return CGFloat(arc4random())/CGFloat(UINT32_MAX) * abs(firstNum - secondNum) + min(firstNum, secondNum)
}
func randomPointWithinRectangle(rectangle: CGRect) -> CGPoint {
var point : CGPoint = CGPoint()
point.x = randomBetweenNumbers(rectangle.origin.x + sprite.size.width/2, secondNum: rectangle.origin.x + rectangle.size.width - sprite.size.width/2)
point.y = randomBetweenNumbers(rectangle.origin.y + sprite.size.width/2, secondNum: rectangle.origin.y + rectangle.size.height - sprite.size.width/2)
return point
}
Следующая вещь скрывающегося/... часть восстановления скрытого Обратите внимание, что я в настоящее время на устаревшей версии Swift : D, и то, что работает для меня, может не сработать для вас. Но логика такая же.
Для достижения этой цели, вы можете использовать последовательность SKAction, например:
func startSpawningSprites(){
let wait = SKAction.waitForDuration(0.5)
let fadeOut = SKAction.fadeOutWithDuration(0.5)
let fadeIn = SKAction.fadeInWithDuration(0.3)
//Use weak reference to self to prevent retain cycle. in Swift 2.0 you should use appropriate syntax.
weak var weakSelf = self
let changePosition = SKAction.runBlock({
weakSelf!.sprite.position = weakSelf!.randomPointWithinRectangle(weakSelf!.rectangle.calculateAccumulatedFrame())
})
let sequence = SKAction.sequence([wait, fadeOut, changePosition, wait, fadeIn])
sprite.runAction(SKAction.repeatAction(sequence, count:10))
}
Здесь код довольно много прямо вперед, и она делает то, что я говорил выше (скрыть, переместить и отобразить узел). Переменная прямоугольника определяется как свойство только для более легкой отладки.
О другой части вашего вопроса .. Я не уверен, если я это понимаю ... Но я могу попробовать. Если вам небезразлично перекрывать узлы, и вы хотите их избежать, тогда вам нужно проверить, есть ли узел в данной точке (метод nodeAtPoint может быть полезен). Теоретически это может быть ресурсоемким. Если вас интересует, читайте далее here.
EDIT:
Чтобы ответить на этот вопрос с вашим комментарием:
Переменные спрайт и прямоугольник определяются как свойства GameScene:
class GameScene:SKScene{
let sprite = SKSpriteNode(color: SKColor.redColor(), size: CGSize(width: 30, height: 30))
//just for debugging purposes
let rectangle = SKSpriteNode(color: SKColor.orangeColor(), size: CGSize(width: 150, height: 150))
override func didMoveToView(view: SKView) {
setupScene()
startSpawningSprites()
}
func setupScene(){
sprite.position = CGPoint(x: CGRectGetMidX(frame), y: CGRectGetMidY(frame))
sprite.zPosition = 4
sprite.name = "sprite" //later on, you can access or enumerate node(s) by name
addChild(sprite)
rectangle.position = CGPoint(x: CGRectGetMidX(frame), y: CGRectGetMidY(frame))
rectangle.alpha = 0.5
rectangle.zPosition = 3
rectangle.name = "rectangle"
addChild(rectangle)
}
func startSpawningSprites(){
//...
}
}
Конечный результат предназначен смотреть например:
Это то, что вы пытаетесь do: скрыть узел, изменить его положение на случайное местоположение, показать узел? И повторите эту последовательность определенное количество раз? Кроме того, хотите сделать это только для узла зеленого круга или с несколькими узлами? – Whirlwind
Да, однако, беспорядочно возникать в прямоугольнике, который является rect = CGRectMake (8, 293, 165, 218), это то, что я пытаюсь сделать, но у меня также есть разные узлы в этом месте, было бы проще их комбинировать вместе? – MattB
Не уверен, что я понимаю вторую часть вашего комментария, но я написал простой пример для вас, который даст вам общее представление о том, как вы можете спрятаться, перейти к случайной точке и показать узел. Кроме того, я связал хороший пост о «нерестах узлов на случайных позициях, но без перекрытия». Вы можете найти это полезным. Удачи и счастливого взлома! :) – Whirlwind