2015-11-06 3 views
1

Мне интересно, как показать мой узел, но как только он скрыт, появится в другом месте оригинала.Как повторно появиться в другом месте, когда-то незакрытым

let x3 = rect.origin.x + CGFloat(arc4random()) % rect.size.width 
let y3 = rect.origin.y + CGFloat(arc4random()) % rect.size.height 
let randomPoint3 = CGPointMake(x3, y3) 
self.greencircle.position = randomPoint3 
self.addChild(greencircle) 
let wait3 = SKAction.waitForDuration(2.0) 
greencircle.hidden = true 
let wait23 = SKAction.waitForDuration(1.0) 
greencircle.hidden = false 

Так как только «зеленый круг» является нескрываемым как гарантировать нереститься в другом месте, к предыдущему и повторить?

+0

Это то, что вы пытаетесь do: скрыть узел, изменить его положение на случайное местоположение, показать узел? И повторите эту последовательность определенное количество раз? Кроме того, хотите сделать это только для узла зеленого круга или с несколькими узлами? – Whirlwind

+0

Да, однако, беспорядочно возникать в прямоугольнике, который является rect = CGRectMake (8, 293, 165, 218), это то, что я пытаюсь сделать, но у меня также есть разные узлы в этом месте, было бы проще их комбинировать вместе? – MattB

+0

Не уверен, что я понимаю вторую часть вашего комментария, но я написал простой пример для вас, который даст вам общее представление о том, как вы можете спрятаться, перейти к случайной точке и показать узел. Кроме того, я связал хороший пост о «нерестах узлов на случайных позициях, но без перекрытия». Вы можете найти это полезным. Удачи и счастливого взлома! :) – Whirlwind

ответ

0

Чтобы вызвать узел в случайной точке внутри данного прямоугольника вы можете использовать этот метод (ы):

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(){ 
    //... 
} 

} 

Конечный результат предназначен смотреть например: random spawning

+0

Thanyyou так много для этого только одна вещь, хотя для (weakSelf! .rectangle.calculateAccumulatedFrame() говорит, что у него нет элемента с именем rectangle, так что я должен сделать прямоугольник равным чему-то? – MattB

+0

@MattB Checkout the edit :) Я добавил пример, чтобы показать вам, где определен прямоугольник (его свойство GameScene). Также я изменил метод randomPointWithinRectangle. Если у вас есть дополнительные вопросы, не стесняйтесь спрашивать. Как я уже сказал, это работает на моей стороне, но на основе вашей версии Swift (если вы в курсе последних событий) вам, вероятно, придется немного изменить код. – Whirlwind

+0

@MattB Код от touchsMoved, который я использую для перемещения прямоугольника, умышленно оставлен, потому что он не имеет отношения к вашему исходному вопросу. – Whirlwind