获取节点的最后位置

时间:2017-11-23 19:44:16

标签: swift sprite-kit position skshapenode

这是我第三次在这个问题上寻求帮助。 我有一个类BallNode的班级SKShapeNode。在我的代码中,我还有一个功能,从屏幕顶部每隔3秒生成一个球。现在,我想设置一个每1秒定位球位置的功能,因此,如果ball.position.y > 200将消息打印到控制台。

这样做的目的是,如果任何球将在这个位置(而不是它落下),我将调用另一个功能。我试图通过SKActionupdate(_ 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)

}

1 个答案:

答案 0 :(得分:0)

您没有发布您正在使用的整个代码。不知道你是如何产生你的球,层次结构以及你如何移动它们,我不能在这里重现它。

我不确定我是否理解它,但我相信它可能比你正在做的更简单。看看下面的代码是否对你有帮助,我正在使用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)
    }
}