Ios SKPhysicsBody缩放与父级缩放

Ios SKPhysicsBody缩放与父级缩放,ios,sprite-kit,skphysicsbody,Ios,Sprite Kit,Skphysicsbody,我在父节点B中有一个节点a 我在节点B上使用setScale来产生缩放的错觉,但当我这样做时,节点A及其所有兄弟节点都没有预期的物理实体 尽管A看起来越来越小,但它的物理实体保持不变。这会导致古怪的行为 我怎样才能“缩小”并且仍然拥有合理的物理量呢?SKPhysicsBody无法缩放。作为一个黑客,你可以破坏当前的物理体,并在放大或缩小时添加一个较小的物理体,但不幸的是,这不是一个非常有效的解决方案。这个(添加在iOS9中)听起来非常适合你的场景。与更改场景中每个节点的比例相反,您将只更改摄影机

我在父节点B中有一个节点a

我在节点B上使用setScale来产生缩放的错觉,但当我这样做时,节点A及其所有兄弟节点都没有预期的物理实体

尽管A看起来越来越小,但它的物理实体保持不变。这会导致古怪的行为


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

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

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

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

其次,由于
SKCameraNode
是一个节点,因此可以对其应用
SKActions
。要获得缩小效果,您可以执行以下操作:

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

有关更多信息,请查看。

一个简单示例,该示例显示物理实体在缩放其父节点时会适当缩放/行为。轻按可将精灵添加到场景中

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
        }
    }
}
class游戏场景:SKScene{
var toggle=false
var node=SKNode()
覆盖func didMoveToView(视图:SKView){
self.physicsBody=SKPhysicsBody(edgeLoopFromRect:view.frame)
scaleMode=.ResizeFill
view.showsPhysics=true
addChild(节点)
让收缩=SKAction.scaleBy(0.25,持续时间:5)
让grow=SKAction.scaleBy(4.0,持续时间:5)
let action=SKAction.sequence([收缩,增长])
node.runAction(SKAction.repeatActionForever(action))
}
覆盖func touchesBegined(触摸:设置,withEvent事件:UIEvent){
/*当触摸开始时调用*/
用于触摸输入(触摸设置为){
let location=touch.locationInNode(节点)
让sprite=SKSpriteNode(图像名为:“太空船”)
如果(切换){
sprite.physicsBody=SKPhysicsBody(圆环半径:sprite.size.width/2.0)
}
否则{
sprite.physicsBody=SKPhysicsBody(矩形大小:sprite.size)
}
sprite.xScale=0.125
sprite.yScale=0.125
sprite.position=位置
node.addChild(sprite)
toggle=!toggle
}
}
}

如果您使用的是iOS9,您可以使用
SKCameraNode
。是否设置了
view.showsPhysics=true
?这将在节点树中显示物理实体的轮廓。我想您会看到实体的大小确实会随着节点的父节点成比例地变化。如果不是,我建议您发布设置物理体的代码。@0x141E节点可视缩放,但物理体不缩放。@ABakerSmith将此作为答案发布!听起来很有希望,今晚我会试试。看起来SKCameraNode可能会满足我的需要,但事实上,我避免了这样做,因为当缩放发生时,有数百个节点需要调整大小,而且缩放需要频繁发生。@StefanKendall-同意。我没有提到iOS 9摄像头节点功能,因为它仍处于测试阶段,但这可能是解决您的问题的最佳方法。
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
        }
    }
}