Получить последнюю позицию узла

Третий раз обращаюсь за помощью в этом вопросе. У меня есть имя класса BallNode вида SKShapeNode. Внутри моего кода у меня также есть функция создания шара каждые 3 секунды с верхней стороны экрана. Теперь я хочу установить функцию, которая определяет положение мяча каждую 1 секунду, и поэтому, если ball.position.y > 200, чтобы вывести сообщение на консоль.

Цель этого состоит в том, что если какой-либо мяч окажется в этой позиции (не во время его падения), я вызову другую функцию. Я пытался сделать это через SKAction, update(_ currentTime: CFTimeInterval), Timer, но у меня ничего не получилось, и я действительно понятия не имею, что делать...

обновить - мой текущий код:

var timeType1: CFTimeInterval = 0.0
var timeType2: CFTimeInterval = 2.0

override func update(_ currentTime: CFTimeInterval) {

    if (currentTime - timeType1 > timeType2){
        print("time")
        self.checkBallsPosition()
        self.timeType1 = currentTime
    }
    self.enumerateChildNodes(withName: "color.BallNode") { node, _ in
        self.checkBallsPosition()
    }
}

    func checkBallsPosition() {
    self.enumerateChildNodes(withName: "BALL") { (node: SKNode, nil) in
        let x = self.createTopBorder()
        x.isHidden = true
        let wait2 = SKAction.wait(forDuration: 1)
        let action2 = SKAction.run {
        let position = Double(node.position.y)
        if position < 200 {

        }
        else if position > 200 {
            print("bolbo")
            node.removeFromParent()
        }
        }
        self.run(SKAction.sequence([wait2,action2]))

        }
}

это то, что я пытаюсь делать до сих пор, как я уже сказал, проблема в том, что я хочу получить мяч последней позиции. поскольку мяч падает на экран, последняя позиция должна быть, когда он касается нижней границы экрана или когда он касается другого мяча. если я установлю его на update, я буду получать положение мяча каждый кадр или (как я) каждую секунду, но не последний. другая проблема заключается в том, что положение мяча всегда может измениться в зависимости от других шаров (когда происходит столкновение).

обновление №2 - другие функции:

    func spawnBalls() {
    let wait = SKAction.wait(forDuration: 3)
    let action = SKAction.run {
        self.createBall()
    }
    run(SKAction.repeatForever((SKAction.sequence([wait, action]))))
}

func createBall(){
    let ball = BallNode(radius: 65)
    print(ball.Name)
    print(ball._subName!)

    ball.position.y = ((frame.size.height) - 200)
    let ballXPosition = arc4random_uniform(UInt32(frame.size.width))
    ball.position.x = CGFloat(ballXPosition)
    ball.physicsBody?.categoryBitMask = PhysicsCategory.ball
    ball.physicsBody?.collisionBitMask = PhysicsCategory.ball
    ball.physicsBody?.contactTestBitMask = PhysicsCategory.topBorder
    ball.delegate = self
    addChild(ball)

}

person omerc    schedule 23.11.2017    source источник
comment
Опубликуйте свой код, чтобы мы могли увидеть, что происходит не так, вы сможете легко проверить это в update   -  person Pietro Pepe    schedule 26.11.2017
comment
просто обновите мой вопрос, можете ли вы помочь мне решить его?   -  person omerc    schedule 26.11.2017


Ответы (1)


Вы не опубликовали весь код, который используете. Не зная, как вы создаете свои шары, как устроена иерархия и как вы их перемещаете, я не могу воспроизвести это здесь.

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

private let ballSpeed : CGFloat = 400
private let ballRadius : CGFloat = 10

private func spawnBall(atPoint pos : CGPoint){
    let b = SKShapeNode(circleOfRadius: ballRadius)
    b.name = "ball"
    b.position = pos
    addChild(b)
    b.run(SKAction.moveTo(y: -size.height, duration: TimeInterval((pos.y+size.height)/400)))
}

override func update(_ currentTime: TimeInterval) {
    super.update(currentTime)
    enumerateChildNodes(withName: "ball") { (node, _) in
        if node.position.y < 0 {
            node.removeFromParent()
        }
    }
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches{
        let pos = touch.location(in: self)
        spawnBall(atPoint: pos)
    }
}
person Pietro Pepe    schedule 26.11.2017
comment
это не то, что я ищу ... в вашем коде каждый раз, когда мяч опускается ниже 0, он удаляется со сцены. что я хочу сделать, так это то, что каждый раз, когда мяч находится в положении y > 400, на экране будет появляться новый узел. проблема в том, что шарики падают вниз, что означает, что каждый упавший шарик (и до того, как он закончит свое падение - касаясь дна или другого шарика) будет появляться этот узел. Я хочу, чтобы этот узел появлялся только после того, как шар закончит свои физические свойства, и его позиция по-прежнему будет y › 500. В вашем коде это будет происходить при каждом спауне шара без получения его последней позиции. - person omerc; 27.11.2017
comment
просто обновите мой вопрос, чтобы он включал мои функции createBall и spawnBall.. взгляните и, возможно, вы лучше поймете мой вопрос... - person omerc; 27.11.2017
comment
привет, @PietroPepe - есть идеи? - person omerc; 27.11.2017
comment
Привет, твой текст не понятен. только после того, как мяч закончит свои физические свойства. Что вы подразумеваете под завершением его физических свойств? - person Pietro Pepe; 28.11.2017
comment
Итак, вы хотите, чтобы для каждого шара создавался новый только при первом взаимодействии с чем-либо (нижняя граница или другой шар)? - person Pietro Pepe; 28.11.2017
comment
Мне может потребоваться некоторое время, чтобы ответить на то, что вы скажете дальше, поэтому я уже дам вам предложение, если все, что вам нужно сейчас, это определить последнюю позицию взаимодействия: - Создайте в классе BallNode переменную lastPosition. - Обнаружение контакта между шарами и границей с помощью SKPhysicsContactDelegate и функции обратного вызова didBegin. Вот когда вы должны установить значение lastPosition. - person Pietro Pepe; 28.11.2017
comment
извините, немного не то, что я имею в виду. предполагается, что это игра, в которой игрок должен взорвать упавшие шары. игра окончена, когда мяч коснется верхней границы экрана. Я хочу определить последнюю позицию каждого мяча, чтобы я мог предупредить пользователя, когда мячи слишком близко к верхней границе. надеюсь, теперь это более ясно, так что вы можете помочь мне лучше :) - person omerc; 28.11.2017