SKPhysicsBody缩放与父缩放

时间:2015-07-07 01:37:42

标签: ios sprite-kit skphysicsbody

我在父节点B中有一个节点A.

我在节点B上使用setScale来给出缩放的幻觉,但是当我这样做时,节点A及其所有兄弟节点都没有预期的物理体。

即使A看起来越来越小,它的物理体也保持不变。这会导致古怪的行为。

我怎样才能“缩小”并且仍然有合理的物理?

3 个答案:

答案 0 :(得分:3)

SKPhysicsBody无法缩放。作为一个黑客,你可以摧毁当前的物理体,并在你向上或向下扩展时添加一个较小的物理体,但不幸的是,这不是一个非常有效的解决方案。

答案 1 :(得分:2)

SKCameraNode(在iOS9中添加)听起来非常适合您的场景。与更改场景中每个节点的比例相反,您只会更改摄像机节点的比例。

首先,您需要在场景的层次结构中添加SKCameraNode(这也可以在Sprite Kit编辑器中完成)。

override func didMoveToView(view: SKView) {
    super.didMoveToView(view)

    let camera = SKCameraNode()
    camera.position = CGPoint(x: size.width / 2, y: size.height / 2)
    self.addChild(camera)
    self.camera = camera
}

其次,由于SKCameraNode是一个节点,因此您可以将SKActions应用于该节点。对于缩小效果,您可以这样做:

guard let camera = camera else { return }
let scale = SKAction.scaleBy(2, duration: 5)
camera.runAction(scale)

有关详细信息,请查看WWDC 2015 talk: What's New In Sprite Kit

答案 2 :(得分:1)

一个简单的例子,它表明物理体在缩放其父节点时可以适当地缩放/行为。点击以将精灵添加到场景中。

class GameScene: SKScene {

    var toggle = false
    var node = SKNode()

    override func didMoveToView(view: SKView) {
        self.physicsBody = SKPhysicsBody(edgeLoopFromRect: view.frame)
        scaleMode = .ResizeFill
        view.showsPhysics = true
        addChild(node)
        let shrink = SKAction.scaleBy(0.25, duration: 5)
        let grow = SKAction.scaleBy(4.0, duration: 5)
        let action = SKAction.sequence([shrink,grow])
        node.runAction(SKAction.repeatActionForever(action))
    }

    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
        /* Called when a touch begins */

        for touch in (touches as! Set<UITouch>) {
            let location = touch.locationInNode(node)
            let sprite = SKSpriteNode(imageNamed:"Spaceship")

            if (toggle) {
                sprite.physicsBody = SKPhysicsBody(circleOfRadius: sprite.size.width/2.0)
            }
            else {
                sprite.physicsBody = SKPhysicsBody(rectangleOfSize: sprite.size)
            }

            sprite.xScale = 0.125
            sprite.yScale = 0.125
            sprite.position = location

            node.addChild(sprite)

            toggle = !toggle
        }
    }
}