ios - 在更改 SKSpriteNode 位置的同时更改 SKPhysicsBody

标签 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 时,您会丢失所有涉及您之前的 physicsBody 的物理参数:您可以复制 velocityangularVelocity 或其他可用参数,但这还不够,你永远不会有连续性,因为 SpriteKit 框架(在实际版本上)没有这个选项:动态更改 physicsBody 在游戏中。

您还可以更改节点的比例以修改 physicsBody 但您总是会丢失物理变量,例如由于重力导致的累积速度:发生这种情况是因为 SpriteKit在缩放期间自动更改 physicsBody 以创建其他物体而不保留累积的属性。

所以我的建议是当你触球时创造一种“卡住时间”,当球停止时你可以改变你的 physicsBody

关于ios - 在更改 SKSpriteNode 位置的同时更改 SKPhysicsBody,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42445561/

相关文章:

ios - 以编程方式在 ViewController 中使用 NavigationController

ios - removeFromParent() 在 SpriteKit 中不起作用

ios - 如何从内存中删除子类化的 SKNode?

javascript - 如果使用 jquery/javascript 锁定 iphone,如何提交表单

objective-c - Twitter集成到iOS 4和5 App中

ios - 属性文本 UILabel 在 UICollectionViewCell 中被截断,但在 UITableViewCell 中未被截断

ios - 制作垂直移动背景

ios - 获取的结果 Controller 不会在运行时更新表

swift - Firebase 注销在 Swift 中不起作用

ios - 如何对 JSON 数组进行排序并将其呈现在 UITableView 中