在更改SKSpriteNode位置时更改SKPhysicsBody

时间:2017-02-24 18:12:27

标签: ios swift sprite-kit skspritenode skphysicsbody

我的游戏相当简单。这就像使用加速度计的经典迷宫游戏,但用户也可以使用3D Touch改变矩形的大小。

玩家的节点是矩形,由于世界物理学从加速度计获取数据而移动(这里没什么特别的):

motionManager.startAccelerometerUpdates(to: OperationQueue.current!) { (data, error) in
    if let motionData = data{
        self.physicsWorld.gravity = CGVector(dx: motionData.acceleration.x * 7, dy: motionData.acceleration.y * 7)
    }
}

和touchesMoved:

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    if let touch = touches.first{
            let maxForce = touch.maximumPossibleForce
            let force = touch.force

            let forceValue = force/maxForce

            player.size = CGSize(width: 26-forceValue*16, height: 26-forceValue*16)
            player.physicsBody = SKPhysicsBody(rectangleOf: player.size)
    }
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    resetSize()
}

func resetSize(){
    player.size = CGSize(width: 26, height: 26)
}

因此,当我改变播放器的尺寸时,它工作得很好:节点根据设备的方向在屏幕上移动,而在按压时它变小了。问题是physicsBody(我在GameViewController.swift中设置view.showsPhysics = true)总是一样的,所以我添加了player.physicsBody = SKPhysicsBody(rectangleOf: player.size)但现在当我按下屏幕时,播放器的节点调整大小但是它也停止了移动。如何同时更改节点的大小和physicsBody并使其保持运动?

1 个答案:

答案 0 :(得分:1)

当您更改ValidateAntiforgeryKey时,您丢失了以前的physicsBody隐藏的所有物理参数:您可以复制physicsBodyvelocity或其他可用参数,但这还不够,你永远不会有连续性,因为angularVelocity框架(在实际版本上)没有这个选项:在游戏中动态改变SpriteKit

您也可以更改节点的缩放以修改physicsBody但是您总是丢失物理变量,例如由于重力导致的累积速度:这是因为physicsBody自动更改{{1缩放期间创建其他实体而不保留累积的属性。

所以我的建议是当你触球时创造一种“冰冻时间”,当球停止时你可以在那里改变你SpriteKit