当另一个节点达到某个y值时,如何生成新节点

时间:2015-12-24 16:25:02

标签: swift sprite-kit

我有一个向上移动一条线的圆圈,当该圆圈到达某个y点时,我该如何制作它以便从下方生成另一个节点?

以下是我目前用于填充圆圈的代码,但我无法将其与物理主体一起使用,因为它会生成太多节点并减慢我的应用程序:

   func createCirclesOnLine(line: CGFloat) {
    var currentY : CGFloat = -110
    let maxY = self.size.width * 15
    let spacing : CGFloat = 120
    while currentY < maxY {
                        let circle = SKSpriteNode(imageNamed: "first@2x")

            circle.physicsBody?.dynamic = false

            circle.position = CGPointMake(line,  currentY)


            //circle.physicsBody?.restitution = -900
            circle.size = CGSizeMake(75, 75)
                  // circle.physicsBody = SKPhysicsBody(rectangleOfSize: circle.size)
                    let up = SKAction.moveByX(0, y: 9000, duration: 90)


    circle.runAction(up)

           foregroundNode.addChild(circle)
        currentY += CGFloat((random() % 400) + 70)


    }

如有必要,会发布更多代码。

1 个答案:

答案 0 :(得分:1)

有两种方法可以解决这个问题。一种是简单地检查每个圆圈的位置,看它是否在屏幕上方。您需要对圈子的引用......

class GameScene: SKScene {
    var circles = Array<SKSpriteNode>()
    ...

createCirlcesOnLine功能中,在创建数组时将每个圆圈添加到数组中。

...
self.addChild(circle)
circles.append(circle)

然后,在您的更新方法中,枚举圆圈以查看它们中是否有任何一个位于屏幕顶部。

override func update(currentTime: NSTimeInterval) {
    for circle in circles {
        if circle.position.y > self.size.height + circle.size.height/2 {
            //Send circle back to the bottom using the circle's position property
        }
    }
}

此解决方案可行,但会在每个更新周期中导致大量不必要的检查。

第二个更有效(并且稍微复杂一点)的建议是在屏幕顶部上方添加一个不可见的节点,以拉伸屏幕宽度。当圆圈与圆碰撞时,只需将其移动到屏幕底部即可。研究实现SKPhysicsContactDelegate协议以及需要采取哪些措施才能实现。如果您遇到此解决方案的问题,请针对这些问题发布单独的问题。