如何在Swift中从上面的屏幕启动Sprite?

时间:2017-05-15 19:41:19

标签: ios xcode sprite-kit

我正在为Xcode编写iOS游戏,我正试图从屏幕上方启动一个colorSprite,以便进入视野。

然而,我也形成了一个边界,以便没有精灵在视野外反弹......

    let border = SKPhysicsBody(edgeLoopFrom: self.frame)

因此,当我像这样使用Impulse时,colorSprite不会进入视图:

    ball.physicsBody?.applyImpulse(CGVector(dx: -20, dy: -20))

一个可能的解决方案是在精灵进入后激活边框,但我正在制作的游戏要求colorSprites像雨滴一样从顶部不断掉落,但一旦进入视野就会留在边框内。

我希望我能在逻辑上解释它,请问解决方案是什么?

1 个答案:

答案 0 :(得分:0)

将顶部边框设为与其他边框不同的类别:

let borderCategory:     UInt32 = 1 << 0
let topBorderCategory:       UInt32 = 1 << 1

然后,在update()中,迭代所有精灵,如果它们向下移动,请阻止它们与顶部边界碰撞。如果他们向上移动,请让他们碰撞:

enumerateChildNodes(withName: "//*") { node, _ in
    if let sprite = node as? SKSpriteNode {

        if (sprite.physicsBody?.velocity.dy)! > CGFloat(0) {
            sprite.physicsBody?.collisionBitMask &= ~self.topBorderCategory
        }

        if (sprite.physicsBody?.velocity.dy)! <= CGFloat(0) {
            sprite.physicsBody?.collisionBitMask |= self.topBorderCategory
        }
    }
}

现在你实际上有一个单向边界。

P.S。这不是在update()中更好地实现,而是作为physicsBody velocity属性的属性观察者实现,但我无法实现这一点。