我有一个非常简单的游戏。这就像使用加速度计的经典迷宫游戏,但用户还可以使用 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
的物理参数:您可以复制 velocity
或 angularVelocity
或其他可用参数,但这还不够,你永远不会有连续性,因为 SpriteKit
框架(在实际版本上)没有这个选项:动态更改 physicsBody
在游戏中。
您还可以更改节点的比例以修改 physicsBody
但您总是会丢失物理变量,例如由于重力导致的累积速度:发生这种情况是因为 SpriteKit
在缩放期间自动更改 physicsBody
以创建其他物体而不保留累积的属性。
所以我的建议是当你触球时创造一种“卡住时间”,当球停止时你可以改变你的 physicsBody
。
关于ios - 在更改 SKSpriteNode 位置的同时更改 SKPhysicsBody,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42445561/