我的游戏相当简单。这就像使用加速度计的经典迷宫游戏,但用户也可以使用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并使其保持运动?
答案 0 :(得分:1)
当您更改ValidateAntiforgeryKey
时,您丢失了以前的physicsBody
隐藏的所有物理参数:您可以复制physicsBody
或velocity
或其他可用参数,但这还不够,你永远不会有连续性,因为angularVelocity
框架(在实际版本上)没有这个选项:在游戏中动态改变SpriteKit
。
您也可以更改节点的缩放以修改physicsBody
但是您总是丢失物理变量,例如由于重力导致的累积速度:这是因为physicsBody
自动更改{{1缩放期间创建其他实体而不保留累积的属性。
所以我的建议是当你触球时创造一种“冰冻时间”,当球停止时你可以在那里改变你SpriteKit
。